Djangoの本番環境を構築する [Gunicorn+ Nginx]
CentOSでNginxと「Gunicorn」を使用してDjangoを動作させます。
やること
サブディレクトリ(django)でDjangoプロジェクトを実行します。
前提条件
・仮想環境(venv)を構築済み ※詳細はDjango開発環境の構築とインストールを参照。 リンク先はUbuntuですがCentOSに読み替えて下さい。 「ビルドツール・ライブラリ、pyenv、仮想環境」は必須です。 以下はCentOSでは不要となります。 sudo apt install python3-pip sudo apt install python3-venv |
・仮想環境があるディレクトリ /home/ユーザー名/django/3.2/.venv |
・プロジェクトのパス /home/ユーザー名/django/project |
1. Gunicornのインストールとパスの確認
cd /home/ユーザー名/django/3.2/ source .venv/bin/activate // Gunicornのインストール python -m pip install gunicorn // Gunicornのパスを確認 which gunicorn // MySQL/MariaDBを使う場合 pip install mysqlclient // Pythonパッケージの一覧 pip freeze deactivate
Gunicornのパスは次のようになります。
後でこのパスを使用しますのでメモっておきます。
2. Gunicornの自動起動の設定
Gunicorn用のサービスファイルの作成と自動起動設定です。
2-1. サービスファイルの作成
sudo vi /usr/lib/systemd/system/gunicorn_app.service
[gunicorn_app.service]
[Unit] Description=Django app service. After=network.target [Service] # ユーザー名 User=ユーザー名 # プロジェクトパス WorkingDirectory=/home/ユーザー名/django/project # PID PIDFile=/home/ユーザー名/django/project/gunicorn.pid # 実行 ExecStart=/home/ユーザー名/django/3.2/.venv/bin/gunicorn \ --workers=3 \ --pid /home/ユーザー名/django/project/gunicorn.pid \ --bind unix:/home/ユーザー名/django/project/gunicorn.sock \ project.wsgi # 落ちた場合は自動で再起動 ※systemctl stopは除く Restart=always [Install] WantedBy=multi-user.target
「--workers=3」はワーカーの数でCPUのコア数に合わせると最適化されるそうです。ただし、ワーカー数を増やすと使用メモリが増加します。
環境にもよりますが1=40MB、2=70MB、3=100MB、4=120MBが目安。
「project.wsgi」は「プロジェクト名.wsgi」で実際は「project/project/wsgi.py」のファイルを読み込みます。
gunicornの引数は公式を参考にして下さい。
Commonly Used Arguments (一般的に使用される引数)
2-2. systemctlコマンド
上述のサービス開始、停止、自動起動などの設定方法です。
// デーモンリロード ※必ず実行してください。 sudo systemctl daemon-reload // サービスの開始 sudo systemctl start gunicorn_app // サービスの停止 sudo systemctl stop gunicorn_app // サービスの状態 sudo systemctl status gunicorn_app // サービスのリスタート sudo systemctl restart gunicorn_app // 自動起動の設定(On) sudo systemctl enable gunicorn_app // 自動起動の設定(Off) sudo systemctl disable gunicorn_app // サービスの一覧情報 sudo systemctl list-unit-files
3. Nginxの設定
○○.confの○○は各自の設定ファイル名に読み替えてください。
sudo vi /etc/nginx/conf.d/○○.conf
[○○.conf]
server { ・・・省略・・・ # http://www.example.com/static location /static { alias /home/ユーザー名/django/project/static; } # http://www.example.com/django/ location /django { try_files $uri @gunicorn_app; } location @gunicorn_app { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header Host $http_host; proxy_redirect off; proxy_pass http://gunicorn_app; } } # 以下はserver{}の外側で定義 upstream gunicorn_app { server unix:/home/ユーザー名/django/project/gunicorn.sock; }
設定が完了したのでNginxを再起動します。
sudo systemctl restart nginx
4. urls.py
忘れていけないのが「project/project/urls.py」です。
urlpatterns = [ path('django/lang_types/', include('bbs_langtypes.urls')), path('django/accesses/', include('bbs_accesses.urls')), ]
今回はDjangoプロジェクトをサブディレクトリ(django)に配置するのでurlpatterns[]のpathの先頭に「django」を付与してあげます。
5. 確認する
最後の作業はブラウザでURLにアクセスするだけです。
※settings.pyのALLOWED_HOSTS[]の設定を忘れずに!