【问题标题】:Long URLs in combination with Apache httpd and Tomcat长 URL 结合 Apache httpd 和 Tomcat
【发布时间】: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。这并没有解决问题。

【问题讨论】:

    标签: apache tomcat tomcat7


    【解决方案1】:

    在没有更好的答案的情况下,尽管我会分享我遇到类似且可能相同的问题的经验,并建议您更改正在使用的连接器。

    在使用 apache 2.2 和 tomcat 6 在稍微不同的环境中使用 mod_proxy_ajp 时,我也收到了相同的 ajp_read_header: ajp_ilink_receive failed 错误。

    当我们遇到问题时,我尝试了许多不同的推荐修复方法,包括连接器超时和其他连接器设置。

    根据我的阅读,其中一些将在不同的情况下工作,错误ajp_ilink_receive failed 消息似乎很笼统。在您的情况下,当 URL 超过 300 个字符时会发生这种情况 - 有时至少......

    在尝试了从 tomcat server.xml 中的许多不同的连接器属性和附加在 ajp:// URI 之后的 apache ProxyPass 设置之后,我几乎放弃了沿着这条路走下去。从那以后,我尝试了 mod_proxy 和 mod_jk,它们似乎都解决了这个问题,或者至少没有更多的 ajp 错误。但是无论如何 mod_proxy 都不会发生这种情况,因为它不与 ajp 连接。

    所以我建议将您的 tomcat 连接器更改为 mod_proxy 或 mod_jk。有各种关于差异的文章,但tomcat 上的页面herehere 是一个相当好的信息来源。您将需要根据您的设置在 mod_proxy 和 mod_jk 之间进行选择。 mod_jk 虽然不同,但实际上设置起来并不难(但您可能必须为 apache 构建 mod_jk.so)。

    总结不同的连接器;

    • mod_jk:最高推荐。 ajp 连接器。目的设计。驻留在 apache 之外的不同配置设置。将具有特定名称的 web 应用程序连接到不同的 url 名称时难以配置。
    • mod_proxy:http 连接器。据报道比 mod_proxy_ajp 更稳定。传递 ssl 变量的问题?
    • mod_proxy_ajp:最不推荐但最常见。 ajp 连接器。 mod_proxy 的扩展。易于实施。

    如果由于某种原因这不起作用。其他人已经成功地研究了 tomcat 方面的问题,例如长时间运行的查询。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-05
      • 1970-01-01
      • 2012-04-05
      • 2011-03-30
      • 2013-10-13
      • 1970-01-01
      • 2012-08-28
      • 2012-06-06
      相关资源
      最近更新 更多