読者です 読者をやめる 読者になる 読者になる

モロ屋

アキバではたらくWebエンジニア。JavaScript / AWS / Mac

意外と面倒な「503 Service Temporarily Unavailable」

技術系の小ネタ

先日とある方の家に遊びに行ったのですが、2TBのHDDを20台繋いだメディアサーバーがあり、PS3で録画したアニメどんなのでも見れて快適だよ。と紹介されて震えました。もろやです。

サーバー落ちてる?

「Service Temporarily Unavailable」の文字を見て「サーバー落ちてる」とは誰もが言ったことがあると思います。

今日もこんな話題がTwitterに流れてました。

「初音ミク×Tカード」公式サイトが503エラーで撃沈 - GIGAZINE

503は「アクセスが集中しすぎてサーバーが落ちた(ダウンした)」という意味だと捉えられることが多く、それも間違いではないんですが、正確には「アクセスが集中しすぎてサーバーが落ちそうだから、アクセスを制限している」ことが多いです。

Apacheには過負荷になったら503を返す。という処理はありません。

普通にApache入れてWebサーバーを作るだけでは、503というエラーは滅多に出ないんですね。

503が出るサーバー

だいたいレンタルサーバーです。

1つのサーバーで複数のサイトをホスティングしているので、1ユーザーが設定された負荷を使い切ると、すべての処理をキャンセルして503を返すようになるんですね。

つまりアクセスが集中すると503を返すプログラムは自前で仕込む必要があるので、割と面倒です。

さっきのミクTカードのサイトも以下のように、さくらのレンサバでした。

# nslookup mikut.jp
Address:     172.20.0.11#53

Non-authoritative answer:
Name:     mikut.jp
Address: 219.94.199.23


# nslookup 219.94.199.23
Server:          172.20.0.11
Address:     172.20.0.11#53

Non-authoritative answer:
23.199.94.219.in-addr.arpa     name = 23.199.94.219.static.www406b.sakura.ne.jp.

Authoritative answers can be found from:
199.94.219.in-addr.arpa     nameserver = ns2.dns.ne.jp.
199.94.219.in-addr.arpa     nameserver = ns1.dns.ne.jp.
ns2.dns.ne.jp     internet address = 210.224.172.13
ns1.dns.ne.jp     internet address = 210.188.224.9

503を出すには?

apache で帯域制限をかける(mod_bw モジュールを使ってみた) | レンタルサーバー・自宅サーバー設定・構築のヒント

mod_bwモジュール等を利用します。

最大接続数を制限して、それ以上のアクセスがあった場合に503を返すようにしていることが多いでしょうか。

httpd.confのMaxClientsは503を返さない

勘違いしがちですがhttpd.confで設定するMaxClientsは、503を返すような設定ではありません。

MaxClientsの値はApacheの最大プロセス数であり、MaxClients以上のコネクションが発生するとListenBackLogの数までキューにたまるので、順次処理されます。

あとは、ErrorDocumentディレクティブで503の時の「503 Service Temporarily Unavailable」と出るページを、もう少しわかりやすい日本語のページにしてあげると親切かもしれません。