Node.js Elastic Beanstalk在重负载下拒绝连接(ECONNRESET)

Ela*_*ava 2 scalability nginx amazon-ec2 node.js amazon-elastic-beanstalk

我在Elastic Beanstalk中部署了一个简单的Node.js Express应用程序.

使用loadtest npm软件包,我每秒150次请求直接打开EC2实例(绕过ELB),这就是事情开始变得毛茸茸的时候.

loadtest -c 10 --rps 150 http://{EC2-IP}/
Run Code Online (Sandbox Code Playgroud)

服务器会立即重置连接(ECONNRESET),使应用程序无法访问.它拒绝支持超过X个并发连接.

Ela*_*ava 9

在深入了解EC2服务器的日志后,我在文件中发现了以下日志消息:

1024 worker_connections are not enough
Run Code Online (Sandbox Code Playgroud)

然后我明白我需要调整worker_connections声明/etc/nginx/nginx.conf,以及增加OS文件描述符限制,因为每个连接需要1个文件描述符.

您可以通过运行来检查操作系统文件描述符限制:

ulimit -n
Run Code Online (Sandbox Code Playgroud)

但是,由于实例是由Elastic Beanstalk管理的,因此亚马逊要求我们编辑/tmp/deployment/config/#etc#nginx#nginx.conf,其中包含与内容相同的内容/etc/nginx/nginx.conf,但亚马逊知道将其复制到/etc/nginx/nginx.conf部署完成时,以及告诉nginx使用新配置.

我创建了一个.ebextensions文件,它增加了OS文件描述符限制以及worker_connections声明.增加此限制将允许我们支持突然的流量峰值而不是返回ECONNRESET.

在部署时,将其与您的应用程序一起包含在相对于已部署目录的根目录的以下路径中:

.ebextensions/nginx.config

files:
  "/etc/security/limits.conf":
    content: |
      *           soft    nofile          6144
      *           hard    nofile          6144
container_commands:
    01-worker-connections:
        command: "/bin/sed -i 's/worker_connections  1024/worker_connections  6144/g' /tmp/deployment/config/#etc#nginx#nginx.conf"
Run Code Online (Sandbox Code Playgroud)