今まで、Let’s Encryptの証明書の更新、手動で行っていました。
証明書の期限のカレンダーに登録しておいて、期限が近づいたらターミナルを開いてコマンドを打ち込んで…。
このやり方で証明書が切れたことはなかったのですが、流石に忘れるかも、旅行に行ったり病気になったりしてコマンドを打てないかもと考えたら心配になってきました。
そこで今回は重い腰を上げ、Let’s Encryptの証明書の更新を自動化したいと思います。
Rocky Linux環境において、Certbotの standalone(スタンドアロン)モード を使いつつ、Nginxの停止・起動を含めた一連の更新作業を自動化する手順を解説します。
1. 現状の確認:cronではなく「systemd timer」をチェック
以前は cron で自動化するというのをやっていましたが、最近のOS(Rocky LinuxやUbuntuなど)では、Certbotをインストールすると標準で systemd timer という仕組みが組み込まれています。
まずは、自分のサーバーでタイマーが動いているか確認するため以下のコマンドを入力します。
|
1 |
systemctl list-timers | grep certbot |
もし certbot-renew.timer といった項目が表示されれば、すでにシステム側に更新スケジュールが組み込まれています。今回はこの既存のタイマーを活かして設定を進めます。
2. 証明書更新の前後に「Nginxの停止・開始」を組み込む
standalone モードで更新を行っている場合、Certbotが一時的にポート80を使用するため、Nginxが動いたままだとポート競合でエラーになります。
そこで、更新が必要な時だけ自動でNginxを止め、終わったら再開させる 「フック(hook)」 設定を追加します。
設定ファイルの編集: /etc/letsencrypt/renewal/ドメイン名.conf を開き、[renewalparams] セクションの最後に以下の2行を追記します。
|
1 2 3 4 5 |
[renewalparams] # (中略) authenticator = standalone pre_hook = systemctl stop nginx post_hook = systemctl start nginx |
これで、「本当に更新が必要な時だけ」 Nginxが一時停止し、更新完了後に即座に復旧するようになります。
3. 更新時間を深夜の特定時間に固定する
デフォルトのタイマーは実行時間がランダムに設定されていることが多いです。サイトへの影響を最小限にするため、アクセスが少ない深夜帯(例:3時12分)にきっちり実行されるようカスタマイズします。
タイマーの設定を上書き(オーバーライド)します。
|
1 |
sudo systemctl edit certbot-renew.timer |
エディタが開いたら(環境によっては空のファイルが表示されますが、そのまま追記します)、以下の内容を記述して保存します。
|
1 2 3 4 |
[Timer] OnCalendar= OnCalendar=*-*-* 03:12:00 RandomizedDelaySec=0 |
設定の内容について
OnCalendar=(空の設定)
通常、systemdの設定ファイルでは同じ項目を複数書くと「追加」として扱われます。 直前に空のOnCalendar=を書くことで、**それまでに定義されていたスケジュール設定を一度リセット(クリア)**しています。- OnCalendar=*-*-* 03:12:00
具体的な実行タイミングを指定しています。
*-*-*: 「年-月-日」をすべてワイルドカードにすることで、毎日実行することを意味します。03:12:00: 深夜3時12分00秒に実行します。
- RandomizedDelaySec=0
実行時間に「遊び(ランダムな遅延)」を持たせない設定です。
- 通常、複数のサーバーが一斉に処理を始めると負荷が集中するため、数秒〜数分の遅延を入れることがありますが、ここを
0にすることで**「1秒の狂いもなく(可能な限り)03:12:00ちょうどに実行する」**という意思表示になります。
保存後、設定を反映させます。
|
1 |
sudo systemctl daemon-reload |
4. 動作テスト
設定が正しいか、シミュレーションを実行して確認します。
|
1 |
sudo certbot renew --dry-run |
ログに “Congratulations, all simulated renewals succeeded” と表示されれば成功です! 裏側で pre_hook と post_hook が呼び出され、正常にNginxの制御が行われたことになります。
今回の設定を行うことで、以下のメリットがあります。
- 完全自動化: 有効期限を気にしてコマンド打つ必要がなくなります。
- 最小限のダウンタイム: 人がコマンドを打ち込むよりも短い時間で作業が完了します。
- 深夜実行: ユーザーへの影響が少ない時間で、寝ていても証明書が更新されます。
一度設定してしまえば3ヶ月に一度の証明書更新作業から解放されます。これで旅行も入院も思いのままですw
それでもたまには証明書の状況はチェックしましょう。

