1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Ubuntu22.04 venv仮想環境にgunicornをインストールする

Posted at

概要

リモートのUbuntu22.04のvenv仮想環境にgunicornをインストールします。背景としては今後nginx+gunicorn+Django+DRFでAPIサーバを外部公開したくその検証のためです。

以前作成したDjango+DRFのAPIサーバのvenv仮想環境にインストールして、動作確認します。さらに、nginxとの接続ソケットとsystemdサービスを作成します。

nginxとの接続は、ソケットとHTTPがあるようですが、公式のマニュアルがあり、ネットに情報が多いソケットのほうで進めていきます。

環境
Ubuntu22.04 IP 192.168.88.15
Python 3.10.6
Django 3.2.15

gunicornをインストール

venv仮想環境をアクティブにしてインストールします。

$ cd solution
solution$ source .venv_drf/bin/activate
(.venv_drf) solution$ python -m pip install gunicorn

image.png

gunicorn単体の起動確認

startuprojectで作成したconfigフォルダ内のwsgi.pyを参照させてgunicornを起動させます。
image.png
コマンドはこちらです。

(.venv_drf) solution$ gunicorn --bind 0.0.0.0:8000 config.wsgi

実行すると以下のようになり起動確認できました。
image.png
ブラウザからのアクセスも大丈夫でした。
image.png
アクセスできない場合は、リモートのDjangoにアクセスするときに少しはまったときの解決方法をまとめましたので、ご参考なさってください。

Ctrl+Cで終了できます。
image.png
deactivateで仮想環境を抜けておきます。

nginxからアクセス可能にするためのソケット作成

公式こちらを参考に/etc/systemd/system/にファイルを作成しました。

$ sudo nano /etc/systemd/system/gunicorn.socket
gunicorn.socket
[Unit]
Description=gunicorn socket

[Socket]
ListenStream=/run/gunicorn.sock

[Install]
WantedBy=sockets.target

systemdにサービス登録

ソケットが接続を確立したら処理を開始するようにサービス登録します。/etc/systemd/system/にファイルを作成します。

$ sudo nano /etc/systemd/system/gunicorn.service
gunicorn.service
[Unit]
Description=gunicorn daemon
Requires=gunicorn.socket
After=network.target

[Service]
User=lustm5
Group=www-data
WorkingDirectory=/home/lustm5/solution
ExecStart=/home/lustm5/solution/.venv_drf/bin/gunicorn \
          --access-logfile - \
          --workers 3 \
          --bind unix:/run/gunicorn.sock \
          config.wsgi:application

[Install]
WantedBy=multi-user.target

こちらはフォルダ構成です。参考になるかもしれません。configがstartappです。
image.png

ソケット起動・自動起動有効と確認

このコマンドを入力してソケットを起動、自動起動を有効にします。

$ sudo systemctl start gunicorn.socket
$ sudo systemctl enable gunicorn.socket

シンボリックリンクが作成されるみたいです。
image.png
起動していました。Listen状態でした。
image.png

サービスの起動と確認

サービス登録したgunicorn.serviceが起動しているか確認します。

$ sudo systemctl status gunicorn

設定どおり起動していませんでした。(ソケットが接続を確立したら起動します。)
image.png
ソケットの接続を確立させてみます。

$ curl --unix-socket /run/gunicorn.sock localhost

起動しました。
image.png
ここで少しハマりcode=exited status=3/notimplementedが出ました。原因はgunicorn.serviceのパスが間違っていました。

サーバ再起動して確認

ソケットは自動起動していて、gunicorn.serviceは起動していませんでした。(設定どおり)
image.png
ソケットの接続を確立させると起動しました。(設定どおり)
image.png

さいごに

この状態では、ブラウザからアクセスできないので、次はnginxを設定していきます。

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?