1. nginx并发问题
在配置高并发的 Nginx 服务器时,Nginx 的默认文件描述符限制和锁定内存限制可能不足以处理大量的并发连接,导致性能瓶颈和潜在的服务中断。
具体表现就是有大量并发连接的时候(机器池大概拉到了1200台机器),有的请求直接秒断开
2. 什么原因
Nginx 的文件描述符限制决定了每个工作进程可以打开的文件数,而锁定内存限制则决定了进程可以锁定到物理内存中的内存量。这些限制如果设置过低,会影响 Nginx 的性能和稳定性。在高并发场景下,默认设置可能不够用,需要进行调整。
3. 解决
3.1、临时查看和设置系统文件描述符限制
1、查看当前会话的文件描述符限制 使用ulimit
命令查看当前会话的文件描述符限制
ulimit -n
2、设置当前会话的文件描述符限制 使用ulimit
命令可以临时增加当前会话的文件描述符限制。例如,将限制设置为102400:
ulimit -n 102400
3.2、永久修改文件描述符限制和锁定内存限制
要永久修改文件描述符限制,可以编辑系统配置文件。这通常需要超级用户权限。
-
编辑系统级文件描述符限制
编辑
/etc/security/limits.conf
文件,为特定用户或所有用户设置文件描述符限制。vim /etc/security/limits.conf
* soft nofile 1024000 * hard nofile 1024000 * soft nproc 1024000 * hard nproc 1024000 * soft memlock unlimited * hard memlock unlimited
/etc/security/limits.conf 文件用于配置 Linux 系统中用户和进程的资源限制。这些限制可以防止单个用户或进程占用过多的系统资源,从而保证系统的稳定性。
*:表示所有用户。
soft:表示软限制。用户可以临时超过这个限制,但一段时间后系统会尝试将资源使用恢复到这个限制之内。
hard:表示硬限制。用户无法超过这个限制,系统会严格执行。
nofile:表示用户能打开的最大文件数。
nproc:表示用户能启动的最大进程数。
memlock:表示用户能锁定在内存中的最大字节数。
-
检查系统范围的限制
检查系统范围的文件描述符限制,编辑
/etc/sysctl.conf
文件并添加以下行:vim /etc/sysctl.conf
fs.file-max = 2097152
运行以下命令以应用更改:
sudo sysctl -p
3.3、修改nginx文件描述符限制和锁定内存限制
-
编辑 Nginx 的 systemd 服务文件
vim /usr/lib/systemd/system/nginx.service
添加以下内容:
[Service] LimitNOFILE=100000 # LimitMEMLOCK=unlimited LimitMEMLOCK=6553600
-
重载 systemd 配置
sudo systemctl daemon-reload sudo systemctl restart nginx sudo systemctl status nginx
3.4、验证更改
-
检查 Nginx 主进程的文件描述符限制
使用以下命令找到 Nginx 主进程的 PID:
ps aux | grep nginx
运行以下命令查看文件描述符限制:
cat /proc/[PID]/limits | grep "Max open files" cat /proc/[PID]/limits | grep "Max locked memory"
4. 总结
通过修改 Nginx 的文件描述符和锁定内存限制,可以有效提升服务器的性能和稳定性,确保其能够处理高并发连接数。在修改这些配置时,务必重载 systemd 配置并重启 Nginx 服务以使更改生效。此外,还需结合实际的硬件资源和操作系统配置进行调优,确保系统能够支持这些更高的限制。