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