nginx支撑百万至百亿并发需配置、内核与架构协同优化:worker_processes设8或12(≥16核时),worker_connections按峰值×1.2设定,同步调高nofile、启用epoll+multi_accept、上游keepalive连接池、分层收紧缓冲区并放开系统限制。

Nginx 能扛住百万甚至百亿级并发,靠的不是堆机器,而是配置、内核和架构三者协同压榨每一分资源。关键不在“能不能”,而在“怎么配得准、控得住、收得稳”。
worker 进程与连接数要匹配硬件真实能力
设太多 worker 进程反而拖慢性能——64 核服务器上启 64 个 worker,上下文切换开销和内存碎片会明显上升。建议:CPU ≥ 16 核时,显式设 worker_processes 8 或 12;搭配 worker_connections 按单机峰值连接 ×1.2 设置(例如预期 3 万长连接,设为 32768 即可),避免盲目拉到 65535。
同时必须配齐:
- worker_rlimit_nofile 设为与系统 ulimit 一致(如 65535)
- use epoll + multi_accept on,让单次事件循环尽可能多收连接
- worker_cpu_affinity auto,自动绑定 NUMA 节点,减少缓存失效
上游连接必须用 keepalive 池,不能每请求建一次
默认短连接模式在百亿请求下会导致海量 TIME_WAIT、内核 socket 缓冲耗尽、后端反复握手。正确做法是:
- upstream 块中启用:keepalive 200(100–300 区间按后端吞吐微调)
- server 块中强制 HTTP/1.1 并清空 Connection 头:proxy_http_version 1.1; proxy_set_header Connection "";
- proxy_read_timeout 设为略小于后端 keepalive timeout(如后端设 60s,Nginx 设 55s),防止主动断连引发连接泄漏
缓冲区必须分层收紧,防攻击也省内存
默认 client_header_buffer_size 8k + large_client_header_buffers 4 8k,恶意构造 header 可瞬间触发数 GB 内存分配。实际业务中,普通域名+标准 UA 完全不需要那么大:
- client_header_buffer_size 1k
- large_client_header_buffers 2 2k(header 总量上限 4KB)
- client_body_buffer_size 按业务最大上传体设(如 16k 或 128k),不传大文件就别留 128k 默认值
- 关闭非必需日志:access_log off 或只记 error;禁用未用模块(如 perl、xslt)
系统层限制必须同步放开
Nginx 配置再优,卡在系统限制上也白搭:
- /etc/security/limits.conf 加:* soft nofile 65535 和 * hard nofile 65535
- /etc/sysctl.conf 加:fs.file-max = 2000000,再执行 sysctl -p
- 可选强化 TCP:net.ipv4.tcp_syncookies = 1,缓解 SYN Flood











