nginx承载万级域名靠配置精简与匹配高效:优先精确匹配server_name,高频域名用精确配置,二级子域用正则+map动态映射,启用server_names_hash_max_size、reuseport等调优参数,并通过include+map实现无感化热更新与日志分片。

一台 Nginx 服务器承载万级独立域名,不是靠堆硬件,而是靠配置精简、匹配高效、加载轻量。核心不在“能不能加”,而在“怎么让每次请求都跳过冗余判断、快速命中目标”。
server_name 匹配机制必须理清
Nginx 对 server_name 的匹配有严格优先级:精确匹配 → 前缀通配符(*.example.com)→ 后缀通配符(www.*)→ 正则匹配。只要命中就停止搜索,所以万级域名不能全写成正则,也不能全靠 _ 或泛用 *。
- 高频主站(如 top100 域名)单独写精确 server_name,走哈希直查,毫秒级响应
- 二级子域统一归类,用 ~^([a-z0-9\-]+)\.company\.com$ 一类正则捕获变量,配合 map 指令动态映射根目录
- 避免在单个 server 块里堆几十个 server_name,会拖慢哈希桶查找;拆成多个独立 server 块更利于 Nginx 内部索引优化
启用动态虚拟主机架构
手动维护上万个配置文件不可行。推荐用 include + map + 变量路由 实现中心化管理:
- 在主配置中启用:include /etc/nginx/conf.d/vhosts/*.conf;,再用脚本按需生成或热更新
- 用 map 指令做域名到路径/后端的软映射,例如:
map $host $site_root {
hostnames;
default /var/www/default;
~^(?.+)\.app\.com$ /var/www/apps/$sub;
} - 所有 server 块共用一个监听块,root 改为 root $site_root;,大幅减少内存占用和 reload 开销
关键性能参数必须调优
默认参数只适合几十个站点,万级域名必须重设哈希与连接底层:
- server_names_hash_max_size 4096(默认 512):支持更多唯一域名条目
- server_names_hash_bucket_size 512(默认 64):避免哈希冲突导致线性扫描
- reuseport on:内核级端口复用,多 worker 并行处理连接,吞吐翻倍
- aio threads=64 + directio 4k:大静态文件读取不阻塞主线程
日志与 reload 必须无感化
万级域名下,每改一个配置就 nginx -s reload 会导致连接中断、CPU 尖峰、日志刷屏:
- 禁用每个虚拟主机的 access_log,统一用 log_format + map 动态打标,按需写入分片日志
- 用 nginx -t 校验后,改用 nginx -s reload 替代 systemctl restart,避免进程重启
- 对非核心变更(如 index.html 更新),直接替换文件+清理 open_file_cache,无需 reload











