Cosnomi
Cosnomi

医療×IT / 医学生 / Web(React, Flask) / 機械学習(画像認識, Keras)

Twitter / GitHub / Keybase

鯖落ちしてても強引に503を返す方法

サーバーを意図的に落とす際、ただ電源を切るのみだとずっと応答を返せず接続元でtimeout errorを引き起こしてしまいます。これは問題になりえます。接続元がtimeoutを適切に処理していればエラー表示のみで問題はないのですが、timeoutを設定していないために応答までいつまでも待機したり、リトライを繰り返すことがあるからです。

例えば、Mastodonのインスタンスは他インスタンスにアクセスできないとリトライのキューに加えていくため、それがどんどんと蓄積してしまいパフォーマンスに深刻な影響を及ぼします。(追記: これは記事執筆当時の仕様です。現在は分かりません。)

サービスが何らかの理由で中断していることを表すステータスコードとして503 Service Unavailableがありますが、サーバーの電源を落としてしまってはこれすら返せません。

どうすればいいのか

503 さえ返せれば、タイムアウトを待たずにそのインスタンスを無視できます。

単純な方法として、VPS を借りてDNSをそちらに書き換えた上でそこから503を返す方法がありますが、このためにわざわざvPSを借りるのは勿体無いと感じます…。より簡単に503エラーを返す方法はないのでしょうか。

調べていると、httpstatusというサイトを見つけました。これは、URLに応じて指定したhttpステータスコードの応答を返してくれるサイトです。https://httpstat.us/503とすれば 503 を返してくれるわけですね。

ここまで出来れば、後はCloudflareであればpage ruleで、このURLへの302リダイレクトを設定すれば良いはずです。

本来は自分で 503 を返すべきですが、それでも応答を全く返さず放置するよりはこういったサービスを借りてでも 503 を返したほうがマシだと思います。

ちなみに、Page Rule は一度登録しておけば、簡単に ON と OFF の切り替えができます。すぐに対応できて便利そうです


コメントフォームは設置していませんので、ご意見・ご感想などはTwitter(@cosnomi)などへお願いします。