2018年2月21日〜2月23日にかけて、どどんとふTRPG.NET第1スーパーロボット大戦WikiTYPE-MOON Wiki等のサービスが停止しました。ご利用のみなさまに大変ご迷惑をおかけしたことをお詫び申し上げます。

この度、上記の問題の再発防止のためのメンテナンスを行ったため、その内容について報告いたします。

概要

上記サービスを提供しているサーバでは、安全・高速な通信を実現するため、電子証明書を使用しています。この電子証明書の期限確認および更新を自動で行うプログラムが応答しなくなったことによって、サービスの提供に必要なプログラムが停止したままとなったため、上記サービスが停止しました。

今回のメンテナンスでは、電子証明書の期限確認・更新プログラムが停止しにくくなるように設定を変更し、問題が再発する可能性を減らしました。

技術的な詳細情報

症状

電子証明書の期限確認・更新のために自動実行していたプログラムcertbotのハングアップにより、HTTPサーバnginxが再起動されず、停止したままとなりました。nginxが停止したため、HTTPリクエストに対して応答不能となり、したがって上記サービスが利用できない状態となりました。

背景・原因

上記サービスを提供しているサーバでは、HTTPSおよびHTTP/2による安全・高速な通信を実現するため、Let’s Encryptより電子証明書を取得しています。この電子証明書の期限確認・更新のため、certbotを自動実行しています。

certbotでの電子証明書の取得・期限確認・更新には、従来から提供されていたstandaloneプラグインを使用していましたが、このプラグインの使用時には、HTTPサーバが停止されている必要があります。そのため、実行前後にはnginxを停止・再起動するように設定していました。

しかし、certbotが電子証明書を取得または更新する際に行うドメイン認証においてタイムアウトが発生し、その後certbotがハングアップしたため、nginxの再起動が行われず、nginxが停止したままとなりました。

手動で実行したところ、standaloneプラグイン使用時には、ドメイン認証のタイムアウトが発生しやすいこと、またその場合に続いてcertbotのハングアップが低確率で発生することを確認しました。そのため、standaloneプラグインの使用を回避する対策が必要であることが分かりました。

対策

対策として、certbotのnginxプラグインを使用して電子証明書の取得・期限確認・更新を行うように設定しました。このnginxプラグインは、nginxを起動したまま必要な設定を追加することで、nginxを停止することなく電子証明書の取得・更新が行えるように設計されています。

電子証明書導入当初は使用例がほとんど見つからなかったため、nginxプラグインの使用を見送っていました。今回調査したところ、以前より普及しており使用例も多く見つかったため、導入することとしました。

今回のメンテナンスでは、どどんとふTRPG.NET第1および各wikiサイト用に電子証明書を取得し直しましたが、nginxプラグインを使用した場合は、ドメイン認証時にタイムアウトが1回も発生せず、すべてのドメインについて1回で電子証明書の取得に成功しました。standaloneプラグイン使用時はドメイン認証の失敗による電子証明書の取得の失敗が頻発していたことから、今回発生した問題は再発しにくくなったものと考えられます。

おわりに

原因となっていた電子証明書の期限確認・更新プログラムが安定して動作するように設定したこと、またこのプログラムの動作時にHTTPサーバを停止しないように設定したことにより、サービス停止の可能性を減らすことができました。

今後、同様の問題が発生した場合、あるいは今回のメンテナンスにより問題が発生した場合は、お手数ですがメール(contact.cre.ne.jp@gmail.com)またはTwitter(@cre_ne_jp)にてご連絡いただければ幸いです。