百万并发下Nginx虚拟主机应采用哈希映射+配置分层+内核级连接复用,精简server块、用map动态路由、调大哈希参数、启用reuseport与aio,并通过模板化配置实现热加载。

百万并发下 Nginx 虚拟主机不是靠堆 server 块数量硬扛,而是靠结构化分离、动态路由和底层内核协同优化。核心思路是:**避免静态枚举每个域名,改用哈希映射 + 配置分层 + 内核级连接复用**。
精简 server 块,用 map 实现动态路由
手动写成百上千个 server { server_name site1.com; root /var/www/site1; } 会触发哈希冲突、内存暴涨、reload 卡顿。应统一用一个泛用 server 块配合 map 指令按 Host 头自动推导路径:
- 主配置中只保留一个通用 server(监听 80/443),不写具体 server_name
- 在 http 块里定义 map,例如:
map $host $site_root {
hostnames;
default /var/www/default;
~^(?.+)\.example\.com$ /var/www/$subdomain;
} - server 块内直接用 root $site_root;,无需重复声明每个域名
调大哈希参数,支撑海量域名
Nginx 默认的 server_names_hash_bucket_size 和 max_size 是为几十个域名设计的。百万级站点必须扩容,否则启动失败或匹配失准:
- server_names_hash_bucket_size 512;(非 64 或 128)——避免哈希桶溢出
- server_names_hash_max_size 4096;——支持数万级域名映射
- 这两个值需在全局块(main context)设置,且必须是 2 的幂次
启用 reuseport 和 aio 提升连接吞吐
单进程瓶颈是最大敌人。Linux kernel 3.9+ 支持的 reuseport 让多个 worker 进程能各自 bind 同一端口,彻底消除 accept 锁争用:
- 在 listen 指令后加 reuseport:
listen 80 reuseport; - 静态文件服务加速:aio threads=64; + directio 4m;(对大文件跳过 page cache)
- 搭配 worker_processes auto; 和 worker_connections 65535; 才能释放 reuseport 效能
配置分层与热加载机制
百万站点不可能每次增删都 reload 全局配置。推荐采用“模板 + 动态生成 + include”模式:
- 把通用逻辑(SSL 设置、日志格式、安全头)抽到 /etc/nginx/snippets/common.conf
- 站点元数据存数据库或 JSON 文件,由脚本定时生成 /etc/nginx/sites-enabled/*.conf
- 主配置仅含:
include /etc/nginx/sites-enabled/*.conf;
配合 nginx -t && nginx -s reload 实现秒级生效


















