Scribble at 2022-08-15 13:08:45 Last modified: 2022-08-15 13:12:01

さきほど、僕が運用している受託案件のウェブ・サーバなどを定期的なスケジュールで確認していたら、SSL サーバ証明書の更新ができていない事例があった。サーバの用途は、SAKURA のクラウドで立ち上げたインスタンスへ Kusanagi を入れて WordPress のサイトを運営している。ここでたった一つの FQDN に SSL サーバ証明書を Let's Encrypt で発行して、cron にて以下のように更新しているのだが、どうもうまくいかないようだ。

01 04 01 * * certbot renew | systemctl restart httpd

これだと、Let's Encrypt のログを見ると "IOError: [Errno 32] Broken pipe" が起きてしまう。もちろん、このジョブは root で設定しているから、パーミッションの問題とは思えない。でも、単純に certbot renew すれば問題なく SSL サーバ証明書は更新できるし、httpd のプロセスも再起動できるのだから、この組み合わせに何か問題があるのだろう。単独で certbot renew でもいいが、サーバの再起動はやっておくべきだろうから、他に変更してみて動作を確かめるなら、以下の3つの案が考えられる。

(1) 1分後に別のジョブとして httpd を再起動する。

(2) | service restart httpd

(3) | httpd -k restart

(2), (3) はパイプを使った後の処理を書き直してみただけだが、念のため(使うコマンドの問題という可能性もある)。あと、1ヵ月ごとに検証するなんて悠長なことはできないので(なぜかは cron くらい使ってれば上記の記述でわかるはず)、検証するあいだだけは3つめの項目を "*/5" とか "*" とかに変更してみるべきだろう。もちろん、そんなインターバルだと certbot を実行しても証明書を実際には更新できないわけだが、"IOError: [Errno 32] Broken pipe" になるかならないかの確認くらいはできるだろう。ということで、下記の記述に変更した。

00 04 * * * certbot renew | httpd -k restart

結果は、もちろん明日にでもこの落書きに追記する。

  1. もっと新しいノート <<
  2. >> もっと古いノート

冒頭に戻る


※ 以下の SNS 共有ボタンは JavaScript を使っておらず、ボタンを押すまでは SNS サイトと全く通信しません。

Twitter Facebook