服务器并发连接数优化,Nginx内核参数调整
服务器并发连接数上不去,通常不是Nginx本身的问题,而是Linux内核的默认限制太保守。
本文从零开始,带你调整内核参数和Nginx配置,解决高并发下的连接超时、502错误和文件句柄耗尽等问题。
先确认当前瓶颈在哪里
动手改配置前,先用命令看清楚现状。
执行 ulimit -n 查看当前用户单进程能打开的文件句柄数,默认常是1024。
再用 ss -s 查看连接统计,如果 timewait 数量很高,说明回收需要优化。
最后看Nginx错误日志 tail -f /var/log/nginx/error.log,如果出现 Too many open files 或 worker_connections are not enough,就是本文要解决的问题。
调整Linux内核参数
所有内核参数修改都在 /etc/sysctl.conf 或 /etc/sysctl.d/ 下的配置文件里进行。
建议新建一个文件 /etc/sysctl.d/99-nginx.conf,写入以下内容:
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30
net.ipv4.ip_local_port_range = 1024 65000
fs.file-max = 1000000
参数含义:somaxconn 和 tcp_max_syn_backlog 决定等待队列长度,
队列太小会导致新连接被丢弃;tcp_tw_reuse 允许复用TIME_WAIT状态的连接,
对客户端主动关闭的场景有效;tcp_fin_timeout 缩短FIN_WAIT_2状态的保持时间;ip_local_port_range 扩大可用本地端口范围;fs.file-max 是系统级文件句柄上限。
保存后执行 sysctl -p /etc/sysctl.d/99-nginx.conf 让配置生效。
用 sysctl net.core.somaxconn 检查是否已改为65535。
放开进程文件句柄限制
内核允许了,但进程本身可能还被限制。
修改 /etc/security/limits.conf,在末尾加入:
* soft nofile 65535
* hard nofile 65535
root soft nofile 65535
root hard nofile 65535
如果系统使用systemd管理Nginx,还需要修改Nginx的service文件。
执行 systemctl edit nginx 添加:
[Service]
LimitNOFILE=65535
然后 systemctl daemon-reload && systemctl restart nginx。
重新登录终端后,用 ulimit -n 确认已变为65535。
优化Nginx主配置
编辑 /etc/nginx/nginx.conf,重点调整三处。
第一,worker_processes 设为 auto,让Nginx自动匹配CPU核心数。
第二,worker_connections 设为 65535,这个值不能超过系统的文件句柄限制。
第三,确保 multi_accept 开启。
参考片段:
events {
worker_connections 65535;
multi_accept on;
use epoll;
}
use epoll 是Linux下高效的事件模型,通常默认已启用。
如果Nginx作为反向代理,还需在 http 块中调整 keepalive_timeout,建议设为 30s 到 60s,过长会占用连接资源。
常见报错与避坑
改完参数重启Nginx时,如果报 socket() failed (24: Too many open files),说明systemd的LimitNOFILE没生效,用 systemctl show nginx | grep LimitNOFILE 确认。
如果调整后并发没提升,检查云服务商的安全组或负载均衡是否有连接数限制,这部分不在服务器内部。
不要盲目调大所有参数。tcp_tw_reuse 在NAT环境下可能引发问题,tcp_max_syn_backlog 超过65535在部分内核版本中不会生效。
每次只改一组参数,观察后再继续。
验证优化效果
重启服务后,用 ab 或 wrk 做一次简单压测,例如 wrk -t4 -c1000 -d30s http://你的域名/。
观察Nginx的 active connections,命令是 curl http://127.0.0.1/nginx_status(需先开启stub_status)。
如果连接数稳定在预期范围且无错误日志,说明优化起效。
判断标准:压测时 ss -s 显示的 estab 连接数能接近你设定的 worker_connections 总和,且 timewait 不会无限增长。
若仍出现超时,回看内核参数是否全部生效。
关于持久化与版本差异
不同Linux发行版的内核参数默认值有差异,Ubuntu和CentOS在 ip_local_port_range 上就不同。
建议以 sysctl -a 的实际输出为准,不要直接照搬网络上的旧文章。
所有修改都应在测试环境验证后再上生产。