CentOS 7.5でNginxを導入しLet' EncriptでSSLを設定するまで

CentOS 7.5上にNginxをインストールして、Let' EncriptでSSLを設定するまでの手順メモです。
実行環境は以下の通りです。

- CentOS 7.5
- Nginx 1.15.2
- certbot 0.25.1

## 1. 前提条件
ここでは以下のやり方については実施済みであるものとし、説明しません。

- 自分のドメインを取得済みであること
- 外部からTCPポート80番でサーバまで到達可能なこと


## 2. Nginx(Webサーバ)導入
Nginxの[公式サイトのインストール手順](http://nginx.org/en/linux_packages.html)に沿ってインストールを進めることとします。

### (1) リポジトリ情報の設定
Nginxは公式でリポジトリが公開されているので、これをyumで使用できるように設定します。
公式サイト記載の通り、以下内容で新規ファイル「`/etc/yum.repos.d/nginx.repo`」を作成します。

```:/etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/mainline/centos/7/$basearch/
gpgcheck=0
enabled=1
```
3行目のbaseurlをCentOS7用にしています。

### (2) yumでNginxをインストール
リポジトリを設定するとyumで普通にNginxがインストール出来るようになっています。

```bash
# nginxが存在することを確認
yum info nginx
# nginxをインストール
yum install nginx
```

### (3) Nginxの起動設定
Nginxのインストールが完了したら起動します。
またついでに自動起動設定をしておきます。
自動起動設定をしておくと、コンピュータ起動時にNginxが起動するようになります。

```bash
# 起動
systemctl start nginx
# 自動起動on
systemctl enable nginx
```

### (4) firewall設定
外部から接続できるようにfirewallのhttp/https用ポートを開けておきます。

```bash
# http用ポートを開ける
firewall-cmd --add-service=http --zone=public --permanent
# https用ポートを開ける
firewall-cmd --add-service=https --zone=public --permanent
# 設定を反映
firewall-cmd --reload
```

※ここでは説明しませんが、ルータなどのポート開放は等は別途実施しておいてください。

### (5) Nginx接続確認
ここまで実施するとブラウザからNginxに接続できるはずなので、外部から下記にアクセスしてみてください。
http://自分のドメイン名

**Welcome to Nginx!** の画面が表示されれば成功です。

## 3. Let's Encrypt でSSLを設定する
いよいよLet's EncryptでのSSLの設定を行っていきます。
Let's Encrypt は、クライアントソフトウェア「certbot」を使用することで、SSL/TLS サーバ証明書の取得・更新作業を自動化できる仕組みになっています。


### (1) certbotのインストール
certbotの[公式サイト](https://certbot.eff.org/)によるとcertbotのNginxプラグインがあるようなので、ここではこれを使います。
certbotはEPELリポジトリにあるので、EPELリポジトリを先にインストールします。

``` bash
# EPELリポジトリをインストール
yum install epel-release
# certbotのNginxプラグインが存在することを確認
yum info python2-certbot-nginx
# certbotとNginxプラグインをインストール
yum install python2-certbot-nginx
```
※certbotプラグインをインストールすることで、依存関係にあるcertbot本体は自動でインストールされます。


### (2) Nginxにドメイン名を設定
certbotのNginxプラグインは、サーバ証明書取得と同時にNginxの設定も自動で行ってくれるのですが、
それには事前に認証に使用するドメイン名をNginxに設定する必要があるようです。

Nginxの設定ファイルに以下のようにドメイン名を設定します。

```:/etc/nginx/conf.d/default.conf
server {
    server_name  example.com;
・・・
```
※example.comは自分のドメイン名にしてください。


```bash
# Nginx再起動
systemctl restart nginx
```


### (3) certbotでサーバ証明書の取得+Nginxの設定
`certbot`を`--nginx`オプションつけて実行します。
`--nginx`オプションを付けることで、サーバ証明書取得に合わせて取得したサーバ証明書をNginxに設定してくれます。

`certbot`は対話形式で実行されるので、メッセージに従ってメールアドレスの入力などを進めていきます。

``` bash
certbot --nginx
```

最後の方で以下のようなHTTPSのにリダイレクト設定について聞かれるので、ここでは2を選びます。

```
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
```

最後までいったらNginxを再起動して設定を反映します。

```bash
# Nginx再起動
systemctl restart nginx
```


### (4) 接続確認
以上で設定は完了なので、外部からブラウザで下記にアクセスしてみてください。

https://自分のドメイン名

**Welcome to Nginx!** の画面が表示され、アドレスバーに鍵のマークがついていれば成功です。(Chromeの場合)

### (5) 証明書の更新
Let's Encryptで取得したサーバ証明書は有効期限が90日となっています。
そのため、有効期限が切れる前に証明書の更新が必要となります。
証明書の更新にも`certbot`が使えます。

```bash
# サーバ証明書の更新
certbot renew
# Nginxを再起動して反映させる
systemctl restart nginx
```

ここでやり方は記載しませんが、cron等で自動的に更新することもできます。