概要
リモートの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
gunicorn単体の起動確認
startuprojectで作成したconfigフォルダ内のwsgi.pyを参照させてgunicornを起動させます。
コマンドはこちらです。
(.venv_drf) solution$ gunicorn --bind 0.0.0.0:8000 config.wsgi
実行すると以下のようになり起動確認できました。
ブラウザからのアクセスも大丈夫でした。
アクセスできない場合は、リモートのDjangoにアクセスするときに少しはまったときの解決方法をまとめましたので、ご参考なさってください。
Ctrl+Cで終了できます。
deactivateで仮想環境を抜けておきます。
nginxからアクセス可能にするためのソケット作成
公式とこちらを参考に/etc/systemd/system/にファイルを作成しました。
$ sudo nano /etc/systemd/system/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
[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です。
ソケット起動・自動起動有効と確認
このコマンドを入力してソケットを起動、自動起動を有効にします。
$ sudo systemctl start gunicorn.socket
$ sudo systemctl enable gunicorn.socket
シンボリックリンクが作成されるみたいです。
起動していました。Listen状態でした。
サービスの起動と確認
サービス登録したgunicorn.serviceが起動しているか確認します。
$ sudo systemctl status gunicorn
設定どおり起動していませんでした。(ソケットが接続を確立したら起動します。)
ソケットの接続を確立させてみます。
$ curl --unix-socket /run/gunicorn.sock localhost
起動しました。
ここで少しハマりcode=exited status=3/notimplementedが出ました。原因はgunicorn.serviceのパスが間違っていました。
サーバ再起動して確認
ソケットは自動起動していて、gunicorn.serviceは起動していませんでした。(設定どおり)
ソケットの接続を確立させると起動しました。(設定どおり)
さいごに
この状態では、ブラウザからアクセスできないので、次はnginxを設定していきます。