我有一个在 AWS Elastic Beanstalk 上运行的节点服务器。我的一个端点接受巨大的有效负载,而该函数本身相当缓慢且冗长,可能需要长达 10 分钟以上的时间。
由于业务需求,它必须保留为单个 HTTP POST,并且不能拆分得更小。
在较大的呼叫中,我收到 504 GATEWAY TIMEOUT,始终在 60 秒左右。我尝试过调整 Elastic Beanstalk Load Balancer 部分中的超时设置,但无济于事,看来最长的超时持续时间是 60 秒。
我确实在文档中看到了一个有前途的解决方案:https://docs.aws.amazon.com/elasticloadbalancing/latest/classic/config-idle-timeout.html
为确保文件上传等冗长操作有时间完成,请在每个空闲超时时间过去之前至少发送 1 个字节的数据
这听起来正是我所需要的,但我不知道如何实现
1) 如何从我的 Node 应用程序“发送至少 1 个字节的数据”以确保会话保持活动状态并且在一分钟后不会超时
504 ElasticBeanstalk 环境中的超时可以通过设置 ELB 策略来解决。可能还需要更新 Nginx 超时配置。
ELB 策略:将弹性负载均衡器的空闲超时设置为您选择的值(默认为 60 秒)。为此,请在项目的根目录中创建一个 .ebextensions 文件夹。在此文件夹中创建另一个文件扩展名为 .config 的文件,并将 ELB 空闲超时设置为您选择的值(例如 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
全部默认为 60 秒(要检查的其他规范可能是:client_header_timeout
、client_body_timeout
、keepalive_timeout
) 。 Nginx 中的默认超时值在规格和配置文件中指定(例如/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"
编辑(2020年6月11日): 有些人表示
keep_alive 300;
配置压垮了他们的服务器。因此,我已将其从 nginx.custom.conf
配置中删除。
为了更新 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;
在我的例子中,发生错误是因为应用程序容器没有足够的内存。
在
memory
文件中的containerDefinitions中增加Dockerrun.aws.json
轻松解决了我的问题
{
"AWSEBDockerrunVersion": 2,
"volumes": [],
"containerDefinitions": [
{
"name": "###",
"image": "###",
"essential": true,
"memory": 521, # formerly 128
...
获取您的 EC2 实例并选择与您的 ELB 应用程序关联的实例。单击“连接”,然后在“连接到实例”页面上再次单击“连接”。
注意:如果您在“连接到实例”中看到警告,指出未为端口 22 添加安全入站规则,则需要先将其添加到 EC2 实例的安全选项卡中。
这将打开
Amazon Linux 2023 AMI
。这里使用 cd ..
返回,然后使用 etc/nginx/conf.d
转到 conf.d
文件夹。在nginx.custom.conf
中添加以下内容(如果您没有看到它,请创建一个):
client_header_timeout 300;
client_body_timeout 300;
send_timeout 300;
proxy_connect_timeout 300;
proxy_read_timeout 300;
proxy_send_timeout 300;