NEM(NIS1)をNginxでSSL化する


## Nginx と Certbot のインストール

```bash
sudo apt install nginx certbot
```

## バーチャルホストの設定

`/etc/nginx/sites-available`にファイルを作成します。ファイル名は分かりやすいようホスト名にすれば良いかと思います。

```bash
sudo vi /etc/nginx/sites-available/sakia_nis1_harvestasya_com
```

証明書を発行するための 80 ポート待ち受けを作成します。

```sakia_nis1_harvestasya_com
server {
        listen 80;
        server_name sakia.nis1.harvestasya.com;

        root /var/www/html;
        index index.html;

        location ^~ /.well-known/acme-challenge/ {
                root /var/www/tnoce/;
        }

        location = /.well-known/acme-challenge/ {
                return 404;
        }
}
```

何でもいいので、`/var/www/html/index.html`を作成します。

```bash
sudo vi /var/www/html/index.html
```

バーチャルホストを有効化します。

```bash
sudo ln -s /etc/nginx/sites-available/sakia_nis1_harvestasya_com /etc/nginx/sites-enabled
```

nginx の設定ファイルを再読み込みします。

```bash
sudo systemctl reload nginx
```

`/var/www/html/index.html`が表示されるか確認します。

```bash
curl -s http://sakia.nis1.harvestasya.com
```

ポートを開放しておきます。

```bash
sudo ufw allow 80
```

## 証明書の取得

ディレクトリの作成

```bash
sudo mkdir /var/www/tnoce
```

初回はアドレスを登録していないので`--email`オプションを付けてアドレスを設定してください。また、3 回ほど失敗すると数日取得出来なくなるので`--dry-run`を付けて必ず取得出来ることを確認してください。

```bash
sudo certbot certonly --webroot -w /var/www/tnoce -d sakia.nis1.harvestasya.com --email xxxxxxxxxxxxxxx@gmail.com --dry-run
```

`The dry run was successful.`が表示されれば問題ありません。`--dry-run`を外して実際に証明書を取得します。

```bash
sudo certbot certonly --webroot -w /var/www/tnoce -d sakia.nis1.harvestasya.com --email xxxxxxxxxxxxxxx@gmail.com
```

証明書は`/etc/letsencrypt/live`に作成されます。

## バーチャルホストに SSL の設定

```bash
sudo vi /etc/nginx/sites-available/sakia_nis1_harvestasya_com
```

```sakia_nis1_harvestasya_com
server {
        listen 80;
        server_name sakia.nis1.harvestasya.com;

        location / {
                return 404;
        }

        location ^~ /.well-known/acme-challenge/ {
                root /var/www/tnoce/;
        }

        location = /.well-known/acme-challenge/ {
                return 404;
        }
}

server {
        listen 7891 ssl http2;
        server_name sakia.nis1.harvestasya.com;

        proxy_http_version 1.1;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Server $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        location / {
                proxy_pass http://localhost:7890;
        }

        ssl_certificate /etc/letsencrypt/live/sakia.nis1.harvestasya.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/sakia.nis1.harvestasya.com/privkey.pem;
}

map $http_upgrade $connection_upgrade {
        default upgrade;
        ''      close;
}

server {
        listen 7779 ssl http2;
        server_name sakia.nis1.harvestasya.com;

        proxy_http_version 1.1;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Server $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;

        location / {
                proxy_pass http://localhost:7778;
        }

        ssl_certificate /etc/letsencrypt/live/sakia.nis1.harvestasya.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/sakia.nis1.harvestasya.com/privkey.pem;
}
```

nginx の設定ファイルを再読み込みします。

```bash
sudo systemctl reload nginx
```

## ポート開放

```bash
sudo ufw allow 7891
sudo ufw allow 7779
```

## Certbot の renew のタイミングで Nginx を再読み込み

```bash
sudo vi /lib/systemd/system/certbot.service
```

`ExecStart`の末尾に`--post-hook "systemctl reload nginx"`を追加します。

```certbot.service
[Unit]
Description=Certbot
Documentation=file:///usr/share/doc/python-certbot-doc/html/index.html
Documentation=https://certbot.eff.org/docs
[Service]
Type=oneshot
ExecStart=/usr/bin/certbot -q renew --post-hook "systemctl reload nginx"
PrivateTmp=true
```

## 関連記事

https://qiita.com/ccHarvestasya/items/4e1601e5052e41dc1399

https://qiita.com/ccHarvestasya/items/72d947b41570b1c12ff4

https://qiita.com/ccHarvestasya/items/eb74a07e76a4e5e9c902