Nginx高并发服务器调优:扛住百万并发,网站配置这样改

Nginx高并发服务器调优:扛住百万并发,网站配置这样改

系统优化wl5net2026-11-08 15:11:18A+A-
约 3934 字 · 预计阅读 8 分钟

在日常的网站运维和流量承接过程中,很多站长和技术人员最怕的就是服务器突然“瘫痪”。明明服务器硬件配置拉满,可一遇到突发大流量、热点活动或者大促,网页依然打不开,甚至直接报502或504错误。其实,很多时候瓶颈并不在硬件性能本身,而在于你没有做好Nginx高并发服务器调优。作为目前主流的轻量级、高性能Web服务器,Nginx默认的初始配置通常偏向保守,根本无法发挥服务器的真正潜能。想要让它在万级甚至数十万并发请求面前游刃有余,就必须从操作系统内核、进程模型、网络参数和连接复用等多个维度进行系统化调优。

Nginx高并发服务器调优:扛住百万并发,网站配置这样改

一、 别忽略底层:Linux系统内核调优

很多人调优只盯着 nginx.conf 改,结果改完发现还是报错“Too many open files”。这是因为Nginx跑在Linux系统上,系统的底层限制决定了Nginx的能力上限。

  1. 调整系统最大文件打开数 Linux默认单进程能打开的文件描述符只有1024,在并发量大的情况下分分钟耗尽。 修改 /etc/security/limits.conf,在末尾追加:
    * soft nofile 655350
    * hard nofile 655350
    * soft nproc 655350
    * hard nproc 655350
  2. 优化内核网络参数 修改 /etc/sysctl.conf 文件,强化TCP连接处理能力:
    # 允许处于TIME_WAIT状态的socket快速复用于新的TCP连接
    net.ipv4.tcp_tw_reuse = 1
    # 缩短保持在FIN-WAIT-2状态的时间,加速socket释放
    net.ipv4.tcp_fin_timeout = 15
    # 增大TCP连接队列最大长度,避免突发连接被直接丢弃
    net.core.somaxconn = 65535
    # 系统中最多允许的TIME_WAIT套接字数量
    net.ipv4.tcp_max_tw_buckets = 60000
    # 增加backlog队列大小
    net.ipv4.tcp_max_syn_backlog = 65535

    修改后执行 sysctl -p 立即生效,这能从网络层面为Nginx提供充足的连接缓冲。


二、 Nginx全局核心参数调优

内核放行后,接下来就可以进入Nginx的主配置文件调整。

1. 进程数与CPU亲和力绑定

在配置文件的全局区域,修改工作进程相关的配置:

worker_processes auto;
worker_cpu_affinity auto;
worker_rlimit_nofile 655350;
  • worker_processes auto;:直接设为 auto,让Nginx自动根据CPU核心数启动对应数量的Worker进程,充分利用多核资源。
  • worker_cpu_affinity auto;:将工作进程分别绑定到不同的物理核心上,减少CPU上下文切换带来的性能损耗。
  • worker_rlimit_nofile 655350;:直接声明Nginx进程能打开的最大句柄数,确保与系统内核保持一致,彻底告别文件数受限的问题。

2. 事件模型(Events)深度配置

这是Nginx高效处理高并发连接的核心:

events {
    use epoll;
    worker_connections 65535;
    multi_accept on;
}
  • use epoll;:Linux平台最强I/O多路复用模型,Nginx在高并发下的核心引擎。
  • worker_connections 65535;:定义单个Worker进程的最大并发连接数。理论最大并发连接数 = worker_processes * worker_connections。
  • multi_accept on;:开启后,一个Worker进程在收到新连接通知时会尽可能一次性接收所有新连接,而不是每次只收一个,能有效减少握手排队延迟。

三、 HTTP核心传输与连接保持配置

进入 http 块后,核心目的是提升数据吞吐效率,并减少不必要的资源消耗。

http {
    include       mime.types;
    default_type  application/octet-stream;

    # 零拷贝优化传输
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;

    # 连接超时管理
    keepalive_timeout 65;
    keepalive_requests 10000;

    # 客户端请求缓冲区优化
    client_body_buffer_size 128k;
    client_max_body_size 50m;
    client_header_buffer_size 4k;
    large_client_header_buffers 4 16k;
}
  • sendfile on;:开启零拷贝传输,文件数据无需经过用户空间缓冲区直接从内核发往网卡,极大减轻CPU负担。
  • tcp_nopush on; 与 tcp_nodelay on;:前者将数据包积累到最大报文段(MSS)再发送,后者禁用Nagle算法实现低延迟响应。两者搭配使用可以在传输静态文件时跑满带宽,同时保证小数据包即刻发出。
  • keepalive_requests 10000;:极大提高单个长连接复用的请求次数,有效避免大并发下频繁创建和销毁TCP握手。

四、 动静分离与代理长连接优化

如果你的Nginx主要充当反向代理角色(例如后面挂着Node.js、Java、Go或PHP应用),那么最致命的性能瓶颈往往出在“Nginx到后端应用”这一段。

1. 代理长连接保持

很多初学者忽略了:Nginx默认对Upstream后端使用的是短连接(HTTP/1.0)。每次请求后端都要重新走三次握手,极易把后端的端口号耗尽,导致502错误。

upstream backend_server {
    server 127.0.0.1:8080 max_fails=3 fail_timeout=30s;
    # 保持与后端的空闲长连接数量
    keepalive 300;
}

server {
    listen 80;
    location / {
        proxy_pass http://backend_server;
        # 强制使用 HTTP/1.1 协议
        proxy_http_version 1.1;
        # 清除 Connection 头部以维持长连接
        proxy_set_header Connection "";
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

通过上述配置,Nginx和后端服务器之间会维持一个连接池,减少了海量的网络握手和挥手消耗,吞吐量往往能直接翻倍。

2. Gzip智能压缩控制

开启Gzip压缩可以大幅缩减传输体积,但压缩级别太高会剧烈消耗CPU:

gzip on;
gzip_min_length 1k;
gzip_comp_level 4; # 推荐4-6,性噪比最佳
gzip_types text/plain text/css application/json application/javascript text/xml;
gzip_vary on;

将压缩级别控制在 4 左右,既能获得极佳的压缩比,又不会让Nginx把计算资源全耗在文本压缩上。


五、 兜底防御:高并发下的安全限流

面对高并发,除了“扛”,更要“防”。未加防范的恶意爬虫或攻击会轻而易举吃光调优释放出的性能。

# 限制IP访问频率(每秒限制10次,漏桶原理)
limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s;

# 限制单个IP并发连接数
limit_conn_zone $binary_remote_addr zone=conn_limit:10m;

server {
    location / {
        limit_req zone=req_limit burst=20 nodelay;
        limit_conn conn_limit 20;
    }
}

通过 limit_req 和 limit_conn 限制单IP的请求频次与最大连接数,可以保护核心接口不被瞬时垃圾流量打崩,确保真实用户的正常访问。

总结

对Nginx进行高并发调优从来不是简单地套用某几个参数,而是一个由下至上的系统工程:先拓宽系统底层的句柄与网络通道,再打通Nginx的多核调度与事件处理能力,最后通过长连接复用与缓冲限流筑牢安全防线。在完成上述改动后,记得先运行 nginx -t 测试配置文件语法,再通过 nginx -s reload 无缝热加载生效。结合压测工具(如wrk或JMeter)边测边调,你的Web架构才能在真正的海量流量冲击下稳如泰山。

点击这里复制本文地址 以上内容由未来技术网整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!

网站地图 robots.txt 网站死链 关于本站 工信部备案号浙ICP备2026012592号-2 浙公网安备33102402000669号