Let’s Encryptをサーバー停止せずに自動更新っ![Nginx]

追記: 2021-05-19
Nginxの設定は特に変えてませんがcertbotは以下に変更しました。
Let’s Encryptのcertbotで証明書を更新したいっ![Nginx]

前回、(WordPressをLet’s Encryptでhttpsにしたっ!)のエントリーでhttps化はできたんですが、このままだと90日後に証明書が失効してしまうので、自動更新をします。

よくある感じだと、Nginxを停止して、証明書を更新して、Nginxを起動するみたいなパターンがあるんですが、停止しなくても更新できるようなので、ダウンタイム無しで更新してみます。

普通にcertbot-autoを起動すると、こいつがWebサーバーとして80番をリッスンするので、Nginxを起動してるとエラーになるって話ですが、–webrootオプションを指定すると、チェック用のファイルを一時的に置いて、それを確認してOKなら発行みたいな流れになるぽいですね。

certbot用のwebrootの追加

mkdir -p /var/www/certbot/.well-known

ま、場所はどこでもいいんですが、上記のdirを追加しました。

Nginx設定(80番)

httpで公開していた時代のリンクが外部に残っているので、そちらはすべてhttpsにリダイレクトをしつつ、/.well-knownのアクセスだけはhttpで受け取れるようにしておきます。

server {
    listen 80;
    server_name blog.mitsuto.com;

    location /.well-known {
      root /var/www/certbot/;
    }

    location / {
      return 301 https://$host$request_uri;
    }
}

動作確認

/var/lib/certbot-auto certonly --webroot -w /var/www/certbot/ -d blog.mitsuto.com --dry-run --post-hook "/sbin/service nginx reload"

–dry-runのオプションを付けて実行してみます。
–post-hookを指定すると、更新後に特定のコマンドが実行できるようなので、Nginxの再読み込みを指定。

crontabに設定

確認ができたので、crontabに設定します。

本来は90日に1回更新すればいいんですが、とりあえず月1回の更新で設定します。
(毎月1日3時30分に実行)

30 3 1 * * /root/certbot/certbot-auto certonly --webroot -w /var/www/certbot/ -d blog.mitsuto.com --force-renew --post-hook "/sbin/service nginx reload"

–dry-run を外して –force-renew を追加しました。
これで強制的に更新がかかります。
(–force-renewは週に20回制限らしいですのでご注意ください。)

ここまででWordPressのhttps化は完了ということで。
しばらく運用してみて何かあれば追記するかもしれませんがw

参考:Nginx+リバースプロキシ環境でWebサーバを停止させずに Let's Encrypt (Certbot) のSSL証明書を自動更新する – Qiita