【发布时间】:2015-02-06 09:06:01
【问题描述】:
我目前正在配置 Apache httpd 以通过 AJP(使用 mod_proxy_ajp)将“/api/foo”的所有流量定向到特定的 Tomcat 实例。为此,我的 httpd 配置文件中有以下 ProxyPass 规则:
ProxyPass /api/foo ajp://localhost:9999/api/foo connectiontimeout=300 timeout=300 retry=3
此 Tomcat 实例在其 server.xml 中定义了以下连接器:
<Connector port="9999" protocol="AJP/1.3" redirectPort="9443"/>
通过此配置,我在访问 /api/foo 时可以正确访问我的 Tomcat 实例。但是,当 URL 超过 300 个字符时,我似乎无法访问我的 Tomcat 实例,有时。
第一个小时我可能会超时,而另一个小时可能一切正常。
当我遇到超时时,我在 httpd 错误日志中看到以下错误:
[error] (70007)The timeout specified has expired: ajp_ilink_receive() can't receive header
[error] ajp_read_header: ajp_ilink_receive failed
[error] (70007)The timeout specified has expired: proxy: read response failed from 127.0.0.1:9999 (localhost)
在我的 httpd 访问日志中出现以下结果:
"GET /api/foo/barrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr HTTP/1.1" 503 323 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:33.0) Gecko/20100101 Firefox/33.0"
奇怪的是,这个请求似乎没有到达我的 Tomcat 实例。我没有看到任何到达我的应用程序日志记录的内容,我也没有在我的 Tomcat 访问日志中看到该请求。
有谁知道这个问题的原因可能是什么?超时设置为超过 1 分钟,所以我希望请求至少能到达我的 Tomcat 实例...
最后一点,我尝试将 AJP 连接器的 packageSize 设置为 65536,将 Apache httpd 的 LimitRequestFieldSize 和 ProxyIOBufferSize 设置为 65536。这并没有解决问题。
【问题讨论】: