mod_proxy和tomcat7在上传文件时给出错误502

时间:2015-08-07 21:48:02

标签: apache tomcat mod-proxy

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

除了多部分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

奇怪的是,如果我上传一个ZERO Kb文件,POST multipart工作正常,但是与其他文件失败(不超过几个字节)。包括上传在内的所有内容都适用于我的开发环境(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,提升超时,ProxyBadHeader忽略,setenv proxy-initial-not-pooled 1等似乎没什么用......有什么想法吗?

2 个答案:

答案 0 :(得分:0)

我有一个类似的问题,错误不在“ Apache”中。

我认为第一步,您需要直接在tomcat网址中请求上传。

卷曲的样品:

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/

答案 1 :(得分:0)

我前一段时间找到了解决方案, 我将其发布以供将来参考。

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