Nginx, Gunicorn, Djangoで複数サイトを動かすときの設定(SSL対応)

# すでに1つのサイトが動いてる状態で、新しく作ったサイトを追加したときの備忘録
ここでは、サイト1を`site1.example.com`, サイト2を`site2.example.com`とする。
また、ユーザ名は`ubuntu`, Djangoのプロジェクトフォルダ名は`site1`, `site2`とする。

## 結論
### nginxの設定ファイル(SSL対応済み)

```/etc/nginx/sites-enabled/project.
server{ # サイト1
    listen 443 ssl;
    server_name site1.example.com;

    ssl_certificate /etc/letsencrypt/live/site1.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/site1.example.com/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

    location = /favicon.ico { access_log off; log_not_found off; }
    location /static/ {
        root /home/ubuntu/site1;
    }
    location / {
        include proxy_params;
        proxy_pass http://unix:/run/gunicorn/site1.socket;
    }
}
server{
    if ($host = site1.example.com) {
        return 301 https://$host$request_uri;
    }
    listen 80;
    server_name site1.example.com;
    return 404;
}
server{ # サイト2
    listen 443 ssl;
    server_name site2.example.com;
    ssl_certificate /etc/letsencrypt/live/site2.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/site2.example.com/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

    location = /favicon.ico { access_log off; log_not_found off; }
    location /static/ {
        root /home/ubuntu/site2;
    }
    location /media/ {
        root /home/ubuntu/site2;
    }
    location / {
        include proxy_params;
        proxy_pass http://unix:/run/gunicorn/site2.socket;
        }
}
server{
    if ($host = site2.example.com) {
        return 301 https://$host$request_uri;
    }
    listen 80;
    server_name site2.example.com;
    return 404;
}
```

### Gunicornのservice, socketまわりの設定
```/etc/systemd/system/site1.service
[Unit]
Description=gunicorn daemon
Requires=site1.socket
After=network.target

[Service]
User=ubuntu
Group=www-data
WorkingDirectory=/home/ubuntu/site1
ExecStart=/home/ubuntu/miniconda3/bin/gunicorn --access-logfile - --workers 5 --bind unix:/run/gunicorn/site1.socket site1.wsgi:application

[Install]
WantedBy=multi-user.target
```

```/etc/systemd/system/site1.socket
[Unit]
Description=gunicorn socket

[Socket]
ListenStream=/run/gunicorn/site1.socket

[Install]
WantedBy=sockets.target
```

```/etc/systemd/system/site2.service
[Unit]
Description=gunicorn daemon
Requires=site2.socket
After=network.target

[Service]
User=ubuntu
Group=www-data
WorkingDirectory=/home/ubuntu/site2
ExecStart=/home/ubuntu/miniconda3/bin/gunicorn --access-logfile - --workers 5 --bind unix:/run/gunicorn/site2.socket site2.wsgi:application

[Install]
WantedBy=multi-user.target
```

`service`ファイルと`socket`ファイルが作成できたら以下を実行。

```
$ sudo systemctl start site1.socket
$ sudo systemctl enable site1.socket
$ sudo systemctl start site2.socket
$ sudo systemctl enable site2.socket
```

プロセスが開始できたかどうかを確認する。

```
$ sudo systemctl status site1.socket
$ sudo systemctl status site2.socket
```

### certbot&letsencryptでSSL対応[1]
証明書の発行は以下で実行
（完了すると証明書が置かれてるパスが出てくるのでnginxのファイルに書く）

```
$ sudo certbot certonly --nginx
```
# 参考
[1] [certbot instructions(Nginx on Ubuntu 18.04 LTS)](https://certbot.eff.org/lets-encrypt/ubuntubionic-nginx.html)