nginx海量虚拟主机性能退化主因是配置结构冗余而非并发高;需合并同类server块、统一ssl会话缓存至http块、精简指令集、合理设置worker进程与连接数,并全局复用公共配置。

性能退化往往不是因为并发高,而是配置结构本身带来的解析开销和内存冗余。关键不在压单请求内存,而在减少重复加载、共享状态、均衡负载。
合并同类 server 块,复用监听与 TLS 上下文
每个独立的 server 块都会被每个 worker 进程完整解析并驻留内存。域名达数百上千时,重复的 listen 443 ssl http2、重复证书路径、各自独立的 ssl_session_cache 配置会成倍放大内存消耗。
- 将多个 HTTPS 域名归入同一
server块,利用 SNI 自动匹配证书(需 Nginx ≥1.15.9):server { listen 443 ssl http2; server_name a.com b.com c.com; ssl_certificate /path/to/wildcard.crt; ssl_certificate_key /path/to/wildcard.key; } - SSL 会话缓存必须统一提至
http块:ssl_session_cache shared:SSL:10m;<br>ssl_session_timeout 4h;
避免在每个server中写ssl_session_cache builtin:1000这类低效私有缓存 - 静态资源站点可用
map指令按host动态设置根目录,大幅减少server块总数
精简指令集,剔除“隐形开销”
看似无害的配置项,在海量场景下会累积显著内存压力——每多一条未注释的 access_log、每个多余的 location ~ \.php$、每一个启用的 rewrite 正则,都会增加指令树深度与运行时匹配成本。
- 在
http块统一关闭非必需日志:access_log off;<br>log_not_found off;
仅对关键域名单独开启 - 静态服务优先用
try_files $uri =404;,禁用rewrite;若必须重写,改用return 301(无正则编译开销) - 删除所有测试路径(如
/phpmyadmin)、遗留管理入口、未使用的if判断和注释块——Nginx 启动时仍会解析注释行
控制 worker 进程与连接模型
worker 进程不是越多越好。过多进程会导致上下文切换增多、内存分配不均;盲目调高 worker_connections 又可能引发文件描述符耗尽或缓冲区过度预留。
-
worker_processes设为物理 CPU 核心数(非auto),尤其在容器环境能防止误判超线程为独立核心 -
worker_connections应结合预期并发量与系统ulimit -n设置,避免过度预留内存缓冲区 - 启用
reuseport(Nginx ≥1.9.1)可让内核更公平地分发连接,缓解单 worker 负载倾斜
统一全局配置,避免重复定义
把公共行为抽到 http 或 events 块,而不是在每个 server 中复制粘贴。
- Gzip、MIME 类型、默认编码、错误页等统一在
http块配置 - 使用
include引入标准化模板(如 H5BP 的security.conf、web_performance.conf),而非手动拼凑 - 通过
map或set+if(谨慎)实现条件逻辑,替代大量相似server块











