nginxで502 Bad Gatewayになる原因
nginxを使っているとちょくちょく502 Bad Gatewayが発生する場面に遭遇します。502 Bad Gatewayはnginxからupstreamへ接続できない/接続中にエラーが発生した場合に発生しますが、その原因は様々です。
ここでいうupstreamとは、nginx本体でHTTPリクエストを処理せずに外部に転送してリクエストを処理する場合の転送先のこととします。具体例をあげると、php-fpmのような外部モジュールのことや(図1)、ReverseProxyとして動作させているなら転送先のバックエンドサーバーのことを指します(図2)。


今回は図1のように1台のサーバーでphpを使ったWebシステムを動作させている環境を想定し、どのような場合に502 Bad Gatewayが発生するかを説明したいと思います。
今までの経験上、502 Bad Gatewayが発生するのは以下のようなケースがあります。
(1) 設定ミス
サーバー設定後やシステム設置後から常に502 Bad Gatewayが出ているなら設定ミスでしょう。
PHPを使うWebアプリケーション環境なら、php-fpmが起動していなかったり、php-fpmへ接続するためのsocketファイルのパスが誤っている可能性があります。nginxをReverseProxyとして使用しているなら、バックエンドサーバーのIPアドレスやポート番号の指定が誤っている可能性があります。firewall設定も含め、バックエンドサーバーに対してネットワークの疎通が取れるかなど、一つ一つ確認していけば解決できます。
このケースは運用開始前に発生するパターンなので、修正に対する時間的な猶予もあり、比較的簡単に解決できるケースです。
(2) アクセス量に対してサーバーの性能/容量が足りていない
今までは正常に動作していたのに、ある時から502 Bad Gatewayが発生/頻発するようになったのなら、サーバーのキャパシティ以上にアクセスが来ていてリクエストを処理しきれていない可能性があります。
phpを使ったWebアプリケーション環境なら、php-fpmの同時接続数が上限に達しており、新しい接続を受け付けられなくなっている可能性があります。この場合、php-fpmのログに以下のようなログが残ります。また、CPU利用率も高く、psコマンドで確認すれば大量のphp-fpmプロセスがみえるはずです。
WARNING: [pool www] server reached pm.max_children setting (50), consider raising it
この場合は複数の観点から対応していきます。
(a) アクセス内容の吟味
どのようなアクセスが来ているかアクセスログを確認します。自然なアクセス増で負荷が上がっていただけなら喜ばしいことだとは思いますが、よくあるのはクローラーからの頻繁なアクセスだったり、DoS攻撃とはいわないまでも海外からの大量のアクセスによって負荷が上がっているケースです。
不正なリクエストが多いのならfirewallやnginxの設定を変更して、アクセスを遮断(*1)して対策します。
(b) Webアプリケーションの処理を確認
リクエストがそれ程大量でもないのに高負荷になっているのなら、Webアプリケーションの作りに問題があり、1リクエストの処理に時間がかかっていることが考えられます。
phpの処理で重い処理がないかや、データベースで重いSQLを実行していないか確認していく必要があります。これは調べるのも修正するのも時間がかかることが多いです。
(c) 設定の見直し
(a),(b)と合わせて同時接続数を増やせないかを検討します。ただし、(a),(b)に問題がある場合は、焼石に水であまり意味がないことが多いですが。
php-fpm環境ならpoolの設定ファイル(例えば/etc/php-fpm.d/www.conf)を変更して同時接続数を増やします。ただし、サーバーの空きメモリ量と相談しながら調整する必要があります。
php-fpmの最大接続数の設定
pm.max_children = 50
この高負荷に対応するケースは、運用中のサイトで発生するので速やかに対応する必要がありますが、調査や対策に時間がかかりがちなケースとなります。
(3) ソフトウェアのバグ
バグが原因でupstreamがsegmentation faultなどで中断した場合にもBad Gatewayになります。
このケースは経験上あまりないのですが、先日、php-fpmがsegmentation faultになり、Bad Gatewayが発生するケースに出くわしました。
原因を調べるのは少し骨が折れますが、回避策が見つかれば比較的早く対応できるケースかと思います。
以上のように502 Bad Gatewayは様々な要因によって発生します。
調査/対策方法も状況に応じては変わるため、対応を単純に手順化することも難しいです。
弊社ではLinuxサーバーに関する保守作業やトラブル対応に関するお問合せもお受けしております。
何かお困りのことがございましたらお気軽にお問い合わせください。
追記
remiリポジトリからインストールしたphp-fpmをNginxから使おうとしたが 502 Bad Gateway になるという方は以下の記事も参照ください。パーミッションの問題かもしれません。
remiリポジトリから入れたphp-fpmをnginxから使う
(*1) アクセスを遮断する際のアクセス元の調べ方/絞り込み方を別記事で追加しました(2019/4/1追記)。
投稿日:2019/03/19 01:40(最終更新:2019/04/01 21:14)