使用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 ()
此问题与以下情况和错误具有类似的症状,但在日志中有一个不同的错误:
我试过以下环境variables的各种组合,但没有运气:
根据小型机构的要求,它可以像预期的那样代理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兆字节)的默认值。 小于零的值表示不应该强制执行任何限制。