バルーンポケモンが好きな人のブログ

つまらない はなしで あいてをねむらせるのが とくいだぞ

Djangoをgunicornとnginx使って公開するまでの手順

もう完全に備忘録です。

前提条件

djangoのインストールはできていて、ローカル内でアプリの立ち上げはできていることを前提とします。
つまり、以下のことができているという前提で進めます。

cd /home/<username>/myworkspace  # <username>は各々の設定に応じて適時変えてください
django-admin startproject myproject .
python manage.py runserver 0.0.0.0:8000

これで、localhost:8000にアクセスしてサーバが立ち上がっていることを確認できればOK。
とはいえ、djangoについてくるデプロイの機能はシングルスレッドだから大量のアクセスには対応できないし、セキュリティも強固じゃないしということで、公開する場合はgunicornやnginxが必要になってきます。

gunicornのインストール

今回、pipenvを使っていたので、それ前提で進めます。

pipenv install gunicorn

gunicorn経由でサーバを起動

gunicorn --bind 0.0.0.0:8000 myproject.wsgi:application

これで、localhost:8000にアクセスしてサーバが立ち上がっていることを確認できればOK。
外部のサーバを借りている場合は、IPアドレスをそのサーバに合わせてください。

nginxのインストールと連携

nginxをインストールし、これをgunicornと連携させます。

sudo apt install nginx

gunicornの自動起動設定

/etc/systemd/system/gunicorn_app.socket を作成し、以下を貼り付けます。

[Unit]
Description=gunicorn socket

[Socket]
ListenStream=/home/<username>/myworkspace/gunicorn.sock
SocketUser=<username>

[Install]
WantedBy=sockets.target

<username> は各々の設定に応じて適時変えてください。
gunicornでsockファイルを生成し、それをnginxで読み込むことで連携させています。
以下のようにして、/etc/systemd/system/gunicorn_app.service を作成してsystemctlコマンド登録を行います。これにより、gunicornが自動起動するようになります。

[Unit]
Description=Django app service.
Requires=gunicorn_app.socket
After=network.target

[Service]
User=<username>
Group=<groupname>

WorkingDirectory=/home/<username>/myworkspace
PIDFile = /home/<username>/myworkspace/gunicorn.pid

ExecStart=/home/<username>/.pyenv/shims/pipenv run gunicorn \
          --workers 3 \
          --pid /home/<username>/myworkspace/gunicorn.pid \
          --bind unix:/home/<username>/myworkspace/gunicorn.sock \
          myproject.wsgi:application

[Install]
WantedBy=multi-user.target

ファイルの作成が終わったら、gunicornを起動します。

sudo systemctl daemon-reload
sudo systemctl start gunicorn_app.service

/home/<username>/myworkspace/ にgunicorn.sockが生成されていることが確認できればOKです。
次に、このsockファイルをnginxと紐づます。

nginxとの連携

設定ファイルを作成します。hogehogeという名前は各自好きな名前をつけてあげてください。

sudo vim /etc/nginx/conf.d/hogehoge.conf

ファイルの中身は以下のようにします。

server {
  listen 80;
  server_name <server_name>;

 location / {
  proxy_pass http://unix:/home/<username>/myworkspace/gunicorn.sock;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header Host $http_host;
  proxy_redirect off;
  proxy_set_header X-Forwarded-Proto $scheme;
 }
}

proxyまわりの設定は以下の記事を見ると少しわかった気になれます。
一目見て完全理解の境地に至りたいですが、私の頭はそこまで優秀ではなかったようです。まあ、こういうのは経験を重ねていく中で理解が深まっていくものでしょう。

memo.willnet.in

www.fenet.jp

nginxの設定ファイルにミスがないかチェックします。こういうの便利ですね。

sudo nginx -t

nginxの再起動をします。

sudo systemctl reload nginx

適当なブラウザからアクセスできることが確認できればOKです。
なんか上手く動作しない場合は、以下のログファイルなどを見ると解決の糸口が見えてくるかもしれません。

sudo vim /var/log/nginx/error.log

ちなみに、同ディレクトリには access.log もあって、この中にはアクセス履歴が保存されています。

その他

私はさくらのVPSでサーバーを借りて環境を構築しました。管理画面から[パケットフィルタを設定]をクリックし、接続可能ポートの項で、80番ポートを開放することを忘れずにしておきましょう。

ロード時間の短縮も考慮してちゃんとデプロイする上では静的ファイルの処理も必要になります。

私はソフトウェアエンジニアを生業としてご飯を食べている人間ですが、webアプリの構築に明るい人間ではないので間違いであったり抜け漏れがあったりするかもしれません。その点についてはご了承願います。

参考URL

www.digitalocean.com

view-s.co.jp