やったのはほとんど僕ではなく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)
そういう時に、rootで同じコマンドを実行したら、何事もなく終了します。
# /usr/bin/letsencrypt –text –apache renew
letsencryptが適切にログを吐いてくれれば、ズバリな原因が特定できると思いますが、そこまで具合は良くないようです。–verboseというオプションはあるようで、いくらか詳しくは出ます。
個人的にはライブラリのパスかなにかの違いかなあ、と思っていましたが、どうもPATHがダメみたいですね。まあcronのソースはありますし、見てみました。
まずpathnames.hに以下のように定義されています。
#ifndef _PATH_DEFPATH# define _PATH_DEFPATH “/usr/bin:/bin”#endif
そして、cron.cのmainのわりと最初の方に、こんな感じで書いています。
#if defined(POSIX)setenv(“PATH”, _PATH_DEFPATH, 1);#endif
makeするときに-DPOSIXと渡していますので、たぶんこれでPATHが設定されてるんですね。これ以上追いかけていないので、さらに更新されてたらすみません。
そういうわけで、とりあえずcronのPATHは"/usr/bin:/bin"みたいです。なぜこういう縛りがあるのでしょう、よく分からないです。
おそらくそんなPATHなので、apachectlか何かを呼ぶのに失敗しているのでは、という推測をされていました。apachectlは/usr/sbinにありますし。要はそこにPATHを通してあげたら良いのでしょう。方法はいくつかありそうですが、crontabの冒頭に書けばいいそうです。それは知らなかった。
というわけでcrontabを以下のようにしておけば良いのです。この件だと/sbinは要らないかも。
そういうわけで、とりあえず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