55

我们在 Tomcat 6 和 Apache mod_proxy 2.2.3 上运行一个 Web 应用程序。看到很多这样的 502 错误:

错误的网关!代理服务器收到来自上游服务器的无效响应。

代理服务器无法处理请求 GET /the/page.do。

原因:从远程服务器读取错误

如果您认为这是服务器错误,请联系网站管理员。

错误 502

Tomcat 有很多线程,所以它不受线程限制。我们正在通过 JMeter 向 2400 名用户推送该应用程序。所有的盒子都位于我们的防火墙内,在一个快速卸载的网络上,所以不应该有任何网络问题。

有人对要查看或尝试的事情有任何建议吗?接下来我们将前往 tcpdump。

2008 年 10 月 21 日更新:仍然没有弄清楚这一点。仅看到其中极少数处于负载状态。下面的答案还没有提供任何神奇的答案……还没有。:)

4

10 回答 10

47

只是为了添加一些特定设置,我有一个类似的设置(使用 Apache 2.0.63 反向代理到 Tomcat 5.0.27)。

对于某些 URL,Tomcat 服务器可能需要 20 分钟才能返回一个页面。

我最终修改了 Apache 配置文件中的以下设置,以防止其代理操作超时(如果 Tomcat 需要更长的时间来返回页面,则会有很大的溢出因素):

Timeout 5400
ProxyTimeout 5400

一些背景

仅ProxyTimeout是不够的。查看Timeout的文档,我(我不确定)这是因为当 Apache 等待来自 Tomcat 的响应时,Apache 和浏览器(或任何 http 客户端)之间没有流量 - 所以Apache 关闭与浏览器的连接。

我发现如果我将 Timeout 设置保留为默认设置(300 秒),那么如果对 Tomcat 的代理请求需要超过 300 秒才能获得响应,浏览器将显示“502 代理错误”页面。我相信这条消息是由 Apache 生成的,知道它充当反向代理,然后关闭与浏览器的连接(这是我目前的理解 - 它可能有缺陷)。

代理错误页面说:

代理错误

代理服务器收到来自上游服务器的无效响应。代理服务器无法处理请求 GET。

原因:从远程服务器读取错误

...这表明 ProxyTimeout 设置太短,而调查表明 Apache 的 Timeout 设置(Apache 和客户端之间的超时)也会影响这一点。

于 2010-03-05T16:59:00.510 回答
15

所以,在这里回答我自己的问题。我们最终确定,由于 Tomcat 线程超时,我们在负载均衡器中看到了 502 和 503 错误。在短期内,我们增加了超时。从长远来看,我们首先修复了导致超时的应用程序问题。为什么 Tomcat 超时在负载均衡器上被视为 502 和 503 错误仍然是一个谜。

于 2008-12-01T15:30:52.560 回答
12

您可以使用 proxy-initial-not-pooled

请参阅http://httpd.apache.org/docs/2.2/mod/mod_proxy_http.html

如果设置了此变量,则如果客户端连接是初始连接,则不会重用池连接。这避免了在代理检查连接后,代理发送的数据到达后端之前后端服务器关闭池连接的竞争条件导致的“代理:从远程服务器读取状态行错误”错误消息。必须记住,设置此变量会降低性能,尤其是对于 HTTP/1.0 客户端。

我们也遇到了这个问题。我们通过添加来修复它

SetEnv proxy-nokeepalive 1
SetEnv proxy-initial-not-pooled 1

并关闭keepAlive所有服务器。

mod_proxy_http 在大多数情况下都很好,但是我们在负载很重的情况下运行它,我们仍然遇到一些我们不理解的超时问题。

但是看看上面的指令是否符合你的需要。

于 2009-08-17T12:23:42.097 回答
4

来自 apache conf 的示例:

#Default value is 2 minutes
**Timeout 600**
ProxyRequests off
ProxyPass /app balancer://MyApp stickysession=JSESSIONID lbmethod=bytraffic nofailover=On
ProxyPassReverse /app balancer://MyApp
ProxyTimeout 600
<Proxy balancer://MyApp>
    BalancerMember http://node1:8080/ route=node1 retry=1 max=25 timeout=600
    .........
</Proxy>
于 2009-12-03T05:58:01.630 回答
3

我猜你正在使用 mod_proxy_http (或代理平衡器)。

查看您的 tomcat 日志(localhost.log 或 catalina.log)我怀疑您在 web 堆栈中看到异常冒泡并关闭 tomcat 工作程序连接到的套接字。

于 2008-10-04T03:17:01.673 回答
3

您可以通过在 ProxyPass 指令中指定代理超时来避免全局超时或必须虚拟主机,如下所示:

ProxyPass /svc http://example.com/svc timeout=600
ProxyPassReverse /svc http://example.com/svc timeout=600

注意timeout=600秒。

但是,当您有负载均衡器时,这并不总是有效。在这种情况下,您必须在这两个地方添加超时(在 Apache 2.2.31 中测试)

负载均衡器示例:

<Proxy "balancer://mycluster">
     BalancerMember "http://member1:8080/svc" timeout=600
     BalancerMember "http://member2:8080/svc" timeout=600
</Proxy> 

ProxyPass /svc "balancer://mycluster" timeout=600
ProxyPassReverse /svc "balancer://mycluster" timeout=600

附注:当 Chrome 是客户端时不需要timeout=600on ProxyPass(我不知道为什么),但ProxyPassInternet Explorer (11) 上没有此超时会中止说服务器重置连接。

我的理论是:

ProxyPass客户端(浏览器)和 Apache 之间使用超时。

BalancerMembertimeout 在 Apache 和后端之间使用。

对于那些使用 Tomcat 或其他支持的人,您可能还需要注意 HTTP 连接器超时。

于 2016-11-04T14:53:33.657 回答
2

您应该能够通过将 timeout 和 proxyTimeout 参数设置为 600 秒来解决此问题。经过一段时间的战斗后,它对我有用。

于 2012-02-06T15:17:24.023 回答
2

我知道这不能回答这个问题,但我来到这里是因为我在 nodeJS 服务器上遇到了同样的错误。在找到解决方案之前,我被困了很长时间。我的解决方案只是添加斜杠或/在 proxyreserve apache 的末尾。

我的旧代码是:

ProxyPass / http://192.168.1.1:3001
ProxyPassReverse / http://192.168.1.1:3001

正确的代码是:

ProxyPass / http://192.168.1.1:3001/
ProxyPassReverse / http://192.168.1.1:3001/
于 2019-05-06T07:22:40.117 回答
1

您很可能应该在 apache conf 中增加 Timeout 参数(默认值 120 秒)

于 2009-12-02T11:16:55.893 回答
0

如果你想用 apache 负载均衡器来处理你的 webapp 的超时,你首先必须了解timeout. 我试图浓缩我在这里找到的讨论:http: //apache-http-server.18135.x6.nabble.com/mod-proxy-When-does-a-backend-be-considered-as-failed-td5031316。 html

似乎只有在与后端的传输层连接mod_proxy失败时才 认为后端失败。除非被使用。...failonstatus/failontimeout

因此,failontimeoutapache 需要设置将 webapp 的超时(例如由 tomcat 服务)视为失败(并连续切换到热备用服务器)。对于正确的配置,请注意以下错误配置:

ProxyPass/balancer://localbalance/failontimeout=on timeout=10 failonstatus=50

这是一个错误配置,因为:

您在balancer此处定义 a ,因此timeout参数与balancer(与其他两个一样)相关。但是对于 a balancertimeout参数不是连接 超时(如与 一起使用的BalancerMember),而是等待空闲工作人员/成员的最长时间(例如,当所有工作人员都忙 处于错误状态时,默认为不等待)。

所以,正确的配置是这样完成的

  1. 设置timeoutBalanceMember级别:
 <Proxy balancer://mycluster>
     BalancerMember http://member1:8080/svc timeout=6 
 ... more BalanceMembers here
</Proxy>
  1. 设置failontimeoutbalancer
ProxyPass /svc balancer://mycluster failontimeout=on

重启阿帕奇。

于 2020-11-12T13:40:34.567 回答