502 Bad Gatewayとは何か? 壊れたupstreamの応答
502 Bad Gatewayとは、proxyまたはload balancerがupstreamサーバーへ到達しようとしたものの、無効な応答または応答なしを受け取ったときに返すHTTPエラーです。
502はあなたのアプリケーションから来るのではなく、その前にあるproxyが、backendが適切に応答しなかったと言って返すものです。デプロイはbackendを入れ替えるため、502はrollout中に数秒間よく現れます。これを知っておくと、実はタイミングの問題であるものをアプリケーションのバグとして追いかけずに済みます。
proxyレベルのエラー
reverse proxy、gateway、load balancerは、リクエストをupstreamへ転送し、壊れた、空の、またはパースできない応答を受け取ると502を返します。proxyは健全で、backendが問題です。
一般的な原因
- backendがクラッシュしたか再起動中である。
- 健全なbackendがまだ登録されていない。
- upstreamが予期せずコネクションを閉じた。
デプロイが502をトリガーする理由
rollout中、古いインスタンスがドレインする一方で新しいものが起動します。短い期間、proxyは準備のできていないインスタンスへ転送することがあり、新しいバージョンが完全に処理し始めるまで一時的な502を生じます。
502対503対504
502はupstreamの不正な応答を、503は利用可能なbackendがないことを、504はupstreamがtimeoutしたことを意味します。この区別は、デプロイ中に正しい原因を指し示します。
CIチェックにおける502
トラフィックが移った瞬間に走るデプロイ後のsmoke checkは、一時的な502を捕まえることがあります。検証の前にhealth checkが通るのを待つと、この誤警報を避けられます。
一時的でretry可能
デプロイ期間中の502はほぼ常に一時的で、backendが健全になると解消します。Latchkeyのrunnerはデプロイの検証中に一般的なエンドポイントへの一時的な502をretryするため、rolloutの瞬間的なギャップがステップを失敗させることはありません。
重要なポイント
- 502 Bad Gatewayは、proxyがupstreamのbackendから無効な応答を受け取ったことを意味します。
- backendがドレインして起動するにつれ、デプロイ中に短く急増します。
- デプロイ期間中の502は、持続的なものと違い一時的でretry可能です。