有馬総一郎のブログ

(彼氏の事情)

2021年11月03日 02:19:54 JST - 2 minute read - Linux

ApacheからNginxに乗り換えたのでLet's Encryptでサーバー停止せず自動更新できるようにする

特に変更しないでも大丈夫かな、と思ってcertbot renew --dry-run --webroot-pathするも失敗したので、 Nginx+リバースプロキシ環境でWebサーバを停止させずに Let’s Encrypt (Certbot) のSSL証明書を自動更新するを参考に、自動更新できるようにした。

WEBルートとなるディレクトリに/.well-known/acme-challenge/を作ってあげればそれで良し!なはずが、例によって嵌る。

まず、test.htmlの生成から失敗。

$ sudo echo "nginx is awesome!" >/var/www/.well-known/test.html
-bash: /var/www/.well-known/test.html: 許可がありません

sudoでリダイレクトをしたいとき - Y’s noteを参考に↓とする。

$ sudo sh -c "echo 'nginx is awesome!'>/var/www/.well-known/test.html"
-bash: !': event not found

docs.oracle.com/cd/E19620-01/805-5837/msgs-266/index.htmlを見ても意味分からんかったが、とりあえずエスケープして解決。

$ sudo sh -c "echo \"nginx is awesome\!\" >/var/www/.well-known/test.html"

そして、http://example.f5.si/.well-known/test.htmlでアクセスして nginx is awesome! が見えたら、とりあえずwebrootの生成、nginxの設定が正しいはずなのだけど、見えない。

これは、location ^~ /.well-knownブロックに追記する設定を

server {
    listen 443 default_server;
    listen [::]:443 default_server;

https(443番port)側に書いていたため。

server {
    listen 80;
    listen [::]:80;
    server_name example.f5.si;

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

とすれば無事見えるようになった。確認が取れたのでtest.htmlを削除する。そして、ルーターのhttp(80番port)を開いておけば、rootユーザーでcertbot renew --dry-run --webroot-path /var/wwwとして、サーバーの稼働中のまま証明書の更新が成功する。