プロキシが背後のサーバーから無効な応答を受け取りました。
使いどころ
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 / Express | res.status(502).end() |
|---|---|
| Python / Flask | return '', 502 |
| nginx | return 502; |
確認方法
curl -s -o /dev/null -w "%{http_code}\n" https://example.com/