itt*_*elo 8 tomcat amazon-ec2 amazon-web-services amazon-elb
我有一个在多个EC2实例上运行的应用程序,由Apache Tomcat提供服务.我在应用程序前面设置了一个AWS Elastic Load Balancer,一切都基本按预期工作.但是,我偶尔会从ELB获得一个随机504超时错误.这似乎与负载无关,因为我已经看到轻负载和重负载下的错误.此外,它似乎不会出现在任何常规模式或情况中.
在我的测试早期,我得到了504个错误,因为我的应用程序响应的时间比ELB上的默认60秒超时要长.我通过将ELB超时提升到我的应用程序所需的级别来解决这个问题.但是,我现在得到的504错误很快就会发生.因此,例如,我看到的一个错误是响应时间大约为一秒的请求.当请求不可能在应用程序服务器上超时时,获得超时错误似乎很奇怪.
对于这个问题,这可能是一个类似的问题,尽管我无法从所提供的信息中得知.此外,我没有额外的负载均衡器,只有ELB直接到Tomcat.
因此,经过更多挖掘后,我发现了这个问题。此页面通过解释有关空闲和保活超时的一些详细信息,有助于解开这个谜团:
\n\n\n\n\n从 ELB 收到 504 的直接原因有两个:
\n\n\n
\n- 应用程序实际上花费了比 ELB 连接超时更长的时间来响应。这是一个缓慢的超时\xe2\x80\x94,通常会在几秒后返回 504,ELB 的默认值为 60 秒。在这种情况下,有必要增加 ELB 的连接超时,或提高应用程序性能。
\n- 应用程序根本不响应 ELB,而是在请求数据时关闭其连接。这是一个快速超时\xe2\x80\x94,\n 504 通常会在几毫秒内返回,远低于 ELB 的超时设置。
\n
第一种情况是我所看到的,并通过提高 ELB 超时来解决。第二种场景描述了我在提高 ELB 超时后看到的令人困惑的行为。我的日志文件具有“-1 -1 -1”模式,如本文中的示例日志:
\n\n2015-12-11T13:42:07.736195Z my-elb 10.0.0.1:59893 - -1 -1 -1 504 0 0 0 "GET http://my-elb/ HTTP/1.1" "curl/7.19.7" - -\nRun Code Online (Sandbox Code Playgroud)\n\n从结论来看:
\n\n\n\n\n简而言之,ELB 的连接超时必须设置为低于应用程序的空闲超时和保活超时,以防止生成虚假 504。
\n
在开始使用 ELB 之前的开发过程中的某个时刻,我设置了 Tomcat 超时,使其恰好高于默认的 ELB 超时。当我提高 ELB 超时时,我将其设置为高于connectionTimeout我在 Tomcat 中设置的值。提高connectionTimeout到略高于我的新 ELB 超时,消除了神秘的 504 错误。所以,我现在已经摆脱了“慢”和“快”超时错误。
Tomcat 还有一个设置,默认情况下与未设置时keepAliveTimeout相同。connectionTimeout我没有设置它,所以修改connectionTimeout足以解决我的问题。
| 归档时间: |
|
| 查看次数: |
2750 次 |
| 最近记录: |