当我在 Apache 2.2.3 上使用 mod_proxy 代理到 Tomcat 5.5 时,出现了 502 错误网关错误。
直接通过 Tomcat(而不是通过 mod_proxy)使用时,它可以正常工作,因此我认为问题出在 Apache 端。当请求需要比正常情况长但我还没有发现任何规律。有时两秒太长,有时七秒太长。
Tomcat 用于托管基于 Groovy/Grails 的应用程序。
Apache vhost 配置具有以下相关条目:
ProxyRequests Off
ProxyTimeout 1800
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
<Location />
ProxyPass http://DOMAIN:8180/
ProxyPassReverse http://DOMAIN:8180/
SetEnv force-proxy-request-1.0 1
SetEnv proxy-nokeepalive 1
</Location>
UseCanonicalName off
HostNameLookups off
请注意,我添加了 ProxyTimeout 来尝试解决问题(过去曾在类似情况下提供帮助),但没有帮助。
这两行已经过时了,如果没有它们,情况会更糟——几乎每次请求都会出现 502 错误。
SetEnv force-proxy-request-1.0 1
SetEnv proxy-nokeepalive 1
答案1
更新
您是否尝试过监控 Tomcat 中的繁忙线程数?也许 Apache 没有正确释放它们。
首次尝试,没有成功
反向名称查找DOMAIN
?
我要厚颜无耻地插话我的堆栈溢出答案。请注意,它允许您使用 localhost 而不是DOMAIN
。
<VirtualHost *:80>
ServerName public.server.name
ProxyRequests Off
ProxyPreserveHost On
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
ProxyPass / http://localhost:8180/
ProxyPassReverse / http://localhost:8180/
</VirtualHost>
答案2
虽然这不是您问题的直接答案,但我们过去常常以以下方式执行 Apache2<->Tomcat5 代理。效果非常好。
RewriteRule ^/$ http://apache.domain/appname/ [R]
RewriteRule ^/appname(.*)$ http://tomcat.domain:8081/appname$1 [P]
ProxyPassReverse /appname http://tomcat.domain:8081/appname