リバースプロキシサーバーのタイムアウトを回避するには? 502 Bad Gateway エラーの対処法

「リバースプロキシサーバーで、たまに502エラーが出て困っている」
「なにか回避方法はないのか?」
という方に向けた記事です。

リバースプロキシサーバーでの502エラーの事例

Apacheのモジュールである mod_proxy_balancer(公式ドキュメントはこちら)
を使用してリバースプロキシサーバーにてロードバランサーを構築して負荷分散を実現している場合などに、まれにアクセスできなくなって502エラーが返ってくる場合があります

Apacheでのエラーメッセージとしては、
“proxy: error reading status line from remote server”
となります。(競合状態に起因したエラー)

この現象が発生するタイミングとしては、クライアントのリクエストに対して応答を返し終わる前に、オリジナルのサーバー(リバースプロキシによって秘匿されている、実際のコンテンツが置いてあるサーバー)側がコネクションをクローズした場合に起こります。

回避方法としては、下記のようにプロキシの設定ファイルに記述します。

このような形で環境変数をセットすることにより、クライアントからの最初のコネクションにはプールした接続を使用しないようにします。そうすることで、競合状態を起因とした”proxy: error reading status line from remote server”エラーを回避できます。
この競合状態は、プロキシがプールしたコネクションをチェックしたあとで、クライアントから預かったリクエストなどのデータがバックエンドのサーバーに到達する前に、バックエンド側がコネクションをクローズした場合に発生します。

このように、コネクションをプールしない設定にすることで、コネクションプールに起因した502 Bad Gatewayエラーを回避することが可能です。その分、多少サーバーのパフォーマンスが多少落ちるというデメリットがあります。(特にクライアントの環境がHttp/1.0の場合に影響が大きいです)

その他参考:Apacheのモジュール mod_proxy_http の公式ドキュメントはこちら

502エラーを見たらどうすればいい?

「502エラーに対する対処は、こうすればOK」というように1種類の対処法ですべて解決! というわけにはいきません。
なぜなら、同じ502エラーでも、原因が数種類あるからです。
(それぞれの原因によってエラー番号をこまかく分けてほしいですよね)

502エラーの原因としては、
・ブラウザのキャッシュの問題
・サーバー側で問題が起こっている
・ファイアウォールの設定で問題が起こっている
・DNSが変更された
・Webサイトのコードにエラーがある

などがあります。
それぞれの内容や、解決方法について見ていきましょう。

ブラウザのキャッシュの問題

このケースでは、クライアント側で最も簡単に対処が可能です。
ブラウザで開いているページのフォースリロード(強制更新)、またはブラウザのキャッシュクリアにより解決する場合があります。

開いているページのフォースリロード(強制更新)

環境にあわせて、下記の操作をおこなうことでフォースリロード(強制更新)が可能です。

ショートカット
フォースリロード(強制更新)ショートカットキー一覧
・Windows や Linux環境で使用しているブラウザの場合は、CTRL + F5キーを押す
・Safari使用時は、Shiftキーを押しながら、ツールバーの更新ボタンを押す
・Mac環境で使用しているブラウザ(Safari以外)の場合は、Cmd + Shift + Rキーを押す

502エラーの原因がわからない状態でも気軽に試すことができるので、まず上記の手順をやってみることをオススメします。

注意点
フォースリロード(強制更新)は、すべてのキャッシュを無視するわけではありません
対象ページに間接的に読み込まれるデータについては、キャッシュが利用されてしまいます。
ですので、万全を期すのであれば、下記のキャッシュクリアをおこなう必要があります。

ブラウザのキャッシュクリア

各ブラウザの設定画面から、キャッシュをクリアする方法です。

「ブラウザの設定画面のメニューをたどっていくのは手間がかかるので面倒だ」という場合は、下記のショートカットキーで素早くキャッシュクリアの画面を表示できます。

ショートカット
キャッシュクリア画面を表示するショートカット
・Windows環境でのChromeまたはFirefoxの場合は、Ctrl + Shift + Del キー
・Mac環境でのChromeまたはFirefoxの場合は、Cmd + Shift + Del キー

これでキャッシュクリアの画面が表示されます。
実行前に、消去したい項目だけにチェックを入れ、消去したくない項目のチェックは外しておく(消去したくない項目を消さないため)ことに気をつけてください。

デフォルトで消去対象としてチェックがついている項目の中には、履歴やクッキー、ログイン情報および、オフライン作業用データなども含まれている場合があるので、各項目のチェックの有無をよく確認してから実行してください。

502エラーの場合以外にも、キャッシュクリアによってページ表示の乱れなどが解決する場合もありますので、覚えておくと便利です。

ファイアウォールの設定で問題が起こっている場合

ファイアウォールはウェブでの防御壁の役割を果たしてくれる存在です。悪意あるアクセスや、DDoS攻撃から守ってくれます。しかし、まれにコンテンツ配信サーバーからの正常な要求であるにもかかわらず、攻撃的なアクセスだと誤認識してしまい、アクセス拒否がおこなわれた結果、502 Bad Gateway エラーが発生することがあります。

Tips
DDoS攻撃とは:
Distributed Denial of Service attackのこと。
日本語では、分散型サービス妨害攻撃または、分散型サービス拒否攻撃と呼ばれる。
(「分散型サービス」を妨害する攻撃ではなく、「サービスを妨害する攻撃」を分散型で行うという意味です)

前身としてDoS攻撃(Denial of Service attack)というものがあります。
DoS攻撃は単一IPからサーバーが処理しきれないほどのリクエストを送りつける攻撃です。

対して、進化版といえるDDoS攻撃は、大量のリクエストを送りつける発信元が分散しているのが特徴です。これにより、単一IPのブロックだけでは対処できないのが困りものです。

信頼できる発信元であることがわかっている場合は、ファイアウォールの例外設定で「この相手からのアクセスは遮断しない」というようなルールを適用すればOKです。これにより、502 Bad Gateway エラー を回避できます。

 

DNSが変更された場合

ホストサーバーのリプレースなどで、ウェブサイトのIPアドレスが変わった場合には、それにともないDNSサーバーが変更されます。こうなると、DNSの変更が完全に反映されるまで(数時間~48時間程度かかる場合があります)のあいだは、訪問者に対して 502 Bad Gateway エラーのページが表示されてしまいます。

この場合の解決方法は、DNSの設定が完全に反映されるまで待つだけです。

 

Webサイトのコードにエラーがある場合

ウェブサイト(サーバー側)のコーディングに間違いがある場合に、サーバーは受け取ったアクセス要求に対して正しい応答ができない場合があります。

この場合は問題のコードがどの部分なのかをパッと特定することは難しいですが、丁寧なデバッグプロセスを行うことで問題の部分を見つけることができるでしょう。

Brightdata Proxy Manageはオープンソースなので無料で使えます。設置するときに不安があれば、親切な日本人スタッフに聞いたらいいでしょう。

Brightdataの公式サイト

日本人の担当が確実に着くのは本ブログ経由の方のみになりますので、ご注意ください。こちらのサイトからお申し込みいただければ、間違いなく日本人担当がつきます

あわせて読みたい記事