nginx 支撑百万级虚拟主机需将配置动态化:精简 http 块仅留核心参数与哈希调优,用 map 指令泛化子域名匹配,通过 etcd/consul 等配置中心 + watcher 实现毫秒级热更新,并辅以 reuseport、aio、文件缓存等底层性能加固。

要让 Nginx 的 http 块支撑超大规模虚拟主机(比如数十万至百万级)的动态加载,关键不是写更多 server 块,而是把配置从静态文件中“移出来”,转为运行时按需解析、内存级哈希查找、毫秒级热更新。
精简 http 块,只留骨架和核心调优项
主配置中的 http 块必须极轻量,不嵌套任何具体站点逻辑:
- 仅保留基础参数:如
sendfile on、tcp_nopush on、keepalive_timeout 65 - 强制调优域名哈希:设
server_names_hash_bucket_size 512和server_names_hash_max_size 8192,避免因海量域名导致哈希冲突或查找失败 - 用
include预留扩展入口:例如include /etc/nginx/conf.d/*.conf;,后续由外部服务自动生成并写入分片配置
用 map 指令替代海量 server 块
对子域名泛化场景(如 user123.example.com),完全不用为每个租户建 server:
- 在
http块内定义映射:map $host $site_root { hostnames; default /var/www/default; ~^(?<sub>.+)\.example\.com$ /var/www/$sub; }</sub> - 配一个通用
server:server { listen 80; server_name ~^.+\.example\.com$; root $site_root; index index.html; } - 新增子域只需确保后端目录存在,Nginx 不需 reload 即可生效
对接配置中心实现毫秒级动态加载
靠人工 nginx -s reload 维护百万级站点不可行,需引入外部协调机制:
- 选用 etcd、Consul 或轻量 API 服务作为配置源,存储租户域名、根路径、SSL 状态等元数据
- 部署 Watcher 服务监听变更,触发时生成对应 conf 片段(如按哈希分片写入
/etc/nginx/conf.d/tenant_a.conf) - 执行
nginx -t && nginx -s reload—— reload 是原子操作,毫秒完成,已有连接不受影响 - 配合
reuseport on和多 worker 进程,进一步降低 reload 瞬间抖动
配套底层性能加固不可少
动态加载只是上层逻辑,底层参数必须同步适配高并发压力:
-
worker_processes auto;+worker_cpu_affinity auto;,充分榨干多核资源 -
reuseport on;提升连接接入吞吐(实测提升约 3 倍) -
aio threads=64;+directio 4m;加速大文件静态服务 -
open_file_cache max=10000 inactive=20s;缓存句柄,减少stat()系统调用开销











