AWS Elastic Beanstalk 504 网关超时

问题描述 投票:0回答:4

我有一个在 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 个字节的数据”以确保会话保持活动状态并且在一分钟后不会超时

amazon-web-services amazon-elastic-beanstalk
4个回答
54
投票

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
配置中删除。


20
投票

为了更新 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;

1
投票

在我的例子中,发生错误是因为应用程序容器没有足够的内存。

memory
文件中的containerDefinitions中增加
Dockerrun.aws.json
轻松解决了我的问题

{
  "AWSEBDockerrunVersion": 2,
  "volumes": [],
  "containerDefinitions": [
    {
      "name": "###",
      "image": "###",
      "essential": true,
      "memory": 521,         # formerly 128
...

0
投票

获取您的 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;
© www.soinside.com 2019 - 2024. All rights reserved.