Nginx虚拟主机通过server块和Host头匹配实现一机多站,推荐按域名分文件管理;大规模场景用map指令动态映射;需调优server_names_hash_bucket_size、max_size等参数;容器化可借助nginx-proxy自动配置。

Nginx 的 Virtual Host(虚拟主机)本质是通过 server 块区分不同站点,核心靠 Host 请求头匹配 server_name,实现“一机多站”。配置不难,但管理规模上去后,结构和参数必须提前规划。
按域名配置独立站点
这是最常用方式,每个域名对应一个 server 块。Nginx 启动时读取所有匹配的 server_name,请求进来时根据 Host 头精确或模糊匹配。
-
server_name支持精确匹配(example.com)、通配符(*.example.com)、正则(~^www\d+\.example\.com$) - 推荐把每个站点单独写成
/etc/nginx/sites-available/example.com,再用软链启用到sites-enabled/ - 避免在主配置里堆砌多个
server,否则 reload 时易出错且难维护
动态泛域名与自动映射
当子域名数量大(如用户自助建站、SaaS 多租户),硬编码每个 server 不现实,改用 map 指令做运行时映射:
- 在
http块中定义map $host $site_root { ... },把域名解析为路径变量 -
server块内直接用root /var/www/$site_root;,无需生成上百个配置文件 - 配合
include /etc/nginx/sites-enabled/*;,可让自动化脚本生成或更新配置后仅 reload 即生效
关键性能参数必须调优
默认值只适合小规模站点,百万级域名或高并发下必须调整,否则会报 could not build server_names_hash 或响应变慢:
-
server_names_hash_bucket_size 256;—— 防止哈希桶溢出,尤其含长域名时 -
server_names_hash_max_size 4096;—— 支持更多server_name条目 -
reuseport on;—— 让每个 worker 进程独立监听端口,提升连接分发效率 -
aio threads=64;+directio 4m;—— 对大静态文件读取加速明显
用 nginx-proxy 简化容器化部署
在 Docker 环境中,不用手写 server 块,改用 nginx-proxy 自动发现服务:
- 容器启动时设置
VIRTUAL_HOST=site1.com,www.site1.com,api.site1.com - 支持逗号分隔多域名、跨域混搭(
site.net,admin.site.com) - 搭配
DEFAULT_HOST可兜底未匹配请求,避免暴露默认页 - 证书自动续期(配合
acme-companion)也能一并托管


















