web-dev-qa-db-ja.com

大きなファイルのアップロード時にバックエンドが401を送信すると、Apache 2.4が502エラーを送信する

Apache 2.4.25(Windows)およびバックエンドサーバーTomcat 8(Windows)の使用。

Apacheを介してTomcatにプロキシされる認証済みセッションでHTTPSを使用してファイルをアップロードするクライアントソフトウェアがいくつかあります。ただし、認証されたセッションが使用されない(またはセッションがタイムアウトになる)場合、バックエンドのTomcatサーバーはHTTP 401応答を送信します。ただし、Apacheは代わりにクライアントに502エラーを返します。

Tomcatアクセスログ:

127.0.0.1 - - [21/Apr/2017:18:30:38 +0000] "POST /upload/10507.wav HTTP/1.1" 401 39

Apacheアクセスログ:

10.8.21.23 - - [21/Apr/2017:18:30:27 +0000] "POST /upload/10507.wav HTTP/1.1" 502 232 14030

Apacheエラーログ:

[Fri Apr 21 18:30:39.770715 2017] [proxy:error] [pid 33652:tid 120896] (OS 10053)An established connection was aborted by the software in your Host machine.  : [client 10.8.21.23:62863] AH01084: pass request body failed to 127.0.0.1:8888 (127.0.0.1)
[Fri Apr 21 18:30:39.770715 2017] [proxy_http:error] [pid 33652:tid 120896] [client 10.8.21.23:62863] AH01097: pass request body failed to 127.0.0.1:8888 (127.0.0.1) from 10.8.21.23 ()

この質問には、次のケースとバグに似た症状がありますが、ログに異なるエラーがあります。

次の環境変数のさまざまな組み合わせを試してみましたが、うまくいきませんでした。

  • SetEnv force-proxy-request-1.0 1
  • SetEnvプロキシノーキープアライブ1
  • SetEnv proxy-initial-not-pooled 1
  • RequestHeaderの設定が解除されます
  • SetEnv proxy-sendcl 1

より小さなボディのリクエストでは、期待どおりに401をプロキシします。より大きな要求(> 1MB程度、ただし一貫性がない)では、代わりに502を送信します。バックエンド処理では、セッションが存在するかどうかを判断する前に本文全体を読み取る必要がないため、ヘッダーを読み取るとすぐに401を起動できます。 10MBを超えるファイルの場合、ローカルバックエンドサーバーにプロキシした場合でも、100%の時間で再生できます。

これは、Apacheが401応答を受信する前にリクエスト全体を完全に読み取っていない場合に発生すると推測されています。これは、「正しい」401応答を渡すのではなく、「プロキシエラー」と見なします。

別のロードバランサー(AWS ELB)を試してみましたが、すべての状況で401が返されるため、502の送信が予想される動作であるとは思えません。

私が試して見逃しているApache環境変数はありますか?これはApacheのバグですか?

4
MJB

修正は、応答が送信される前にTomcatのスワローバイトがある 'maxSwallowSize'のTomcat構成を変更することでした。

https://Tomcat.Apache.org/Tomcat-8.0-doc/config/http.html

maxSwallowSize

中止されたアップロードのためにTomcatによって飲み込まれるリクエスト本文の最大バイト数(転送エンコーディングオーバーヘッドを除く)。アップロードが中止されるのは、Tomcatがリクエストの本文が無視されることを認識しているが、クライアントがまだ送信している場合です。 Tomcatが本文を飲み込まない場合、クライアントは応答を表示する可能性が低くなります。指定しない場合、デフォルトの2097152(2メガバイト)が使用されます。ゼロ未満の値は、制限を強制しないことを示します。

3
bunkowm