サーバーは現在リクエストを処理できません。
使いどころ
メンテナンスまたは過負荷。復旧時期がわかっている場合は Retry-After を含めます。
よくある原因と対処法
サーバーが意図的に、または一時的にリクエストを拒否しています。メンテナンスモード、過負荷、すべてのバックエンドがヘルスチェックに失敗している、あるいはレート制限(nginx の limit_req はデフォルトで 503 を返します)などです。ロードバランサーでは、503 はたいてい登録済みまたは正常なターゲットがないことを意味します。ターゲットのヘルス状態、ヘルスチェックのパスとポート、新しいデプロイがそれに合格しているかを確認してください。Kubernetes の Ingress も、Service に準備完了のエンドポイントがない場合に同じ応答を返します。
計画メンテナンスでは、メンテナンスページを 200 で返すのではなく、Retry-After 付きの 503 を返しましょう。そうすれば検索エンジンがページをインデックスに残します。Google は 1〜2 日程度の 503 なら許容しますが、それより長い停止では URL が削除されることがあります。クライアントはバックオフしながら再試行し、Retry-After に従うべきです。ヘルスチェックは軽く保ち、遅いデータベース 1 つのせいですべてのインスタンスが一斉にローテーションから外れないようにしましょう。
サーバーエラー (5xx)
5xx はサーバーエラーです。リクエストに問題がなくても、サーバーやその背後の何かが失敗しています。アラートを設定しておく価値があります。
レスポンスでの表示
HTTP/1.1 503 Service Unavailable返し方
| Node.js / Express | res.status(503).end() |
|---|---|
| Python / Flask | return '', 503 |
| nginx | return 503; |
確認方法
curl -s -o /dev/null -w "%{http_code}\n" https://example.com/