AWS Elastic Beanstalk 504 网关超时

Posted

技术标签:

【中文标题】AWS Elastic Beanstalk 504 网关超时【英文标题】:AWS Elastic Beanstalk 504 Gateway Timeout 【发布时间】:2018-08-14 16:27:47 【问题描述】:

我有一个在 AWS Elastic Beanstalk 上运行的节点服务器。我的一个端点接受了一个巨大的有效负载,而函数本身非常缓慢且冗长,可能需要超过 10 分钟。

由于业务需求,它必须保留为单个 HTTP POST,并且不能拆分为更小。

在较大的呼叫中,我收到 504 GATEWAY TIMEOUT,始终在 60 秒左右。我试过玩弄 Elastic Beanstalk 负载均衡器部分中的超时设置,但无济于事,似乎最长的超时持续时间是 60 秒。

我确实在 https://docs.aws.amazon.com/elasticloadbalancing/latest/classic/config-idle-timeout.html 的文档中看到了一个有希望的解决方案

为确保文件上传等冗长操作有时间完成,请在每个空闲超时期限过去之前发送至少 1 个字节的数据

这听起来正是我需要的,但我不知道如何完成

1)如何从我的 Node 应用程序“发送至少 1 个字节的数据”以确保会话保持活动状态并且在一分钟后不会超时

【问题讨论】:

【参考方案1】:

为了在 Amazon Linux 2 平台上更新 nginx 配置,我按照以下说明通过扩展 nginx 配置成功地增加了超时限制: https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/platforms-linux-extend.html

/.platform/nginx/conf.d/myconf.conf:

client_header_timeout   300;
client_body_timeout     300;
send_timeout            300;
proxy_connect_timeout   300;
proxy_read_timeout      300;
proxy_send_timeout      300;

【讨论】:

【参考方案2】:

ElasticBeanstalk 环境中的 504 超时可以通过设置 ELB 策略来解决。可能还需要更新 Nginx 超时配置。

ELB 策略:将弹性负载均衡器的空闲超时设置为您选择的值(默认为 60 秒)。为此,请在项目的根目录中创建一个 .ebextensions 文件夹。在此文件夹中创建另一个具有 .config 文件扩展名的文件,并将 ELB Idle Timeout 设置为您选择的值(例如 300 秒):

 option_settings:
   - namespace: aws:elb:policies
     option_name: ConnectionSettingIdleTimeout
     value: 300

或者,如果您使用的是应用程序负载均衡器:

 option_settings:
   - namespace: aws:elbv2:loadbalancer
     option_name: IdleTimeout
     value: 300

Nginx 配置:将 Nginx 设置为所需的超时值:send_timeoutproxy_connect_timeoutproxy_read_timeout, proxy_Send_timeout 均默认为 60s(要检查的其他规范可能是:client_header_timeoutclient_body_timeoutkeepalive_timeout )。 Nginx 中的默认超时值在specifications 和配置文件(例如/etc/nginx 下的 .config 文件)中指定。在.ebextensions文件夹中新建一个文件(如01-nginx-configuration.config或在上面的.config文件中更新),并在文件中追加以下内容(根据观察到的超时添加或删除相关设置):

 files:
   "/etc/nginx/conf.d/nginx.custom.conf":
       mode: "644"
       owner: "root"
       group: "root"
       content: |
         client_header_timeout   300;
         client_body_timeout     300;
         send_timeout            300;
         proxy_connect_timeout   300;
         proxy_read_timeout      300;
         proxy_send_timeout      300;

 container_commands:
   01_restart_nginx:
     command: "sudo service nginx reload"

还有其他几种方法可以添加此配置。阅读更多 here 和 here。

编辑(2020 年 6 月 11 日): 有人表示keep_alive 300; 配置破坏了他们的服务器。因此,我已将其从 nginx.custom.conf 配置中删除。

【讨论】:

这个解决方案使环境无法访问,它发生在我身上,当我在寻找解决方案时,我发现其他人按照上面的说明得到了与我得到的完全相同的错误。 ***.com/questions/51421457/… @Bilal 从为您添加的链接中的问题发布的答案看来,错误来自另一个容器命令 (01_update_nginx)。我想帮助你,但我需要更多信息 - 可能会提出一个新问题 我不得不从 nginx 配置中注释掉 keepalive_timeout,它使我的部署崩溃。否则一切似乎都正常,谢谢 我创建并上传了这个文件,它完全破坏了我的服务器。 @LeonGrin 我真的很抱歉。这在很大程度上取决于您在那里拥有的其他配置。我列出了几个超时选项 - 您可以选择适合您要求的选项。如果您能够确定是什么破坏了您的服务器,您能否告诉我们?另外,请注意 MathieuJ。评论注释掉keepalive_timeout。

以上是关于AWS Elastic Beanstalk 504 网关超时的主要内容,如果未能解决你的问题,请参考以下文章

Cloudfront 在连接到 ELB/Elastic Beanstalk 时抛出 504

Elastic Beanstalk Worker 的 SQS 守护程序在 1 分钟后获得 504 网关超时

如何更改 AWS Beanstalk Flask 应用程序的 NGINX 设置以防止 504 TImeout 错误?

Amazon Elastic BeanStalk 错误:无法创建 AWS Elastic Beanstalk 应用程序版本

[AWS] Elastic Beanstalk

AWS Elastic Beanstalk CLI 安装错误