一、先看并发模型
Nginx 采用 master-worker 模型,master 负责管理 worker,worker 处理连接和请求。它通过事件驱动处理大量连接,因此高并发能力强。但默认配置不一定适合生产,worker 数、连接数、文件描述符、keepalive 和系统内核参数都可能成为瓶颈。
| 配置 | 作用 | 常见关注点 |
|---|---|---|
| worker_processes | worker数量 | 通常按CPU核数 |
| worker_connections | 单worker连接上限 | 受文件描述符限制 |
| keepalive_timeout | 长连接保持时间 | 太长占连接 |
| worker_rlimit_nofile | worker文件上限 | 要配合系统ulimit |
理论最大连接数约为worker_processes * worker_connections,但反向代理场景中,一个客户端请求可能还占用到后端的连接,实际容量要打折。
二、worker和连接数配置
生产配置可以从worker_processes auto开始,让 Nginx 按 CPU 核数创建 worker。worker_connections要结合内存、文件描述符和业务请求模型设置。
user nginx; worker_processes auto; worker_rlimit_nofile 200000; events { use epoll; worker_connections 65535; multi_accept on; }epoll是 Linux 下高并发常用事件模型。multi_accept可以让 worker 一次接受尽可能多的新连接,但在极端流量下可能造成单个 worker 忙碌,需要结合压测观察。修改后要用nginx -t检查配置,再平滑 reload。
三、系统限制必须同步调整
只改 Nginx 配置不够。Linux 的ulimit、systemd 限制、内核网络队列都会影响高并发表现。如果 Nginx 日志出现too many open files,说明文件描述符上限不足。
# /etc/systemd/system/nginx.service.d/override.conf [Service] LimitNOFILE=200000systemctl daemon-reload systemctl restart nginxcat/proc/$(pgrep-nnginx)/limits同时可以根据场景调整net.core.somaxconn、net.ipv4.ip_local_port_range、net.ipv4.tcp_tw_reuse等参数。但内核参数不要复制粘贴,必须结合连接方向、短连接比例和压测结果。
四、代理场景的超时和keepalive
高并发下,连接保持时间影响非常大。keepalive_timeout太长会让空闲连接占用资源,太短又会增加握手开销。后端 upstream 也应启用 keepalive,减少 Nginx 到应用的重复建连。
upstream app { server 10.0.1.10:8080; server 10.0.1.11:8080; keepalive 128; } location / { proxy_http_version 1.1; proxy_set_header Connection ""; proxy_connect_timeout 2s; proxy_read_timeout 10s; proxy_pass http://app; }调优必须基于指标:活跃连接、等待连接、请求耗时、499/502/504、CPU、内存和后端连接池。Nginx 高并发不是把数字调大,而是让入口、系统限制和后端承载能力保持一致。
压测时要区分静态资源、普通 API、长轮询和大文件下载。不同请求对连接、带宽、磁盘和后端线程的压力完全不同。若业务大量使用 HTTPS,还要观察握手开销和证书配置,必要时启用会话复用。访问日志也要采样或异步写入,避免高峰期日志 IO 反过来拖慢请求。真正有效的调优,是从业务流量模型出发建立容量基线。
还要为异常流量准备保护措施。可以按 IP、接口或租户做限流,对上传接口单独限制请求体大小,对慢请求设置更短的上游超时。入口层保护不是为了替业务兜底所有问题,而是在后端异常时延缓雪崩。调优完成后,应记录压测方法、配置版本和容量结论,方便下次扩容或迁移时复用。
配置上线后还要持续观察峰谷差异,避免只按平均流量判断容量。
📌 本文是《服务部署与运维》系列,持续更新,关注不迷路。
👉 下一篇:《云原生CI/CD流水线设计与GitOps实践》,讲入口容量稳定后如何把配置变更纳入持续交付。
💬 你在实际项目里遇到过 worker 连接数调大后吞吐量反而没有提升的问题吗?评论区聊聊。
(觉得有用点个赞+收藏,方便回头查阅)
🔧 相关可运行源码/资料已整理成资源包,可在我主页的资源里自取。
☁️ 本文示例需要一台云服务器,新用户可通过此链接领取优惠自用:https://cloud.tencent.com/act/cps/redirect?redirect=2446&cps_key=49a769c067bd9c9f53fcb1bdf9feaf23&from=console&cps_promotion_id=102832