一尘不染

Apache / Tomcat错误-传递错误的页面

tomcat

这个错误使我发疯。我们有一台运行Apache和Tomcat的服务器,服务于多个不同的站点。通常,服务器可以正常运行,但是有时在错误的页面(
别人
请求 的页面)中 出现错误 __

线索:

  • 交付的页面是另一个用户最近请求的页面,否则可以正确交付。可以交换两个同时的请求是众所周知的。据我所知,所有错误发送的页面都不超过几分钟。
  • 它仅影响Tomcat正在提供的文件。静态文件(如图像)不受影响。
  • 并非总是如此。当它发生时,它对每个人都发生。
  • 这似乎发生在需求高峰时。但是,需求还不是很高-这肯定在Apache可以应付的范围之内。
  • 重新启动Tomcat可以修复它,但是只需要几分钟。重新启动Apache可以修复它,但是只需要几分钟。
  • 该服务器使用Gentoo上的Java 6 VM运行Apache 2和Tomcat 6。使用AJP13进行连接,并且块JkMount内的指令<VirtualHost>正确。
  • 在任何日志文件中没有任何用处。

更多的信息:

Apache尚未打开任何形式的缓存。例如,httpd.conf中所有与缓存相关的条目以及相关的导入都说明:

<IfDefine CACHE>
  LoadModule cache_module modules/mod_cache.so
</IfDefine>

虽然Apache的选项不包含该标志:

APACHE2_OPTS="-D DEFAULT_VHOST -D INFO -D LANGUAGE -D SSL -D SSL_DEFAULT_VHOST -D PHP5 -D JK"

Tomcat同样没有找到我可以找到的缓存选项。

工具箱的建议]很好,但在这种情况下不合适。使我相信该错误不会出现在我自己的代码中的原因是,它不仅仅是传递了几个值-
而是整个请求,包括URL,参数,会话cookie,整个过程。人们回传的页面明显是“您以John身份登录”。


更新:

基于一些人的建议,我将向Tomcat服务的页面添加以下HTTP标头,以禁用所有形式的缓存:

Cache-Control: no-store
Vary: *

希望这些标头不仅会受到Apache的尊重,而且还会受到其他可能妨碍其访问的缓存或代理的尊重。不幸的是,我没有办法故意重现此错误,因此我将不得不等待,看看它是否再次出现。

我注意到其中包含以下标头-它们可以以任何方式关联吗?

Connection: Keep-Alive
Keep-Alive: timeout=5, max=66

更新:

显然,这是在我入睡时再次发生的,但是现在我已经醒了,现在已经停止了。同样,日志中没有任何有用的信息,因此我不了解实际发生的情况或如何防止发生这种情况。

我可以在Apache或Tomcat的日志中添加任何其他信息,以使其更易于诊断吗?


更新:

由于这种情况已经发生了两次,因此我们更改了Apache连接到Tomcat的方式,以查看它是否影响事物。我们使用mod_jk的是这样的指令:

JkMount /portal ajp13

我们现在已切换为使用mod_proxy_ajp,如下所示:

ProxyPass /portal ajp://localhost:8009/portal

我们将看看是否有任何不同。这个错误总是令人讨厌地无法预测,因此我们永远不能确切地说出它是否有效。


更新:

我们只是在剩下使用的mod_jk网站上短暂得到了错误,而使用同一台服务器上的姐妹网站mod_proxy_ajp却没有显示该错误。这并不能证明任何事情,但是确实提供了证据,证明使用mod_proxy_ajp可能有所帮助。


更新:

昨晚我们在使用的网站上再次收到了错误消息mod_proxy_ajp,很明显,该错误尚未解决-
mod_jk并不是问题的根源。我将尝试关闭持久连接的匿名建议:

KeepAlive Off

如果同样失败,我将绝望地开始研究GlassFish。


更新:

该死!问题又回来了。我已经有一段时间没有看到它了,所以我开始认为我们终于可以对它进行排序了。我讨厌黑醋栗虫。


阅读 320

收藏
2020-06-16

共1个答案

一尘不染

我们将Apache从使用AJP代理转换为使用HTTP代理。到目前为止,它似乎已经解决了该问题,或者至少已大大减少了它-
几个月没有报告该问题了,此后该应用的使用量有所增加。

更改位于Apache的httpd.conf中。开始于mod_jk

JkMount /portal ajp13

我们切换到mod_proxy_ajp

ProxyPass /portal ajp://localhost:8009/portal

然后最后直行mod_proxy

ProxyPass /portal http://localhost:8080/portal

您需要确保Tomcat设置为在端口8080上提供HTTP服务。并且请记住,如果要提供/,则需要/在代理的两面都包含它,否则它会开始哭泣:

ProxyPass / http://localhost:8080/
2020-06-16