502 Bad Gateway エラーの原因と解決法をわかりやすく

Last updated: June 30, 2021

502 エラーの原因

502 エラーの原因は、大きく分けて3つあります。ロードバランサー、Webサーバー、アプリケーションサーバーの3つです。

1つめがロードバランサーのエラーで、例えばAWSで言えばELBのエラーの場合です。これはインフラ側に問題が起きていることが疑われます。

2つ目がnginxなどのWebサーバーで起きている場合です。この場合、よくある原因がポートの指定間違いです。アプリケーションサーバーが動いているのと異なるポートをWebサーバー側で指定しているために、Webサーバー側がエラーを返しているという場合です。

3つ目がアプリケーションサーバーが停止している場合です。もし、アプリケーションサーバーが動いていて、エラーのステータスコードを返している場合、通常は502ではなく、500などの他のステータスコードになります。

502 エラーの解決法

502 エラーの解決法は、ログを見ながらどのパターンによるエラーか、その原因を特定し対処することです。

ログを見ることで、ロードバランサーによるエラーか、Webサーバーによるエラーか、アプリケーションサーバーによるエラーかを特定することができます。

Web サーバーにもアプリケーションサーバーにもログが残っていなかったらロードバランサーによるエラーですし、アプリケーションサーバーにログは残っていないが、Webサーバーの方で502エラーを返しているということであれば、ポートの指定間違いなどのWebサーバーのエラーを疑うべきですし、$ps -ef | grep "python" や、$ps -ef grep "rails" など、アプリケーションフレームワークが動いているか確かめることことなどにより、アプリケーション層が停止しているか確認することができて、停止している場合はそれが原因だと特定することができます。

こうして原因が特定出来たら、それぞれの原因ごとに対処します。ELBなどのロードバランサー側のエラーの場合、インフラの問題である可能性があり、この場合どうしようもできないことがほとんどです。

Webサーバーで問題が起きている場合、設定ファイルを見直し、ポートの設定などにミスがないか確認します。

アプリケーションが停止していた場合は、アプリケーションサーバーのログを見ます。停止した原因を突き止め、bug fix してデプロイします。

これで502エラーは解決できるはずです。

サーバーのヘルスチェックを管理するSlack bot

Slack bot に話しかけるだけでサーバーヘルスチェックの設定が完了し、ステータスエラーの時は@channel でSlack に通知が飛ぶようにできたら便利だと思いませんか?そんな思いからLapis を作りました。無料で試せます。

Add to Slack

"@Lapis set up health check https://..." と話しかければ、ヘルスチェックをセットしてくれます。これでエラーステータスが返ってきたときには自動で@channel に通知が飛ぶので、エラーが起きた時の初動が早くなります。

Lapis の他のヘルスチェックと違うところ

いままでのヘルスチェックはステータスコードのエラーを見るものでしたが、サーバーが重くなっていて、レスポンスが遅くなっているときにも通知を受け取りたいということはないでしょうか?

Lapisはデフォルトで対応しています。例えば"@Lapis notify us when the response time is more than 3 sec." と話しかければ、レスポンスタイムが3秒以上の時にメッセージを受け取ることができます。