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まわりの設定は以下の記事を見ると少しわかった気になれます。
一目見て完全理解の境地に至りたいですが、私の頭はそこまで優秀ではなかったようです。まあ、こういうのは経験を重ねていく中で理解が深まっていくものでしょう。
nginxの設定ファイルにミスがないかチェックします。こういうの便利ですね。
sudo nginx -t
nginxの再起動をします。
sudo systemctl reload nginx
適当なブラウザからアクセスできることが確認できればOKです。
なんか上手く動作しない場合は、以下のログファイルなどを見ると解決の糸口が見えてくるかもしれません。
sudo vim /var/log/nginx/error.log
ちなみに、同ディレクトリには access.log
もあって、この中にはアクセス履歴が保存されています。
その他
私はさくらのVPSでサーバーを借りて環境を構築しました。管理画面から[パケットフィルタを設定]をクリックし、接続可能ポートの項で、80番ポートを開放することを忘れずにしておきましょう。
ロード時間の短縮も考慮してちゃんとデプロイする上では静的ファイルの処理も必要になります。
私はソフトウェアエンジニアを生業としてご飯を食べている人間ですが、webアプリの構築に明るい人間ではないので間違いであったり抜け漏れがあったりするかもしれません。その点についてはご了承願います。