NginxにDjangoアプリを設定

サーバー情報

【さくらのVPS】
メモリ:8GB
ストレージ:SSD 400GB
CPU:6コア

OS

CentOS7 x86_64

インストール

Python:
pip:
git:
psql:
PostgreSQL:
Nginx:

3.6.8
9.0.3
1.8.3.1
9.2.24
9.2.24
1.16.1

仮想環境

Django:
Gunicorn:

3.1.4
20.0.4

前項でGunicornとNginx、GunicornとDjangoプロジェクトの関連性を設定したので、最後にNginxとDjangoプロジェクトを連携させます。

そもそもDjangoは静的ファイルの動作が遅いという欠点があるため、その役割をNginxに実施してもらうという前提があります。

※下図ではDjangoプロジェクト内の静的ファイルがNginxに紐づいていることが分かります。

Django+Gunicorn+Nginx

Djangoプロジェクトの「settings.py」の設定時に下記設定を追加しましたが、この【STATIC_ROOT】と【MEDIA_ROOT】をNginxに設定してあげる必要があります。

≪Djanogプロジェクトの「settings.py」で変更した内容≫

STATIC_URL = ‘/static/’ [デフォルトで記載あり]

STATIC_ROOT = ‘/usr/share/nginx/html/static’

MEDIA_URL = ‘/media/’

MEDIA_ROOT = ‘/usr/share/nginx/html/media’

Nginxのもう1つの重要な役割として、Gunicornをsystemctlコマンドに登録する際に生成した「sockファイル」を読み取らせることです。

これを行うことで、Gunicornと連携させ、指定されたDjangoプロジェクトと紐づけすることが出来ます。

1.Nginxの設定ファイルを確認

Nginxの設定ファイルとして次の内容が設定されています。

vi /etc/nginx/nginx.conf

Nginxの既存の設定ファイルの内容を確認してみましょう。

設定している内容が多いような感じもしますが、注目すべきポイントは赤字となっている下記内容です。

include /etc/nginx/conf.d/*.conf;

# For more information on configuration, see:
# * Official English Documentation: http://nginx.org/en/docs/
# * Official Russian Documentation: http://nginx.org/ru/docs/

user ■■■(ユーザー名);
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

events {
 worker_connections 1024;
}

http {
 log_format main ’$remote_addr – $remote_user [$time_local] “$request” ‘
            ‘$status $body_bytes_sent “$http_referer” ‘
            ‘”$http_user_agent” “$http_x_forwarded_for”‘;

 access_log /var/log/nginx/access.log main;

 sendfile       on;
 tcp_nopush      on;
 tcp_nodelay     on;
 keepalive_timeout   65;
 types_hash_max_size 2048;

 include /etc/nginx/mime.types;
 default_type application/octet-stream;

 # Load modular configuration files from the /etc/nginx/conf.d directory.
 # See http://nginx.org/en/docs/ngx_core_module.html#include
 # for more information.
 include /etc/nginx/conf.d/*.conf;

 server {
  listen     80 default_server;
  listen     [::]:80 default_server;
  server_name _;
  root     /usr/share/nginx/html;

  # Load configuration files for the default server block.
  include /etc/nginx/default.d/*.conf;

  location / {
  }

  error_page 404 /404.html;
  location = /404.html {
  }

  error_page 500 502 503 504 /50x.html;
  location = /50x.html {
  }
 }

# Settings for a TLS enabled server.
#
#  server {
#   listen    443 ssl http2 default_server;
#   listen     [::]:443 ssl http2 default_server;
#   server_name _;
#   root     /usr/share/nginx/html;
#
#   ssl_certificate “/etc/pki/nginx/server.crt”;
#   ssl_certificate_key “/etc/pki/nginx/private/server.key”;
#   ssl_session_cache shared:SSL:1m;
#   ssl_session_timeout 10m;
#   ssl_ciphers HIGH:!aNULL:!MD5;
#   ssl_prefer_server_ciphers on;
#
#   # Load configuration files for the default server block.
#   include /etc/nginx/default.d/*.conf;
#
#   location / {
#   }
#
#   error_page 404 /404.html;
#   location = /404.html {
#   }
#
#   error_page 500 502 503 504 /50x.html;
#   location = /50x.html {
#   }
# }

}

include /etc/nginx/conf.d/*.conf;

ワイルドカード(*)が使用されていますが、「conf.d」の中にある設定ファイル「*.conf」をincludeしていることが分かります。

上記の「nginx.conf」を直接変更しても良いのですが、問題が発生すると後々面倒なので、「conf.d」の直下に独自の設定ファイルを作成しましょう。

2.Nginxの"独自"設定ファイルを作成

vi /etc/nginx/conf.d/☆☆☆.conf

独自の設定ファイルを作成します。

☆☆☆:プロジェクト名

server {
 listen 80;
 server_name ▼▼▼(ホスト名);

 location /static {
  alias /usr/share/nginx/html/static;
 }

 location /media {
  alias /usr/share/nginx/html/media;
 }

 location / {
  proxy_pass http://unix:/home/☆☆☆/☆☆☆.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;
 }
}

【static】と【media】をNginxと関連付けさせましょう。

※Djangoプロジェクトの「settings.py」変更時に「python manage.py collectstatic」を実行しているため、Djangoプロジェクトで作成した静的ファイルは全てNginx内の指定ディレクトリ内に作成されるため、上記location設定を実施しておけばNginxで静的ファイルの処理を実施してもらうことが出来ます。

 

またGunicornの「socketファイル」作成時に自動生成される「sockファイル」を”proxy_pass”として登録しておくことで、NginxとDjangoプロジェクトを関連付けさせることが出来ます。

3."独自"設定ファイルのチェックと再読み込み

sudo nginx -t

“独自”設定ファイルの内容が間違っていないかチェックします。

下記表示が出ればOKです。

出ない場合は、記載内容を見直してから再度実施してみて下さい。

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok

nginx: configuration file /etc/nginx/nginx.conf test is successful

sudo systemctl reload nginx

Nginxの再起動を行い、設定内容の反映を行います。