nginx大促https稳态承载需四层协同调优:系统句柄、用户限制、进程声明、events精调,并配套ocsp stapling、会话复用、高效密钥套件等tls专项优化,盲目调高worker_connections无效。

要让 Nginx 在大促期间稳定承载 HTTPS 流量,worker_connections 不能单独调高——它只是并发能力的“刻度标尺”,真正起效必须和系统资源、内核参数、SSL 处理开销形成闭环。HTTPS 比 HTTP 多出 TLS 握手、密钥交换、加解密计算等环节,每个连接内存与 CPU 开销显著增加,盲目堆数值反而导致连接排队、握手超时、502/503 或 TLS handshake timeout。
先确认真实瓶颈再动配置
很多“HTTPS 扛不住”的现象,其实不是连接数不够,而是卡在 TLS 层或系统资源上:
- 查当前活跃 HTTPS 连接:
ss -s | grep "estab",对比worker_processes × worker_connections理论值 - 看错误日志:
grep "ssl.*handshake|accept.*failed" /var/log/nginx/error.log - 检查 TLS 握手耗时:用
openssl s_client -connect yourdomain.com:443 -servername yourdomain.com 2>&1 | grep "SSL handshake",若平均 >300ms,说明 CPU 或 SSL 缓存不足 - 运行
ulimit -n和cat /proc/$(pgrep nginx)/limits | grep "Max open files",确认进程实际 fd 限制是否达标
同步调优四层关键项
只改 worker_connections 是无效的,必须四项齐备:
-
系统级句柄上限:
fs.file-max至少设为worker_processes × worker_connections × 1.5(例如目标 8 万 HTTPS 连接,8 核配worker_connections 10000→fs.file-max ≥ 120000),写入/etc/sysctl.conf并执行sysctl -p -
用户级限制:在
/etc/security/limits.conf中添加(以 nginx 用户为例):nginx soft nofile 1048576nginx hard nofile 1048576
确保/etc/pam.d/common-session含session required pam_limits.so -
Nginx 进程级声明:在
nginx.conf全局块(http 外)加:worker_rlimit_nofile 1048576;(该值必须 ≥worker_connections,推荐设为相同值) -
events 块精调:
use epoll;multi_accept on;(一次收多个新连接,缓解突发 TLS 握手洪峰)accept_mutex off;(高并发 HTTPS 场景下,锁竞争比惊群更伤性能)
HTTPS 专项优化不可省略
TLS 开销大,需针对性减负:
- 启用 OCSP Stapling:减少客户端证书校验延迟
ssl_stapling on;ssl_stapling_verify on;resolver 8.8.8.8 114.114.114.114 valid=300s; - 复用会话缓存:避免重复握手
ssl_session_cache shared:SSL:10m;(10m ≈ 支持约 4 万个会话)ssl_session_timeout 4h; - 选用高效密码套件(兼顾安全与性能):
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;ssl_prefer_server_ciphers off; - 关闭不必要模块:如
ngx_http_realip_module多层 IP 解析、Lua 脚本等,减少 TLS 握手路径长度
数值设定要匹配硬件与流量特征
- 8 核 / 32GB 内存服务器,推荐起点:
worker_processes auto;worker_connections 16384;(理论总连接 ≈ 13 万,留出 TLS 缓冲区与日志 fd 余量) - 若大促期间大量短连接(如小程序首屏 HTTPS 请求),可适度提高至
32768,但必须同步调高ssl_session_cache容量与worker_rlimit_nofile - 若后端是 TLS 终结型网关(如 Envoy 前置),Nginx 只做 HTTP 代理,则
worker_connections可按纯 HTTP 场景设(如 65535),重点压测proxy_ssl_*参数
不复杂但容易忽略











