Djangoの本番環境を構築する [uWSGI+ Nginx]
CentOSでNginxと「uWSGI」(ウエスギ/ウィスキー/ウィズギー/ウサギ)を使用して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. uWSGIのインストールとパスの確認
cd /home/ユーザー名/django/3.2/ source .venv/bin/activate // uWSGIのインストール python -m pip install uwsgi // uWSGIのパスを確認 which uwsgi // MySQL/MariaDBを使う場合 pip install mysqlclient // Pythonパッケージの一覧 pip freeze deactivate
uWSGIのパスは次のようになります。
後でこのパスを使用しますのでメモっておきます。
2. uWSGIの自動起動の設定
uWSGI用のサービスファイルの作成と自動起動設定です。
2-1. サービスファイルの作成
sudo vi /usr/lib/systemd/system/uwsgi_app.service
[uwsgi_app.service]
[Unit] Description=Django app service. After=network.target [Service] # ユーザー名 User=ユーザー名 # プロジェクトパス WorkingDirectory=/home/ユーザー名/django/project # uWSGIサービスの停止用 ※必須 KillSignal=SIGQUIT # 実行 ExecStart=/home/ユーザー名/django/3.2/.venv/bin/uwsgi \ --processes=3 \ --module=project.wsgi \ --socket=/home/ユーザー名/django/project/uwsgi.sock \ --pidfile=/home/ユーザー名/django/project/uwsgi.pid \ --home=/home/ユーザー名/django/3.2/.venv \ --master \ --vacuum # 落ちた場合は自動で再起動 ※systemctl stopは除く Restart=always [Install] WantedBy=multi-user.target
uWSGIは「KillSignal=SIGQUIT」がないと「sudo systemctl stop uwsgi_app」でサービスが停止できません。詳しくは公式参照
--processes | ワーカーの数でCPUのコア数に合わせると最適化されるそうです。ただし、ワーカー数を増やすと使用メモリが増加します。環境にもよりますが1=48MB、2=52MB、3=63MB、4=70MBが目安。 |
--module | Djangoのwsgiファイル(project/project/wsgi.py) |
--socket | UNIXドメインソケット(同一ホスト内でのプロセス間通信) |
--pidfile | PID(プロセスID) |
--home | 仮想環境(フルパス) |
--master | マスターモードで実行 |
--vacuum | プロセス終了時にpid/sockファイルを削除する |
その他の引数は次を参考にして下さい。
uWSGIのiniファイルの文法まとめ (Qiita)
2-2. systemctlコマンド
上述のサービス開始、停止、自動起動などの設定方法です。
// デーモンリロード ※必ず実行してください。 sudo systemctl daemon-reload // サービスの開始 sudo systemctl start uwsgi_app // サービスの停止 sudo systemctl stop uwsgi_app // サービスの状態 sudo systemctl status uwsgi_app // サービスのリスタート sudo systemctl restart uwsgi_app // 自動起動の設定(On) sudo systemctl enable uwsgi_app // 自動起動の設定(Off) sudo systemctl disable uwsgi_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 { include uwsgi_params; uwsgi_pass unix:///home/ユーザー名/django/project/uwsgi.sock; } }
uWSGIプロトコル(上記だとuwsgi_params、uwsgi_pass)はNginxが標準でサポートしています。詳しくは公式を参照してください。
これで設定が完了したので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[]の設定を忘れずに!
参考文献
How to use Django with uWSGI (Django公式)
Setting up Django and your web server with uWSGI and nginx (uWSGI公式)