DjangoをVPSにデプロイする4〜Nginx編〜

DjangoをVPSにデプロイする3〜PostgreSQL編〜の続きです。

この記事ではVPSにNginxの設定をしていきます。

Djangoは静的ファイルの処理が苦手なのでNginxに任せます。

Nginxはユーザーからリクエストを受けると色々な指示を出してくれるサーバーの入り口のような存在です。

基本設定

nginx.confファイルでNginxのユーザーを「root」に設定します。

nginxのままだと502エラーが返ってきます。

$ vi /etc/nginx/nginx.conf
- user nginx;
+ user root;

includeの確認。

include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;

デフォルトでは「include /etc/nginx/conf.d/*.conf;」が書かれていると思います。

次の接続設定でどちらを利用するか変わるのですが、両方書いていても問題ありません。

「conf.d/*.conf」は、conf.d内の「.conf」ファイルを読み込む。

「sites-enabled/*」は、sites-enabled内のファイルを読み込む。


接続設定

ドメイン(IP)をどのアプリのアドレスとするか設定します。

接続設定の方法は2通りあります。

  1. 一つのファイルで複数のドメインを管理する方法(簡単)
  2. ドメイン毎に管理する方法(少し簡単)

2つとも書く内容は同じです。

ドメイン毎に管理方法は、少し手間な分管理が楽というメリットがあります。

2がオススメですが一応両方書いておきます。

1. 一つのファイルで管理する

上記で書いたように「/etc/nginx/nginx.conf」の中に、「include /etc/nginx/conf.d/*.conf;」という記述があるので「/etc/nginx/conf.d/」の中に「プロジェクト名.conf」を作ることで反映する事ができます。

$ sudo vi /etc/nginx/conf.d/プロジェクト名.conf

内容を次のように書いて下さい。

server {
    listen 80;
    listen [::]:80;
    server_name .example.com;
    
    location /static {
        alias /usr/share/nginx/html/プロジェクト名/static;
    }

    location /media {
        alias /usr/share/nginx/html/プロジェクト名/media;
    }

    location /favicon {
        empty_gif;
        access_log    off;
        log_not_found off;
    }

    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;
    }
}

listen

今はSSL化しないので80番ポートを指定します。(別記事でSSL化します)

listen 80; # IPv4
listen [::]:80; # IPv6

server_name

ドメインを取得済みの場合は、ドメインを記入して下さい。

server_name .example.com; # IPでもOK

www.example.comなど、サブドメインにも対応させたい場合は、ドメインの先頭に「.」を付けることで対応できます。純粋にexample.com www.example.comと2つ書いてもOKです。

location

本番環境で静的ファイルを探しに行く場所を指定します。

まだこのディレクトリは作成していないので後で作ります。

location /static {
        alias /usr/share/nginx/html/プロジェクト名/static;
    }

location /media {
        alias /usr/share/nginx/html/プロジェクト名/media;
    }

proxy_pass

「プロジェクト名.sock」ファイルを指定します。

「.sock」ファイルは、Gunicornの起動時に、manage.pyと同じディレクトリに自動で作成されます。

Djangoアプリをクローンするプロジェクト名のディレクトリもまだ無いので後で作ります。

proxy_pass http://unix:/home/ユーザー名/プロジェクト名/プロジェクト名/プロジェクト名.sock;

2. ドメイン毎に管理する

この方法は「/etc/nginx/sites-available」の中に「プロジェクト名.conf」を作成します。

「/etc/nginx/nginx.conf」「/etc/nginx/sites-available」のどちらに「プロジェクト.conf」を作るかという違いです。

  1. 1つのファイルで管理(/etc/nginx/conf.d/)
  2. ドメイン毎に管理(/etc/nginx/sites-available)

早速「sites-available」の中に「プロジェクト.conf」を作っていきます。

$ sudo vi /etc/nginx/sites-available/プロジェクト名.conf

内容は先程の内容と同じです。

server {
    listen 80;
    listen [::]:80;
    server_name .example.com;
    
    location /static {
        alias /usr/share/nginx/html/プロジェクト名/static;
    }

    location /media {
        alias /usr/share/nginx/html/プロジェクト名/media;
    }

  location /favicon {
        empty_gif;
        access_log    off;
        log_not_found off;
    }

    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;
    }
}

「/etc/nginx/sites-enabled/」にシンボリックリンクを作成します。

この作業が1にはありません。

sudo ln -s /etc/nginx/sites-available/プロジェクト名.conf  /etc/nginx/sites-enabled/プロジェクト名.conf

defaultのシンボリックリンクを削除します。(この作業は初回だけ)

「/sites-enabled/default」は削除することが一般的に勧められています。

$ cd /etc/nginx/sites-enabled/
$ sudo unlink default

Nginxのテスト

Nginxの設定を変更した場合は、ちゃんと設定できているかテストを行っておきましょう。

okとsuccessfulが出ていれば正常です。

$ sudo nginx -t

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

ディレクトリの作成

上記で書いた接続設定でまだ存在しないディレクトリがあるので作成します。

  • /usr/share/nginx/html/プロジェクト名/static
  • /usr/share/nginx/html/プロジェクト名/media
  • /home/ユーザー名/プロジェクト名/

この3つが無いので作成しておきましょう。

$ mkdir /usr/share/nginx/html/プロジェクト名

$ mkdir /usr/share/nginx/html/プロジェクト名/static
$ mkdir /usr/share/nginx/html/プロジェクト名/media

$ mkdir /home/ユーザー名/プロジェクト名

最後のプロジェクト名のディレクトリは、仮想環境(env)とDjangoアプリを入れるディレクトリになります。


これでNginx編は終了です!

次は「DjangoをVPSにデプロイする5〜Djangoの設定編〜」です。