DjangoをNGINXとgunicornを使って動かすときの流れ整理（自分用メモ）

## はじめに

勉強していて、DjangoをリモートホストにデプロイしたあとのNGINXとgunicronの設定回りがよくわからなくなったので、自分用にメモ

- [やりたいこと](#やりたいこと) 
- [必要な作業の流れ](#必要な作業の流れ)
- [1. NGINXがDjangoサイトを呼び出す用の設定ファイル作成](#1-NGINXがDjangoサイトを呼び出す用の設定ファイル作成)
- [2. Djangoを呼び出す設定ファイルへのシンボリック・リンク作成](#2-Djangoを呼び出す設定ファイルへのシンボリック・リンク作成)
- [3. NGINXとgunicornを再起動](#3-NGINXとgunicornを再起動)

## やりたいこと
Djangoで作ったアプリケーションをクラウド上にデプロイし、静的ファイルを表示するだけなどの軽い処理はウェブサーバー(NGINX)で処理し、Djangoでの動的な処理など重い処理はAPサーバー(gunicron)で行いたい。

まとめると、以下のようなイメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/391281/862e4f67-8cfc-b121-16ea-2c2def9bd282.png)

- nginx
  * 主に静的ファイルを表示するウェブサーバー
  * 自分自身は重たい仕事はしない（ngninxにさせるのはHTMLの表示くらい）
  * ロードバランサー的に振る舞い、重い処理だけgunicornに振る
* gunicorn
  * Djangoを動かすAPサーバー
  * 静的ファイル（HTMLとか）のみ表示する場合には不要なので、Pythonが必要な場合だけ呼び出したい。



## 必要な作業の流れ

上記を実現するためには、以下の作業が必要（Djangoアプリケーションはすでにサーバーにデプロイされてる前提）

1. NGINXがDjangoサイトを呼び出すにあたっての設定ファイルを用意する
    - 設定ファイルは「/etc/nginx/sites-available」フォルダにてきとうな名前でつくる
    - 設定ファイルに書く内容は、「このポートを使うやで」とか
2. 「/etc/nginx/sites-enabled」フォルダに、上記1で作ったファイルへのシンボリック・リンクを張る
   - こうすることで、上記No.1のファイルが無効になったらシンボリック・リンクを切ればよいだけになる
   - シンボリックリンクそもそも何という人は「ショートカットリンクみたいなもんん」と思っとけばおｋ
3. NGINXとgunicronを再起動してアクセスする

## 1. NGINXがDjangoサイトを呼び出す用の設定ファイル作成

　「/etc/nginx/sites-available」に、NGINXが呼び出すウェブサイト（ここではDjangoアプリ）の設定ファイルを追加する。こうすることで、NGINXがそのサイトを呼び出せるようになる。


```sh:/etc/nginx/sites-availableにファイルを追加
cd /etc/nginx/sites-available
sudo vi djangapp
```
この「djangapp」に記載された設定にしたがい、NGINXはDjangoを呼び出す。
次に、作成した設定ファイルに情報を記載する。なお今回NGINXは以下の二つをしたい。
1. 静的ファイルを表示
2. リクエストの情報をdjangapp.sock（gunicornとのソケット用ファイル）に流す


設定ファイルの中身はこんな感じ

```c:etc/nginx/sites-available/djangapp
server {
　　　　 # 設定しているウェブサイトへのリクエストを通すポート
        listen 80;
        # ウェブサイトのIPもしくはドメイン名
        server_name xx.xx.xx.xxx;
        # ファビコンが見つからないというエラーを回避するおまじない
        location = /favicon.ico {access_log off; log_not_found off;}
        ### 以下、リクエストURLとNGINX上のパスとの対応を定義
        # Django静的ファイルへのパスを設定
        location /static/ {
                root /home/ubuntu/djangapp;
                }
        # 管理者用ページのCSSを表示するためのパスを設定
        location /static/admin {
                root /home/ubuntu/venv/lib/python3.6/site-packages/django/contrib/admin/static/admin;
        }
        # リクエストをウェブページに流すためにunixソケットへのパスを設定
        location / {
                # 「/etc/nginx/proxy_params」にプロキシの設定が記載してある
                include proxy_params;
                # djangapp.sockにリクエスト結果を流している
                proxy_pass http://unix:/home/ubuntu/djangapp/djangapp.sock;
        }
}
```


## 2. Djangoを呼び出す設定ファイルへのシンボリック・リンク作成
　さっき作成した「 sites-available/djangapp」は「有効やで」ということを示すために「site-enabled」にシンボリック・リンクを作成する。
　接続を一時的に切りたい場合は、このシンボリック・リンクだけ消せばよい


```sh:シンボリックリンク作成
sudo ln -s /etc/nginx/sites-available/djangapp /etc/nginx/sites-enaled
```
 これで、sites-enabled/djangapp -> sites-available/djangappというシンボリック・リンクを作成した。一応確認。

```sh:シンボリックリンク確認
(venv) ubuntu@ip-172-31-45-165:/etc/nginx/sites-available$ ls -la /etc/nginx/sites-enabled/
total 8
drwxr-xr-x 2 root root 4096 Apr 29 13:26 .
drwxr-xr-x 8 root root 4096 Apr 29 13:27 ..
lrwxrwxrwx 1 root root   34 Apr 29 06:54 default -> /etc/nginx/sites-available/default
# シンボリック・リンクになってる
lrwxrwxrwx 1 root root   36 Apr 29 13:26 djangapp -> /etc/nginx/sites-available/djangapp
```

## 3. NGINXとgunicornを再起動

まずはNGINXがちゃんと動くかテストしてみる

```sh:nginxテスト実行
$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
```
問題なく動いていることを確認。
つづいて、いろいろ再起動

```sh:NGINXを再起動
sudo systemctl restart nginx
```

```sh:gunicornを再起動
 sudo systemctl restart gunicorn
```

あとはURLに接続しておしまい