因此,我们使用 apache 作为反向代理将请求发送到托管在 tomcat 中的 solr(搜索应用程序)。
我们在 jboss 上托管了另一台服务器,它将数据以二进制格式发送到 apache,然后 apache 将其发送到 tomcat 进行索引并放入 solr 数据库。数据以多部分 POST 请求的形式发送。此过程最多可能需要 8 小时。
问题就出在这里,当我们通过 apache 发送数据时,在索引(发送数据部分)的中间大约 30-40 分钟内,我们会在 jboss(发送数据的那个)中收到大量代理和坏网关错误,并且在 tomcat 日志中,它会显示收到的数据具有无效的 EOF。所以很明显数据没有正确发送。如果我们查看 apache 日志,会发现有很多这样的错误:
[Wed Jan 08 16:10:45 2014] [error] [client 10.60.6.6] (70007)The timeout specified has expired: proxy: error reading status line from remote server localhost:8080
[Wed Jan 08 16:10:45 2014] [error] [client 10.60.6.6] proxy: Error reading from remote server returned by /application-path/application-url
并且这个错误:
[Mon Jan 13 11:38:49 2014] [error] (103)Software caused connection abort: proxy: pass request body failed to [::1]:8080 (localhost)
[Mon Jan 13 11:38:49 2014] [error] proxy: pass request body failed to [::1]:8080 (localhost) from 10.3.40.76 ()
奇怪的是,如果我们绕过 apache (:80) 并直接将数据发送到 tomcat (:8080),我们从未遇到过此问题。起初,此问题可能看起来与这。
但是 tomcat 和 apache 没有打开 keep-alive。
Timeout 120
KeepAlive Off
<VirtualHost *:80>
ServerName application.com
ServerAlias x.application.com
DocumentRoot /var/www/something/
ServerAdmin [email protected]
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\" \"%{soapAction}i\"" logging
CustomLog /log/httpd/access.log logging
ErrorLog /log/httpd/error.log
ServerSignature On
RewriteEngine On
RewriteLogLevel 2
# ensure that Tomcat sees the original host and port (and not the proxy-host and -port)
ProxyPreserveHost On
# Rewrite Rules
RewriteRule ^/application-path/(.*) http://localhost:8080/application-path/$1 [P]
</VirtualHost>
在 tomcat 中
<Connector connectionTimeout="10000" port="8080" protocol="HTTP/1.1"
redirectPort="8443" maxThreads="1000" processorCache="1000" maxKeepAliveRequests="1"
keepAliveTimeout="10" socket.soReuseAddress="true" socket.soKeepAlive="true"
compression="on" compressionMinSize="10"
compressableMimeType="text/html,text/xml,text/plain,application/javascript,application/json,text/javascript,text/css"
socket.soLingerOn="false" socket.soLingerTime="0" URIEncoding="UTF-8" />
对于那些感到疑惑的人来说,是的,apache 的超时时间比 tomcat 的要长,而且两者都关闭了保持活动功能,因此,为什么 apache 会返回超时而 tomcat 不会返回超时,这毫无道理。
答案1
我们遇到了与您类似的问题,我们通过使用 iptables 将所有流量从端口 80 转发到 8080,完全绕过了 Apache。不确定这对您是否有用。
您也可以让 tomcat 监听端口 80。(不确定您是否有其他站点在监听 80。)