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

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

CentOSでNginxと「Gunicorn」を使用して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. 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のパスは次のようになります。

/home/ユーザー名/django/3.2/.venv/bin/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[]の設定を忘れずに!

参考文献

Deploying Gunicorn (公式)





関連記事



公開日:2021年03月07日 最終更新日:2021年03月08日
記事NO:02891