mod_proxy 使用 tomcat7 上传文件时出现错误 502

mod_proxy with tomcat7 gives error 502 when uploading files

所以,我在 Debian 服务器上安装了 apache 2.2.16(64 位)。我已经配置了一个代理,用于特定的 url 映射到我的后端 Tomcat 7 服务器。

除多部分 POST 请求外,所有 GET/POST 请求都正常工作。 apache 的错误日志显示以下行:

[error] [client CLIENT_IP] (20014)Internal error: proxy: error reading status line from remote server TOMCAT_IP:8081
[error] [client CLIENT_IP] proxy: Error reading from remote server returned by /svc/document

奇怪的是,如果我上传零 Kb 文件,POST 多部分工作正常,但上传其他文件(不超过几个字节)时失败。一切,包括上传在我的开发环境中工作正常(XAMPP + mod_proxy + tomcat)

Tomcat 7 个连接器:

<Connector port="8081" protocol="HTTP/1.1" address="TOMCAT_IP" maxThreads="6000"
               connectionTimeout="40000" URIEncoding="UTF-8" maxPostSize="8388608" 
               redirectPort="8443" />

代理配置如下:

<VirtualHost *:80>
      DocumentRoot /var/www/frontend/
      ServerName frontend.com

      ProxyPass /svc/ http://[TOMCAT_IP]:8081/web/ connectiontimeout=40 timeout=60 Keepalive=On min=20 acquire=20 retry=1
 </VirtualHost>

我什至尝试了一些建议,如在类似问题上发现的那样,一次又一次,但没有成功:

<VirtualHost *:80>
  DocumentRoot /var/www/frontend/
  ServerName frontend.com

  ProxyPass /svc/ http://[TOMCAT_IP]:8081/web/ connectiontimeout=40 timeout=60 Keepalive=On min=20 acquire=20 retry=1

  ProxyBadHeader Ignore
  ProxyRequests Off
  LimitRequestBody 8388608
  SetEnv proxy-sendchunked 1
</VirtualHost>

我尝试了 ProxyPassReverse、raise timeout、ProxyBadHeader Ignore、setenv proxy-initial-not-pooled 1 等。似乎没有任何效果...有什么想法吗?

我遇到了类似的问题,错误不在 "Apache"。

我认为第一步,您需要直接请求上传tomcat url。

样本与 curl:

curl -X POST \
  http://[YOUR IP OR LOCALHOST]:8081/web \
  -H 'Accept: application/json' \
  -H 'Cache-Control: no-cache' \
  -H 'Content-Type: multipart/mixed' \
  -H 'Postman-Token: 406bfbe4-94d3-0c70-1b0f-0d1fdb2a6f5b' \
  -H 'content-type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW' \
  -F 'uploadFile=@20180703_1409164.mp4' 

通过将请求直接发送到 tomcat,您将确定错误不是来自 httpd。

如果您收到格式错误的服务器响应并且要忽略它,我们可以在 httpd.conf:

上设置此选项
ProxyBadHeader Ignore

经过这次改动,终于把真正的问题暴露给大家了。

通常错误是由某些上传限制引起的。

您可以在 server.xml

中增加限制
<Connector port="8080" protocol="HTTP/1.1"
  connectionTimeout="20000"
  redirectPort="8443"
  maxSwallowSize = "-1"/>

或者如果您的问题是超时:

<Connector port="8080" protocol="HTTP/1.1" URIEncoding="UTF-8"
           connectionUploadTimeout="36000000" disableUploadTimeout="false"
           connectionTimeout="60000" redirectPort="8443" />

更多信息:

http://www.baeldung.com/spring-maxuploadsizeexceeded

http://somepixels.net/en/502-proxy-error-uploading-from-apache-mod_proxy-to-tomcat-7/

我刚才找到了解决方案, 我发布它以供将来参考。

问题既不是 Tomcat 也不是 Apache。 问题出在底层网络中。由 ISP 作为单独 link 提供的 2 个服务器之间的连接是 missing/had 错误的 MTU 参数配置。这导致网络丢弃大于特定字节数的帧。 一旦将 MTU 明确设置为 1500,问题就消失了。