Ubuntu Server 18.04 LTSとnginxでTLS/SSLサーバーを構築した話

# はじめに
前回はDebianで構築しましたが、今回はUbuntuで構築した話です。
もう、沢山TIPSが出てくるので、参考にして上手く導入できたリンクを紹介しながら、実際のコードを貼り付けていきたいと思います。
今回はnode.jsのlocalhost:3000とポート80をつなぐプロキシサーバーを構築するというものです。

# UbuntuにNginxをインストール
　インストールはLinuxのInstall Packagesを用いて行います。とりあえず、以下のリンクに移動してもらって、少し下に行くと "Ubuntu" と書かれたリンクがあるので、そこをクリックしてください。すると、実行すべきスクリプトが表示されます。
http://nginx.org/en/linux_packages.html#Ubuntu
　基本的には何も考えず、サーバーのコンソールにコピペしていけば、とりあえずインストールできます。

# Nginxの設定ファイルを書き換える。
　お決まりの設定ファイルです。Debianのときとは違い（？）、default.confが既に用意されています。それを編集しましょう。編集するのはproxy_passとかですね。以下に、サンプルを貼り付けるので[]の中を書き換えて使ってください。

/etc/nginx/conf.d/default.conf

```
server {
    listen       80;
    server_name  [サーバーのIPアドレスやドメイン];

    #charset koi8-r;
    #access_log  /var/log/nginx/host.access.log  main;

    location / {
        proxy_pass http://localhost:3000; #必要に応じてここは変えてください
        # root   /usr/share/nginx/html;
        # index  index.html index.htm;
    }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    # error_page   500 502 503 504  /50x.html;
    # location = /50x.html {
    #    root   /usr/share/nginx/html;
    # }

    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    #location ~ \.php$ {
    #    proxy_pass   http://127.0.0.1;
    #}

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    #location ~ \.php$ {
    #    root           html;
    #    fastcgi_pass   127.0.0.1:9000;
    #    fastcgi_index  index.php;
    #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
    #    include        fastcgi_params;
    #}

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    #location ~ /\.ht {
    #    deny  all;
    #}
}

```

# TLS/SSLにする
　前の記事と同様、certbotとlet's encryptを使用して構築します。ここで、注意はさっきの手順でちゃんとnginxが動いていることを確認しましょう。自分が公開したいページが見えてますか？
　確認できたら、以下のページに行ってください。今回は、ubuntu 18.04とNginxを選択してしまっていますが、自分のサーバーに使用しているOSを選択してもらえれば結構です。

https://certbot.eff.org/lets-encrypt/ubuntubionic-nginx

　このURLの先に書いているコードを、何も考えずコンソールにコピペしてください。インストールできます。そして、実行もできます。
　実行の際の指示、不安な方がいらっしゃると思いますので、以下にサンプルを貼っておきます。参考にしてください。

```
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator nginx, Installer nginx
Enter email address (used for urgent renewal and security notices) (Enter 'c' to
cancel): [あなたのメールアドレス]

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server at
https://acme-v02.api.letsencrypt.org/directory
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(A)gree/(C)ancel: A

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing 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

Which names would you like to activate HTTPS for?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: [あなたのTLS/SSLにしたいサーバーのドメイン]
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate numbers separated by commas and/or spaces, or leave input
blank to select all options shown (Enter 'c' to cancel): 1
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for [あなたのTLS/SSLにしたいサーバーのドメイン]
Waiting for verification...
Cleaning up challenges
Deploying Certificate to VirtualHost /etc/nginx/conf.d/default.conf

Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you're confident your site works on HTTPS. You can undo this
change by editing your web server's configuration.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 2
Redirecting all traffic on port 80 to ssl in /etc/nginx/conf.d/default.conf

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Congratulations! You have successfully enabled https://[あなたのTLS/SSLにしたいサーバーのドメイン]

You should test your configuration at:
https://www.ssllabs.com/ssltest/analyze.html?d=[あなたのTLS/SSLにしたいサーバーのドメイン]
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/[あなたのTLS/SSLにしたいサーバーのドメイン]/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/[あなたのTLS/SSLにしたいサーバーのドメイン]/privkey.pem
   Your cert will expire on 2020-06-18. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot again
   with the "certonly" option. To non-interactively renew *all* of
   your certificates, run "certbot renew"
 - Your account credentials have been saved in your Certbot
   configuration directory at /etc/letsencrypt. You should make a
   secure backup of this folder now. This configuration directory will
   also contain certificates and private keys obtained by Certbot so
   making regular backups of this folder is ideal.
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le
```

おめでとうございます。これでhttpsで接続できるようになったはずです。
お使いの環境によっては、反映に１日ぐらいかかると思うので、気長にお待ち下さい。
もしも、サブドメイン、例えばxxx.hacknock.comのようなものにもTLS/SSLしたいときは、同じようにそのサブドメインの接続先になっているサーバー上で同様の手順を行えばTLS/SSL接続を実現できると思います。