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_timeout
、proxy_connect_timeout
、proxy_read_timeout, proxy_Send_timeout
均默认为 60s(要检查的其他规范可能是:client_header_timeout
、client_body_timeout
、keepalive_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 应用程序版本