ホーム > カテゴリ > Python・人工知能・Django >

Djangoの本番環境を構築する [uWSGI+ Nginx]

CentOSでNginxと「uWSGI」(ウエスギ/ウィスキー/ウィズギー/ウサギ)を使用してDjangoを動作させます。※読み方のウサギは私が勝手に追加(笑)

やること

サブディレクトリ(django)でDjangoプロジェクトを実行します。

http://www.example.com/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のパスは次のようになります。

/home/ユーザー名/django/3.2/.venv/bin/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が目安。
--moduleDjangoのwsgiファイル(project/project/wsgi.py)
--socketUNIXドメインソケット(同一ホスト内でのプロセス間通信)
--pidfilePID(プロセス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公式)





関連記事



公開日:2021年03月08日
記事NO:02892