Nginx是大型架构的核心,下面我重点详解 Nginx 百万并发优化@mikechen
Nginx 并发能力最大化
Nginx 的并发能力由其进程模型决定,关键在于合理配置 Worker 进程数和每个进程的连接数。
进程与连接模型:Nginx 的总并发能力(理论最大值)约等于: worker_processes
worker_connections
。
worker_processes
:建议设置为 auto
/或 CPU 核心数。
避免设置过多,否则会引入不必要的上下文切换开销。
worker_connections
:尽其所能设置最大值。
通常可以设为 65535
甚至更高,比如:worker_connections 65535; 提升单进程连接能力。
worker_processes auto; worker_rlimit_nofile 1000000; events { use epoll; worker_connections 65535; multi_accept on; }
操作系统内核优化
Nginx 的并发上限首先受限于操作系统,特别是 Linux。
只有将内核参数调整到位,才能为 Nginx 提供足够的资源。
文件描述符 (FD) 限制:Nginx 每处理一个连接、打开一个文件,都需要一个 FD。
百万并发意味着需要百万级别的 FD,需要设置:提高系统和 Nginx 进程的 FD 上限。
修改 /etc/security/limits.conf
中的 nofile
(如 * soft nofile 655360
)。
在 Nginx 配置中(nginx.conf
的 main
块),使用 worker_rlimit_nofile 655360;
来确保 Worker 进程能使用这个上限。
Nginx配置优化
事件驱动模型:在 events
块中明确指定事件驱动模型,在 Linux 上使用最高效的 use epoll;
。
以及,长连接(Keepalive)优化:减少重复建立和关闭 TCP 连接的开销。
调整 keepalive_timeout 30s;
和 keepalive_requests 1000;
设置合理的超时时间,同时允许单个连接传输更多的请求。
# 示例配置片段
worker_processes auto;
worker_rlimit_nofile 655360;
events {
use epoll;
worker_connections 65535;
multi_accept on;
}
http {
keepalive_timeout 30;
keepalive_requests 1000;
# ... 其他配置
}
架构优化
单台 Nginx 硬件性能终有极限,要达到真正的“百万并发”,必须依赖集群和架构分层。
前端负载均衡:在 Nginx 集群前部署 L4/L7 负载均衡器 (如 LVS、HAProxy、或云厂商的 SLB) 或使用 DNS 轮询。
# 上层 LVS/Keepalived 负责调度到多台 Nginx upstream backend { server 10.0.0.1:8080 weight=3; server 10.0.0.2:8080 weight=2; server 10.0.0.3:8080 weight=1; } server { listen 80; location / { proxy_pass http://backend; } }
将流量分散到多台 Nginx 服务器上,实现横向扩展。
再动静分离,彻底将静态资源和动态业务请求分离。
将所有静态资源统一上传到 CDN(内容分发网络),让 CDN 承担绝大部分静态流量。