当大型file upload时,后端发送401时,Apache 2.4发送502错误

使用Apache 2.4.25(Windows)和后端服务器Tomcat 8(Windows)。

我们有一些客户端软件可以使用HTTPS在通过Apache代理到Tomcat的authentication会话上上传文件。 但是,如果未使用已validation的会话(或会话超时),则后端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 () 

此问题与以下情况和错误具有类似的症状,但在日志中有一个不同的错误:

  • 使用mod_proxy对SOAP服务执行反向代理时出现间歇性错误
  • https://bz.apache.org/bugzilla/show_bug.cgi?id=37770#c88
  • https://bz.apache.org/bugzilla/show_bug.cgi?id=48037

我试过以下环境variables的各种组合,但没有运气:

  • SetEnv force-proxy-request-1.0 1
  • SetEnv proxy-nokeepalive 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环境variables尝试? 这是一个Apache错误?

修复的方法是修改Tomcatconfiguration“maxSwallowSize”,在响应发送之前,Tomcat吞下字节。

https://tomcat.apache.org/tomcat-8.0-doc/config/http.html

maxSwallowSize

将被Tomcat吞下中止上传的请求正文字节的最大数量(不包括传输编码开销)。 当Tomcat知道请求主体将被忽略,但客户端仍然发送时,终止上传是。 如果Tomcat没有吞下身体,客户不太可能看到回应。 如果未指定,将使用2097152(2兆字节)的默认值。 小于零的值表示不应该强制执行任何限制。