やったのはほとんど僕ではなくY.H氏なのだけど、同じことでハマる人もいるだろうし、文章化しておきます。
Ubuntu16.04LTS(x86_64)の環境で、Apache(apache2)を使い、Let’s EncryptのSSL証明書を取得して、HTTPSを実現しています。
Let’s Encryptの証明書の期限は短いので、更新処理はcronで日次でやることにしています。
rootのcrontabはこんな感じです(mm,hhには適当な時間を指定します)。
mm hh * * * /usr/bin/letsencrypt –text –apache renew 2>&1 >/dev/null
ところが、毎日ではないのだけど、エラーが出るのですよね。
2018-10-28 10:10:01,111:WARNING:letsencrypt.cli:Attempting to renew cert from XXX produced an unexpected error: The apache plugin is not working; there may be problems with your existing configuration.The error was: NoInstallationError(). Skipping.1 renew failure(s), 0 parse failure(s)
# /usr/bin/letsencrypt –text –apache renew
個人的にはライブラリのパスかなにかの違いかなあ、と思っていましたが、どうもPATHがダメみたいですね。まあcronのソースはありますし、見てみました。
まずpathnames.hに以下のように定義されています。
#ifndef _PATH_DEFPATH# define _PATH_DEFPATH “/usr/bin:/bin”#endif
#if defined(POSIX)setenv(“PATH”, _PATH_DEFPATH, 1);#endif
そういうわけで、とりあえずcronのPATHは”/usr/bin:/bin”みたいです。なぜこういう縛りがあるのでしょう、よく分からないです。
おそらくそんなPATHなので、apachectlか何かを呼ぶのに失敗しているのでは、という推測をされていました。apachectlは/usr/sbinにありますし。要はそこにPATHを通してあげたら良いのでしょう。方法はいくつかありそうですが、crontabの冒頭に書けばいいそうです。それは知らなかった。
というわけでcrontabを以下のようにしておけば良いのです。この件だと/sbinは要らないかも。
PATH=/sbin:/bin:/usr/sbin:/usr/bin
mm hh * * * /usr/bin/letsencrypt –text –apache renew 2>&1 >/dev/null
こんな感じにしておくと、エラーが出ずに動くようになりました。色々と勉強になりました。