Nginxに証明書を適用する(HTTPS通信を行う)方法

### HTTPS通信において、Nginxを経由して、サイトを表示する方法。

### 注意点
下記のページに書いてある設定は完了している状態です。先にご覧ください。

https://qiita.com/Fledgling_engineer/items/c3c01ff8c00e5cd8bd5b

https://qiita.com/Fledgling_engineer/items/1d0780551a8c5fbc823a

https://qiita.com/Fledgling_engineer/items/fc0d82c07c1d72a9b472

###### この記事の目的
現在、上記の記事の設定通りならば、Nginxを経由して、webサイトにアクセス出来る様になっており、証明書も発行・取得出来ています。
ですが、まだ証明書を適用出来ていません。そのため、折角、発行・取得した証明書が宝の持ち腐れになっています。
その為、【**nginxを経由して、webサイトにアクセスしながら、証明書の適用をして、安全な通信(https通信)が出来るようにしよう**❗】と言うのがこの記事の目的です。

### nginx.confの編集

##### 現在のnginx.confの内容は以下の様になっているはずです。
**※FQDNは仮想のドメイン名です。FQDNとポート番号の箇所には貴方が現在使用しているドメイン名、ポート番号を当て嵌めて下さい。**

```
http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
    server {
        listen                  80 default_server;
        listen                  [::]:80 default_server;
        server_name             ドメイン名;
        proxy_redirect          off;
        proxy_set_header        X-Real-IP $remote_addr;
        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header        Host $http_host;
        location / {
        proxy_pass      http://FQDN:サイトなどのポート番号/;
        }
   }
}
```

##### このファイルを以下の様に設定します。
**※FQDNは仮想のドメイン名です。FQDNとポート番号の箇所には貴方が現在使用しているドメイン名、ポート番号を当て嵌めて下さい。**
``` 
http {
   include       /etc/nginx/mime.types;
   default_type  application/octet-stream;

   log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                     '$status $body_bytes_sent "$http_referer" '
                     '"$http_user_agent" "$http_x_forwarded_for"';

   access_log  /var/log/nginx/access.log  main;

   sendfile        on;
   tcp_nopush          on;
   tcp_nodelay         on;
   keepalive_timeout   65;
   types_hash_max_size 2048;

   #gzip  on;

   include /etc/nginx/conf.d/*.conf;
   server {
       listen                  80 default_server;
　　　　listen                  [::]:80 default_server;
       server_name             FQDN;
       return 301 https://$host$request_uri;
       proxy_redirect          off;
       proxy_set_header        X-Real-IP $remote_addr;
       proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
       proxy_set_header        Host $http_host;
       location / {
               proxy_pass      http://FQDN:サイトなどのポート番号/;
       }
   }
   server {
       listen       443 ssl http2 default_server;
       listen       [::]:443 ssl http2 default_server;
       server_name             FQDN;
       ssl_certificate     /etc/letsencrypt/live/FQDN/fullchain.pem;
       ssl_certificate_key /etc/letsencrypt/live/FQDN/privkey.pem;
       proxy_redirect          off;
       proxy_set_header        X-Real-IP $remote_addr;
       proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
       proxy_set_header        X-Forwarded-Proto $scheme;
       proxy_set_header        Host $http_host;
       location / {
               proxy_pass      http://FQDN:サイトなどのポート番号/;
       }
    }
}
```

この設定に変更し終えたら以下のコマンドを叩いて下さい。
``` 
systemctl restart nginx
```
無事にリスタート出来たら、編集完了です。

### 終わりに
**これで、nginxを経由しながらも、HTTPS通信が出来る様になりました。**

もしも、出来ない場合には下記のコマンドを叩いて問題を解決してください。
```
nginx -t
```

### 変更内容まとめ

ここではnginx.conf内の変更箇所、変更内容について自学の為にまとめています。
もしも、何かの役に立てたのなら幸いです。

###### httpブロック[^1]内
`tcp_nopush on;`[^2]のコメントアウトの削除
`tcp_nodelay on;`[^3] `types_hash_max_size 2048;`[^4]の追記

https用の新たなserverブロックの追加


###### serverブロック内
`return 301 https://$host$request_uri;`[^5]の追加


 `listen       443 ssl http2 default_server;`[^6]
 `listen       [::]:443 ssl http2 default_server;`[^7]
 `ssl_certificate     /etc/letsencrypt/live/ドメイン名/fullchain.pem;`[^8]
 `ssl_certificate_key /etc/letsencrypt/live/ドメイン名/privkey.pem;`[^9]
以上の4行の変更及び、追加

[^1]:[]で囲っているため、ここではブロックと名称を付けていますが、恐らく正式の呼称ではありません。

[^2]:`tcp_nopush`：onにすると、レスポンスヘッダとファイルの内容をまとめて送る為、パケット数を減らすことができる。

[^3]:`tcp_nodelay`：onにすると、送信済みデータの応答待ちの状態でも遅延させることなくデータ送信できるようになる。ネットワーク負荷が高くなるのがデメリット。

[^4]:`types_hash_max_size`：最適化に利用するハッシュテーブルのサイズの設定。今回は2048バイトに設定した。

[^5]:`return 301 https://$host$request_uri;`：リダイレクトの設定。http通信を行おうとしても、https通信に切り替わり、保護されたサイトへと誘導される。

[^6]:`listen  443 ssl http2 default_server;`：https通信を行う際に使われる基本的なポート番号が443の為、443を指定している。

[^7]:`listen [::]:443 ssl http2 default_server;`：ipv6で来た場合のlistenポートとデフォルトサーバーの設定。

[^8]:`ssl_certificate /etc/letsencrypt/live/ドメイン名/fullchain.pem;`：fullchain.pemの場所を明記して、参照させる。
`fullchain.pem`：ほとんどのサーバーソフトウェアで使用される証明書ファイル。

[^9]: `ssl_certificate_key /etc/letsencrypt/live/ドメイン名/privkey.pem;`：privkey.pemの場所を明記して、参照させる。
`privkey.pem`：証明書の秘密鍵。