![proxytimeout ディレクティブを使用してプロキシとして設定された Apache によって返される HTTP ステータス コード](https://rvso.com/image/1586926/proxytimeout%20%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%86%E3%82%A3%E3%83%96%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%E3%83%97%E3%83%AD%E3%82%AD%E3%82%B7%E3%81%A8%E3%81%97%E3%81%A6%E8%A8%AD%E5%AE%9A%E3%81%95%E3%82%8C%E3%81%9F%20Apache%20%E3%81%AB%E3%82%88%E3%81%A3%E3%81%A6%E8%BF%94%E3%81%95%E3%82%8C%E3%82%8B%20HTTP%20%E3%82%B9%E3%83%86%E3%83%BC%E3%82%BF%E3%82%B9%20%E3%82%B3%E3%83%BC%E3%83%89.png)
プロキシサーバーとして設定され、ディレクティブを持つApacheウェブサーバーの動作について一般的な質問があります。プロキシタイムアウトテスト目的で 1 秒に設定されています。
私のバックエンド (アップストリーム) サーバーは Python 組み込みの HTTP サーバーであり、プロキシ サーバー (上記の Apache) に応答を送信するのに意図的に 1 秒以上待機し、要求を受信してから 3 秒後に応答を送信します。
Apacheの公式ドキュメントによると(https://httpd.apache.org/docs/2.4/mod/mod_proxy.html#プロキシタイムアウト)
プロキシはバックエンドサーバーからの応答を指定された時間だけ待機する必要があります。プロキシタイムアウトディレクティブがあり、応答がない場合は「タイムアウトを返す」必要があります。これは、私の理解では、ステータス コード 504 です。このステータス コードの仕様では次のように述べられているためです。
504 ゲートウェイタイムアウト - サーバーはゲートウェイまたはプロキシとして動作しており、上流サーバーからタイムリーな応答を受信しませんでした。。
ただし、プロキシ サーバーにリクエストを送信すると、プロキシがアップストリーム サーバーから無効な応答を受信したことを示すエラー コード 502 が返されます。
そこで、なぜこのようなことが起こるのかを理解しようとします。アップストリーム サーバーが正常であるのに、なぜステータス コードが 504 ではなく 502 になるのでしょうか。タイムアウトが期限切れになったためにサーバーに応答できないだけなのでしょうか。
Apache のエラー ログには次の内容が正しく表示されます。
[proxy_http:error] [pid 6040] (70007)The timeout specified has expired: [client 192.168.56.1:53331] AH01102: error reading status line from remote server 127.0.0.1:8080"
アップストリームのバックエンド サーバーは BrokenPipeError をスローしますが、これを例外でキャッチしてクラッシュさせないようにしています。したがって、私の知る限り、これはサーバーのせいではなく、1 秒後に接続が閉じられ、送信先がないため、予想される動作です。
おそらく誰かがこの行動の原因とその理由を理解するのを手伝ってくれるでしょうプロキシタイムアウトドキュメントによれば論理的である Apache の 504 が返されないのですか?
前もって感謝します!