NginxサーバのインストールとHTTPS対応まで

船井総研デジタルのよもぎたです。

この記事では、[AzureでUbuntu仮想マシンをデプロイする（Webサーバ用途）](https://qiita.com/t_ymgt/items/0c473f73cfe4794a8036)でデプロイした仮想マシンにApacheをインストールしてLet’s EncryptでHTTPSに対応させるところまでご紹介したいと思います。

なお、Let’s EncryptでHTTPSに対応させるには、ドメイン名が必要で、そのドメイン名が仮想マシンのグローバルIPアドレスに名前解決されるよう設定されていることが必要です。
ドメイン名の取得と設定は、お好みのレジストラで行ってください。

ApacheのインストールとHTTPS対応は[こちら](https://qiita.com/t_ymgt/items/2015e0b7d90fb015e9d3)の記事をご覧ください。

# Nginxのインストール

インストールするパッケージは``nginx``です。
```
$ apt show nginx 2>/dev/null
Package: nginx
Version: 1.18.0-6ubuntu14.3
Priority: optional
Section: web
Origin: Ubuntu
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Original-Maintainer: Debian Nginx Maintainers <pkg-nginx-maintainers@alioth-lists.debian.net>
Bugs: https://bugs.launchpad.net/ubuntu/+filebug
Installed-Size: 50.2 kB
Depends: nginx-core (<< 1.18.0-6ubuntu14.3.1~) | nginx-full (<< 1.18.0-6ubuntu14.3.1~) | nginx-light (<< 1.18.0-6ubuntu14.3.1~) | nginx-extras (<< 1.18.0-6ubuntu14.3.1~), nginx-core (>= 1.18.0-6ubuntu14.3) | nginx-full (>= 1.18.0-6ubuntu14.3) | nginx-light (>= 1.18.0-6ubuntu14.3) | nginx-extras (>= 1.18.0-6ubuntu14.3)
Breaks: libnginx-mod-http-lua (<< 1.18.0-6ubuntu5)
Homepage: https://nginx.net
Download-Size: 3882 B
APT-Manual-Installed: yes
APT-Sources: http://azure.archive.ubuntu.com/ubuntu jammy-updates/main amd64 Packages
Description: small, powerful, scalable web/proxy server
 Nginx ("engine X") is a high-performance web and reverse proxy server
 created by Igor Sysoev. It can be used both as a standalone web server
 and as a proxy to reduce the load on back-end HTTP or mail servers.
 .
 This is a dependency package to install either nginx-core (by default),
 nginx-full, nginx-light or nginx-extras.
```

早速インストールします。
```
$ sudo apt install -y nginx
```

インストールすると、TCP80番ポートをNginxがListenしていることが分かります。
```
$ sudo ss -tlnp | grep :80
LISTEN 0      511          0.0.0.0:80        0.0.0.0:*    users:(("nginx",pid=2783,fd=6),("nginx",pid=2780,fd=6))
LISTEN 0      511             [::]:80           [::]:*    users:(("nginx",pid=2783,fd=7),("nginx",pid=2780,fd=7))
$ curl http://127.0.0.1/ 2>/dev/null | grep title
<title>Welcome to nginx!</title>
```

手元のPCのWebブラウザからアクセスしても、Nginxのデフォルトのページが表示されます。
![スクリーンショット 2023-01-09 173810.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2822136/e93202f7-a31c-6868-74e7-bb8e72f4baaa.png)

# HTTPSに対応させる

Let’s EncryptによるHTTPS対応のため、まずはnginxのサーバー名を設定して、Nginxのリロードをします。
```
$ grep server_name /etc/nginx/sites-available/default | grep -v '#'
        server_name www.example.com;
$ sudo systemctl reload nginx
```

つづいてcertbotをインストールします。
```bash
$ sudo apt install -y certbot python3-certbot-nginx
```

インストールしたcertbotで証明書を取得します。途中でいくつか質問に答える必要があります。
```bash
$ sudo certbot --nginx
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Enter email address (used for urgent renewal and security notices)
 (Enter 'c' to cancel): username@exmaple.com

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.3-September-21-2022.pdf. You must
agree in order to register with the ACME server. Do you agree?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: Y

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing, once your first certificate is successfully issued, to
share your email address with the Electronic Frontier Foundation, a founding
partner of the Let's Encrypt project and the non-profit organization that
develops Certbot? We'd like to send you email about our work encrypting the web,
EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: Y or N

Which names would you like to activate HTTPS for?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: example.com
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate numbers separated by commas and/or spaces, or leave input
blank to select all options shown (Enter 'c' to cancel): 1
---snip---
```

ここでNginxがListenしているポートを確認すると、すでにTCP443番もListenしていることが確認できます。
```
$ sudo ss -tlnp | grep nginx
LISTEN 0      511          0.0.0.0:80        0.0.0.0:*    users:(("nginx",pid=3483,fd=6),("nginx",pid=2780,fd=6))
LISTEN 0      511          0.0.0.0:443       0.0.0.0:*    users:(("nginx",pid=3483,fd=12),("nginx",pid=2780,fd=12))
LISTEN 0      511             [::]:80           [::]:*    users:(("nginx",pid=3483,fd=7),("nginx",pid=2780,fd=7))
LISTEN 0      511             [::]:443          [::]:*    users:(("nginx",pid=3483,fd=11),("nginx",pid=2780,fd=11))
```

手元のPCのWebブラウザからHTTPSでアクセスしても、証明書エラーなど起きずにアクセスできます。
![スクリーンショット 2023-01-09 175827.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2822136/a4389fcd-6aec-203f-34d1-4a6eb26bab67.png)

# 証明書の自動更新の設定

証明書の有効期限は3か月です。
![スクリーンショット 2023-01-09 180300.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2822136/654580c6-b8f2-07ed-c62e-ac556f397e97.png)

そこで、2か月ごと、奇数月の毎月1日午前7時に証明書を更新してNginxの設定を再読み込みするように設定します。

具体的には、cronに以下のように仕込みます。
```bash
0 7 1,3,5,7,9,11 * root /usr/bin/certbot renew --webroot-path /var/www/html/ --post-hook "/usr/bin/systemctl reload nginx" > /root/certbot-renew.execlog 2>&1
```

certbotの更新のテストは、次のようにして行えます。
```bash
$ sudo certbot renew --dry-run
Saving debug log to /var/log/letsencrypt/letsencrypt.log

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/example.com.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Simulating renewal of an existing certificate for tsyk.net

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Congratulations, all simulated renewals succeeded:
  /etc/letsencrypt/live/example.com/fullchain.pem (success)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
```

なお、Nginxのコンテンツは``/var/www/html``に置かれています。

UbuntuにNginxをインストールしてLet’s EncryptでHTTPSに対応させるところまでご紹介しました。

[AzureでUbuntu仮想マシンをデプロイする記事](https://qiita.com/t_ymgt/items/0c473f73cfe4794a8036)と[UbuntuにApacheをインストールしてHTTPSに対応させる記事](https://qiita.com/t_ymgt/items/2015e0b7d90fb015e9d3)もよろしくお願いします。

最後までお読みいただきありがとうございました。