keepalive_timeout与keepalive_requests共同决定长连接生命周期,取二者先触发者;api场景建议30–65s和1000,需协同worker进程、系统文件描述符及内核参数调优。

要让 Nginx 稳定维持高并发连接,关键不是“拼命开大连接数”,而是让每个连接更轻、更久、更可控——核心在连接生命周期管理,而非单纯堆参数。
合理设置 keepalive_timeout 与 keepalive_requests
长连接是降低 TCP 开销、提升并发能力的基础。但超时时间过长会积压大量空闲连接,过短又频繁重建,得根据业务类型平衡:
- API 服务或网关类场景:建议 keepalive_timeout 30–65s,keepalive_requests 1000;既减少握手次数,又避免单连接长期霸占资源
- 静态资源(图片/JS/CSS)或 CDN 边缘节点:可延长至 keepalive_timeout 300s,因请求模式简单、复用率高
- WebSocket 或长轮询服务:需配合 proxy_read_timeout 和后端心跳,keepalive_timeout 可设为 300–600s,并确保 upstream 也启用 keepalive
协同调优 worker 进程与单进程连接上限
最大并发连接数 = worker_processes × worker_connections,但这个数字必须落在系统能力范围内:
- worker_processes auto 是安全起点;若 CPU 核心多(如 16 核),可手动设为 16 或 32,并搭配 worker_cpu_affinity 绑核,减少上下文切换
-
worker_connections 建议设为 8192–65535,但必须同步调整:
— nginx 内部:添加 worker_rlimit_nofile 65535
— 系统级:修改 /etc/security/limits.conf 中 * soft nofile 65535 和 * hard nofile 65535,再执行 ulimit -n 验证生效 - 别忘了内核限制:sysctl -w net.core.somaxconn=65535,否则 listen 队列会截断新连接
减少连接无效等待,主动释放资源
除了 keepalive,还需控制其他环节的“空等”时间,防止连接卡在中间状态:
- client_header_timeout 15s:防止恶意客户端缓慢发送请求头
- client_body_timeout 10–30s:上传大文件时可适当放宽,但普通接口建议 ≤15s
- send_timeout 2–10s:服务器发响应过程中卡住太久(如后端慢、网络抖动),及时断开释放连接
- 用 ss -s 或 netstat -an | grep :80 | awk '{print $6}' | sort | uniq -c 定期检查连接状态;若 TIME_WAIT >10%,需开启 net.ipv4.tcp_tw_reuse = 1(仅对客户端为公网 IP 有效)
启用高效事件模型与连接接收策略
Linux 下必须用对底层机制,否则高并发下性能会断崖下跌:
- events 块中明确指定 use epoll(默认已启用,但显式声明更稳妥)
- multi_accept on:让一个 worker 唤醒时尽可能多地 accept 新连接,减少惊群和排队延迟
- accept_mutex on(默认开启):避免多个 worker 同时争抢 accept,降低锁竞争
- 配合 tcp_nodelay on(禁用 Nagle 算法),对小包响应敏感的场景(如 API)更友好











