温馨提示×

ubuntu nginx并发连接数如何提升

小樊
44
2025-12-24 22:20:13
栏目: 智能运维

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
        • soft nofile 65535
        • hard nofile 65535
      • 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(减少频繁建连)。
  • 队列与内核瓶颈:调高 somaxconntcp_max_syn_backlognetdev_max_backlog,并匹配 rmem/wmem 缓冲。
  • 工作进程与连接数匹配:确保 worker_rlimit_nofile ≥ worker_processes × worker_connections,避免“打开文件数不足”限制并发。
  • 长连接与代理场景:为 upstream 配置 keepalive(如 keepalive 32),减少后端连接开销;静态资源启用强缓存,降低连接占用时间。

0