Nginx基于域名的虚拟主机隔离核心是每个域名独占server块、显式声明server_name、设置default_server兜底、静态与代理路径及日志完全分离,并为HTTP和HTTPS分别配置独立server块。

在 nginx.conf 中配置基于域名的虚拟主机隔离,核心是让每个域名拥有独立的 server 块,并确保请求能准确路由到对应站点,不互相干扰。关键不在“写在一起”,而在于“逻辑分离”和“兜底控制”。
每个域名必须有独立且明确的 server 块
不能把多个域名混在一个 server 里靠条件判断分发;Nginx 要求每个站点通过 server_name 显式声明自己响应哪些 Host。例如:
-
server_name example.com www.example.com;—— 精确匹配两个域名 -
server_name ~^api\..+\.example\.com$;—— 正则匹配所有 api.*.example.com 子域 -
server_name *.example.com;—— 通配符匹配一级子域(如 blog.example.com),但不匹配二级子域(如 a.blog.example.com)
必须设置 default_server 防止未匹配流量泄露
Nginx 默认把第一个 server 当作兜底。如果用户直接用 IP 访问、Host 头为空或拼错域名,就会落到这个块——可能暴露测试页、默认欢迎页甚至敏感信息。正确做法是单独设一个“拒绝型”兜底块:
- 监听
80和443端口时都加上default_server标志 - 返回
444(直接断连)或403(拒绝访问),避免响应任何内容 - 放在所有业务
server块之前,确保它被优先选中为默认
静态资源与代理要各自隔离路径和根目录
不同域名的服务不能共用 root 或 proxy_pass 目标,否则会交叉污染:
- 静态站:每个
server内设独立root /var/www/example.com/html; - 反向代理站:每个
server内设专属proxy_pass http://backend_example;,后端 upstream 名称也应区分 - 日志也要分开:
access_log /var/log/nginx/example.com.access.log;
HTTPS 必须单独配置,不可与 HTTP 混用
HTTP 和 HTTPS 是两个协议栈,Nginx 不允许同一 server 块同时处理两者。正确结构是:
- 一个
server { listen 80; server_name ...; return 301 https://$host$request_uri; } - 另一个
server { listen 443 ssl; server_name ...; ssl_certificate ...; ssl_certificate_key ...; ... } - 每个域名的 SSL 证书路径必须独立指定,不能复用


















