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
サイトが正常に動作するのを確認します。
問題なければ、自動更新が成功することを確認して終了です。
コメント