单个server块实现多域名指向同一后端的核心是server_name空格分隔多个域名,配合统一proxy_pass转发、$host变量识别来源、SAN证书支持HTTPS,并通过map或if做轻量差异化处理。

用单个 server 块实现多域名指向同一后端业务,本质是“入口收敛 + 域名识别 + 统一转发”,不依赖多个 server 块堆叠,也不需要为每个域名单独写一套 proxy 配置。
核心做法:一个 server 块绑定多个域名
在 server_name 后用空格并列所有目标域名,Nginx 会将这些域名全部路由到该块处理:
- 语法必须是空格分隔,不能用逗号、引号或换行;例如:
server_name a.example.com b.example.com c-api.example.com; - 只要 DNS 解析到这台 Nginx,且 HTTP 请求头中的 Host 匹配其中任一,就命中该块
- 若只配置一个 server 块,server_name 实际上不起过滤作用——所有未匹配其他块的请求都会落到它身上
后端转发保持统一,不随域名变化
既然所有域名共用同一套逻辑,proxy_pass 就直接指向固定 upstream 或 IP+端口,无需条件判断:
- 例如:
proxy_pass http://internal_app_cluster;(upstream 在 http 块中提前定义) - 可配合
proxy_set_header Host $host;透传原始域名,便于后端识别来源 - 如需路径重写或 header 补充(如加 X-Service-Name),也只需写一次,全局生效
按需做轻量级差异化处理
虽然后端相同,但不同域名可能有细微策略差异,可用变量和简单指令实现:
- 用
$host判断具体域名,做定向日志:access_log /var/log/nginx/app_a.log main if=$is_app_a;,配合map $host $is_app_a { a.example.com 1; default 0; } - 对特定域名强制跳转或加响应头:
if ($host = "b.example.com") { add_header X-Env "staging"; } - HTTPS 场景下,所有域名必须共用同一张 SAN 证书,Nginx 的 ssl_certificate 配置一次即可
注意 SNI 和 TLS 层兼容性
当启用 HTTPS 时,客户端需通过 SNI 指明请求的域名,Nginx 才能从证书列表中选出匹配项:
- 确保证书含所有 server_name 中列出的域名(即 SAN 多域名证书)
- 监听 443 端口时,
listen 443 ssl http2;必须带 ssl 参数,否则 SNI 不生效 - 若某域名不在证书 SAN 列表中,浏览器会报证书错误,与 Nginx 配置无关











