Ubuntu 下提升 Nginx 并发连接数的实用步骤
一 核心原理与上限估算
- 并发能力主要由三个因素决定:worker_processes × worker_connections,并受系统对文件描述符与内核网络参数的限制。
- 经验与官方建议:
- 将 worker_processes 设为 CPU 核心数或 auto;若主要为 SSL/gzip 等 CPU 密集场景,更应匹配核心数;若大量静态小文件且超出内存,可适当增加进程数以利用磁盘带宽。
- 将 worker_connections 提升到 8192~65535 区间需配合系统调优,不宜盲目拉满。
- 上限估算与内存开销:
- 理论最大并发连接数 ≈ worker_processes × worker_connections(实际还受端口、后端连接等约束)。
- 每个连接在内核事件层面约占用 ~328 字节(读/写事件与连接结构),例如 100000 连接约 31 MB 级别内存开销,量级可控但需结合业务与实例规格评估。
二 Nginx 配置优化
- 建议将以下关键项写入 /etc/nginx/nginx.conf 的顶层或 http 块:
- 进程与文件句柄
- worker_processes auto;
- worker_rlimit_nofile 65535;
- 事件模型与连接
- events { use epoll; worker_connections 8192; multi_accept on; }
- 传输与协议
- http { sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; }
- 压缩与缓存(减少传输量、降低连接占用时间)
- gzip on; gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; gzip_min_length 256; gzip_comp_level 6; gzip_vary on;
- 静态资源缓存:location ~* .(jpg|jpeg|png|gif|ico|css|js|woff2)$ { expires 365d; add_header Cache-Control “public, no-transform”; }
- 启用 HTTP/2/TLS1.3(提升并发与握手效率)
- listen 443 ssl http2; ssl_protocols TLSv1.2 TLSv1.3;
- 验证与生效
- 语法检查:sudo nginx -t
- 热重载:sudo systemctl reload nginx
- 检查 HTTP/2:curl -I --http2 https://你的域名
三 系统与内核参数调优
- 文件描述符与 PAM 会话限制
- /etc/security/limits.conf
-
-
- root soft nofile 65535
- root hard nofile 65535
- /etc/pam.d/common-session 与 /etc/pam.d/common-session-noninteractive 确保包含:session required pam_limits.so
- 内核网络参数(/etc/sysctl.conf 或 sysctl.d 配置)
- fs.file-max = 2097152
- net.core.somaxconn = 65535
- net.ipv4.tcp_tw_reuse = 1
- net.ipv4.ip_local_port_range = 1024 65535
- net.ipv4.tcp_fin_timeout = 30
- net.ipv4.tcp_max_syn_backlog = 20480
- net.core.netdev_max_backlog = 50000
- net.core.rmem_max = 16777216
- net.core.wmem_max = 16777216
- net.ipv4.tcp_rmem = 4096 12582912 16777216
- net.ipv4.tcp_wmem = 4096 12582912 16777216
- 应用与验证
- sysctl -p
- 验证:ulimit -n、cat /proc//limits、ss -s
四 监控与压测
- 启用状态页监控
- 在 server 块添加:location /nginx-status { stub_status on; access_log off; }
- 访问查看:Active connections、accepts/handled/requests、Reading/Writing/Waiting
- 压测与观测
- ab/wrk/hey 等工具进行渐进式压测,观察 Active connections、每秒请求数、错误率与 TIME_WAIT 数量变化
- 结合日志与监控,逐步微调 worker_connections、keepalive_timeout、内核队列与端口范围等参数,避免一次性拉满导致不稳定
五 常见瓶颈与排查要点
- 文件描述符不足:出现 “too many open files” 时,同步提升 worker_rlimit_nofile 与系统 nofile,并确认 PAM 已加载 limits 模块。
- 端口与连接耗尽:扩大 ip_local_port_range、开启 tcp_tw_reuse,并合理设置 keepalive_timeout 与后端 keepalive(减少频繁建连)。
- 队列与内核瓶颈:调高 somaxconn、tcp_max_syn_backlog、netdev_max_backlog,并匹配 rmem/wmem 缓冲。
- 工作进程与连接数匹配:确保 worker_rlimit_nofile ≥ worker_processes × worker_connections,避免“打开文件数不足”限制并发。
- 长连接与代理场景:为 upstream 配置 keepalive(如 keepalive 32),减少后端连接开销;静态资源启用强缓存,降低连接占用时间。