Node.js Elastic Beanstalk 在重负载下拒绝连接 (ECONNRESET)
Node.js Elastic Beanstalk refuses connections under heavy load (ECONNRESET)
我向 Elastic Beanstalk 部署了一个简单的 Node.js Express 应用程序。
使用 loadtest npm 包,我以每秒 150 个请求 的速度直接启动了 EC2 实例(绕过 ELB),事情开始变得棘手起来.
loadtest -c 10 --rps 150 http://{EC2-IP}/
服务器会立即重置连接 (ECONNRESET
),导致应用程序无法访问。它拒绝支持超过 X 个并发连接。
深入研究 EC2 服务器的日志后,我发现文件中充斥着以下日志消息:
1024 worker_connections are not enough
然后我明白我需要调整 /etc/nginx/nginx.conf
中的 worker_connections
声明,以及增加 OS 文件描述符限制,因为每个连接需要 1 个文件描述符。
您可以通过 运行:
检查 OS 文件描述符限制
ulimit -n
但是,由于该实例由 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"
直接修改配置文件的原始副本:将(/etc/nginx/nginx.conf)替换为(/tmp/deployment/config/#etc#nginx#nginx.conf).
我向 Elastic Beanstalk 部署了一个简单的 Node.js Express 应用程序。
使用 loadtest npm 包,我以每秒 150 个请求 的速度直接启动了 EC2 实例(绕过 ELB),事情开始变得棘手起来.
loadtest -c 10 --rps 150 http://{EC2-IP}/
服务器会立即重置连接 (ECONNRESET
),导致应用程序无法访问。它拒绝支持超过 X 个并发连接。
深入研究 EC2 服务器的日志后,我发现文件中充斥着以下日志消息:
1024 worker_connections are not enough
然后我明白我需要调整 /etc/nginx/nginx.conf
中的 worker_connections
声明,以及增加 OS 文件描述符限制,因为每个连接需要 1 个文件描述符。
您可以通过 运行:
检查 OS 文件描述符限制ulimit -n
但是,由于该实例由 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"
直接修改配置文件的原始副本:将(/etc/nginx/nginx.conf)替换为(/tmp/deployment/config/#etc#nginx#nginx.conf).