502 Bad Gateway

プロキシが背後のサーバーから無効な応答を受け取りました。

使いどころ

nginx やロードバランサーの背後のアプリがクラッシュしたか、不正な応答を返しました。

よくある原因と対処法

nginx、ロードバランサー、Cloudflare などのプロキシが、背後のアプリから有効な応答を得られませんでした。よくある原因は、アプリがクラッシュしているか動いていない、プロキシが想定するのとは別のポートやアドレスで待ち受けている(Docker 内で 0.0.0.0 ではなく 127.0.0.1)、PHP-FPM のソケットのパスやパーミッションの誤り、レスポンスヘッダーが大きすぎる、などです。nginx のエラーログには「connection refused」や「upstream prematurely closed connection」と記録されます。

AWS ALB の背後で断続的に発生する 502 は、keep-alive の競合であることがよくあります。ロードバランサーより先にアプリがアイドル接続を閉じてしまうためで、アプリの keep-alive タイムアウトを ALB の 60 秒のアイドルタイムアウトより長く設定してください。Node.js なら server.keepAliveTimeout = 65000 のようにします。Cloudflare のエラーページには、ブラウザー、Cloudflare、ホストのどこで失敗したかが表示されます。systemd や Kubernetes でのクラッシュループや、dmesg に記録された OOM kill も確認してください。

サーバーエラー (5xx)

5xx はサーバーエラーです。リクエストに問題がなくても、サーバーやその背後の何かが失敗しています。アラートを設定しておく価値があります。

レスポンスでの表示

HTTP/1.1 502 Bad Gateway

返し方

Node.js / Expressres.status(502).end()
Python / Flaskreturn '', 502
nginxreturn 502;

確認方法

curl -s -o /dev/null -w "%{http_code}\n" https://example.com/

HTTP ステータスコードを開く