【问题标题】:AWS Elastic Beanstalk 504 Gateway TimeoutAWS Elastic Beanstalk 504 网关超时
【发布时间】: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 个字节的数据”以确保会话保持活动状态并且在一分钟后不会超时

【问题讨论】:

    标签: amazon-web-services amazon-elastic-beanstalk


    【解决方案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"
        

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

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

      【讨论】:

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