====== 【Let's Encrypt】ドキュメントルートの問題で自動更新に失敗 ======
Laravel で作ったサイトで、自動更新に失敗しました。\\
まず、サーバのログを確認します。
sudo less /var/log/letsencrypt/letsencrypt.log
すると以下のようなエラーが表示されました。
> YYYY-mm-dd HH:ii:ss :DEBUG:certbot._internal.reporter:Reporting to user: The following errors were reported by the server:
>
> Domain: example.com
> Type: unauthorized
> Detail: Invalid response from https://example.com/.well-known/acme-challenge/FILE_NAME
> ~ 略 ~
> YYYY-mm-dd HH:ii:ss :INFO:certbot._internal.auth_handler:Cleaning up challenges
> YYYY-mm-dd HH:ii:ss :DEBUG:certbot._internal.plugins.webroot:Removing /var/www/example.com/.well-known/acme-challenge/FILE_NAME
上記ログから「.well-known/acme-challenge/FILE_NAME」への https アクセスが失敗したことと、検証に使用した「.well-known/acme-challenge/FILE_NAME」ファイルを削除したことが分かりました。\\
しかし、よくよく削除されたファイルのパスを確認すると、example.com のドキュメントルートではないことに気が付きました。
この時は、まだ Laravel の仕組みがわかっておらず、ドキュメントルートの下に public を指定してシンボリックリンクを貼ってしまっていました。
# /var/www/example.com/public にアクセスしたら laravel の public を参照
ln -s /var/www/laravel_project/public /var/www/example.com/public
そして、ドキュメントルートにアクセスがあったら public にリダイレクトするように .htaccess をわざわざ設置してました。
vi /var/www/example.com/.htaccess
RewriteEngine On
RewriteRule ^(.*)$ public/$1 [QSA,L]
当然、そんな設定を certbot-renew は知る由もないわけで、ドキュメントルート直下である、以下にファイルを作成し、自動更新に失敗してしまっていました。
> /var/www/example.com/.well-known/acme-challenge/FILE_NAME
そこで、シンボリックリンクを一度削除し、貼り直します。
# シンボリックリンク削除
unlink /var/www/example.com/public
# 貼り直し
ln -s /var/www/laravel_project/public /var/www/example.com
サイトが正常に動作するのを確認します。\\
問題なければ、自動更新が成功することを確認して終了です。