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,问题就消失了。
所以,我在 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,问题就消失了。