使用 nginx 的 10K 并发连接

10K concurrent connections with nginx

我正在自己构建一个应用程序,我希望它能够处理 10K 个并发连接(通过本地机器和 locust 脚本测试)

托管在两台 ubuntu 14.04 服务器上,带有 nginx 反向代理和 nodeJS 应用服务器。

目前我达到了大约 3.3K 的并发用户,然后才遇到 500 个连接丢失错误的峰值。

我通过 运行 应用程序在两个单独的端口上实现跨端口连接的负载平衡,并使用上游指令在端口上传播请求。

但是,这并没有显示我的数字有任何明显的改善。

问题:

  1. 我知道这里遗漏了很多信息(我想象每个用户需要多少带宽)。我该如何收集正确的信息来做出决定?

  2. 还有什么其他选择可以consider/learn/implement 来最大程度地增加可能的并发用户数?

非常感谢!

如果您在 nginx 日志中看到很多 "Too many open files" 错误,那是因为您已达到服务器上当前设置的并发打开套接字的限制。

您可能必须增加 nginx 用户的使用限制 (ULimit),可能还有节点应用程序用户。这是我每次负载测试 nginx+nodejs 时遇到的第一个问题。 (https://www.cyberciti.biz/faq/linux-unix-nginx-too-many-open-files/)

ULimit

ulimit 命令为您提供了当前用户的限制,因此您必须 运行 在连接到 nginx 用户时

# su in the user nginx
su - nginx
ulimit -Hn
ulimit -Sn

# or
su nginx --shell /bin/bash --command "ulimit -Hn"
su nginx --shell /bin/bash --command "ulimit -Sn"

我们一般在/etc/security/limits.conf

中修改
sudo vi /etc/security/limits.conf

# Add the following lines
nginx       soft    nofile   30000
nginx       hard    nofile  30000
# Save

# Reload (I think rebooting here is the best way)
sysctl -p

nginx.conf

之后,你必须在nginx配置文件中设置nginx软件级别的限制

sudo vi /etc/nginx/nginx.conf

# Add this line at the root of the config
worker_rlimit_nofile 30000;

# Reload (This will fail if you have SELinux enabled)
sudo nginx -s reload

SELinux

要允许 nginx 应用程序设置自己的限制,您可以设置 selinux bool:

setsebool httpd_setrlimit on
sudo nginx -s reload