vlambda博客
学习文章列表

关于Nginx连接数应该设置多少的问题

在Nginx的配置中并没有一个最大连接数的参数设置,而是有两个与此相关的关键参数:worker_processes和worker_connections。通常,理论上的最大连接数的计算公式是:worker_processes * worker_connections,而当Nginx作为反向代理时,这个公式则为worker_processes * worker_connections/4。注意这里为什么要除以4呢?具体可以参考:https://blog.csdn.net/sole_cc/article/details/52433353。

1. worker_processes

最理想的worker_processes取决于多个因素,包括CPU、内存、硬盘等硬件配置,从nginx 1.3.8和nginx 1.2.5开始,这个值可以配置为auto,默认的配置也是auto,它可以自动检测 cpu cores 并设置 worker_processes 参数。在网上也看到以下建议:一个cpu配置多于一个worker数,对nginx而言没有任何益处。因此,一般情况下,worker_processes设置为auto,或者设置为:cpu个数*每个cpu的核心数。

2. worker_connections

这个参数是设置每个worker可以处理的并发连接数。要确定这个参数的大小,首先要了解系统可以打开的最大句柄数量,可以通过cat /proc/sys/fs/file-max来查。

  1. connections不是随便设置的,而是与两个指标有重要关联,一是内存,二是操作系统级别的“进程最大可打开文件数”。

  2. 内存:每个连接数分别对应一个read_event、一个write_event事件,一个连接数大概占用232字节,2个事件总占用96字节,那么一个连接总共占用328字节,通过数学公式可以算出100000个连接数大概会占用 31M = 100000 * 328 / 1024 / 1024,当然这只是nginx启动时,connections连接数所占用的nginx。

  3. 进程最大可打开文件数:进程最大可打开文件数受限于操作系统,可通过 ulimit -n 命令查询,以前是1024,现在是1048576。

nginx提供了worker_rlimit_nofile指令,这是除了ulimit的一种设置可用的描述符的方式。该指令与使用ulimit对用户的设置是同样的效果。此指令的值将覆盖ulimit的值,如:worker_rlimit_nofile 20960;

设置ulimits:ulimit -SHn 1048576

worker_processes 2;worker_rlimit_nofile 1048576;#pid logs/nginx.pid;events { worker_connections 524288;}

通过 ps aux | grep nginx 找到 nginx 的worker进程ID

通过 cat /proc/1/limits 查看,其中1是worker进程ID,请注意其中的Max open files

假设CPU是双核的,则worker_processes设为2,根据上面测得的Max open file=1048576来计算,则Nginx非反向代理时

worker_connections = 1048576 / worker_processes = 524288

而当Nginx作为反向代理时

worker_connections = (1048576 / 4) / worker_processes = 131072

从上面的分析可以看出nginx占用内存小,处理性能高,通过提高服务器的配置,Nginx可以应对更大的连接数