AWS 上的 504(网关超时)
Posted
技术标签:
【中文标题】AWS 上的 504(网关超时)【英文标题】:504 (Gateway Timeout) on AWS 【发布时间】:2013-12-03 17:19:00 【问题描述】:我有我的 web 应用程序在 php 中的 AWS EC2 实例上运行,我进行了大约 5-10 分钟的 ajax 调用,我在 Google Chrome 中看到了 web 控制台,我得到了这个 504 (Gateway Timeout)
,我怎样才能增加这个值,和apache有关吗?
谢谢
【问题讨论】:
504 消息的来源——在 Apache、PHP 或某种负载均衡器/CDN 中?您的 phpinfo() 在“服务器 API”旁边说什么? 如果你通过 PHP 运行你的电话,你需要增加你的maximum execution time in php.ini。 @TML 我坚信这是由于 ELB 但不知道如何解决这个问题 @matcarlson 它在 ELB 中,因为一旦我使用实例 URL,ajax 调用就可以正常工作 【参考方案1】:ELB 默认超时时间为 60 秒;尽管this page 建议亚马逊支持可以为您做一些事情(并且还建议了解决该问题的方法),但我不知道如何扩展此限制:
第 6 点)Amazon ELB 超时 60 秒(保持空闲)
亚马逊 ELB 当前超时持续套接字连接@ 60 秒,如果它是 保持闲置。这种情况对于用例来说将是一个问题 在后端 EC2 生成大文件(PDF、报告等),将它们发送为 响应并在整个生成过程中保持连接空闲 过程。为避免这种情况,您必须在套接字上发送一些东西 每 40 秒左右保持连接在 Amazon ELB 中处于活动状态。 注意:我听说我们可以在解释案例后将此值扩展为 AWS 支持团队。
编辑:正如下面的评论者所指出的,截至July 24th, 2014,这可以在您的 AWS 控制台中进行配置。
【讨论】:
我通过之前的询问成功地延长了 ELB 超时限制。值得确认(以便您可以转达给 AWS 工程师)您的后端的超时时间大于您试图将 ELB 增加到的超时时间。 @JeffSisson 他们将其延长到 20 分钟,但如果请求需要超过 20 分钟怎么办? @user1765876 如果请求花费了这么长时间,那么您可能做错了。开始使用消息队列。 是的,您需要研究某种异步操作,排队是这里的一般类别。不应根据请求执行繁重的操作。 空闲超时现在可以配置了! aws.amazon.com/about-aws/whats-new/2014/07/24/…【参考方案2】:您是否尝试过更改 ELB 的超时时间? 增加负载均衡器属性内的不活动限制连接。然后您可以将默认限制形式 60 更改为 120。
【讨论】:
其他答案已经建议了这一点。有什么新鲜事?【参考方案3】:在 SO here 上有一个相关问题。 确保您正在执行以下操作(来自此相关问题):
我已确认容器/pod 正在运行, 应用程序已启动并且 如果我在 pod 中执行,那么我可以运行本地 curl 命令并获得响应 来自应用程序。 我检查了入口 pod 上的日志并且流量正在到达
对此here 和here 的一些有用命令。
下一步是增加 ELB 空闲时间,如上一个答案中所述。 如果您使用的是 terraform,您可以在入口的注释中使用:
"alb.ingress.kubernetes.io/load-balancer-attributes" = "idle_timeout.timeout_seconds=600"
通常在 ELB 之上有一个 nginx 入口控制器,可帮助将流量引导到您的服务。 后者也有超时,通常为 60 秒。 您需要按照指定的here 更改其超时。 如果您使用的是 terraform,您可以像这样在入口注释中指定它们(将它们从 60 秒更改为 300 秒):
"nginx.ingress.kubernetes.io/proxy-connect-timeout" = "10"
"nginx.ingress.kubernetes.io/proxy-send-timeout" = "300"
"nginx.ingress.kubernetes.io/proxy-read-timeout" = "300"
然后您可以按照链接 2 和 3 中的说明进入您的入口控制器并检查您的 nginx.conf 文件。应该应用新的限制。
【讨论】:
以上是关于AWS 上的 504(网关超时)的主要内容,如果未能解决你的问题,请参考以下文章
AWS - 错误 504 - 网关超时 - Flask 应用程序
连接 Facebook Graph API 时 ElasticBeanstalk for PHP 上的 504 网关超时