多个域名共用一个upstream集群的核心是入口收敛与统一转发,即单个server块通过空格分隔多个server_name,共享同一upstream定义及proxy_pass,https下须使用覆盖全部域名的san证书。

多个域名共用一个 upstream 集群,核心是“入口收敛 + 统一转发”,不需要为每个域名单独写 server 块或重复 upstream 定义。
单个 server 块绑定多个 server_name
在同一个 server 块里,用空格分隔多个域名,Nginx 会将 Host 头匹配其中任一的请求都路由进来:
- 正确写法:server_name a.com b.com api.example.org;(空格分隔,无逗号、无引号、无换行)
- DNS 必须把所有这些域名解析到这台 Nginx 的 IP,否则请求根本进不来
- 如果这是唯一的 server 块,且没设 default_server,未匹配的 Host 请求也会落到它身上
proxy_pass 指向统一 upstream 名称
所有域名共享同一套后端集群,只需在 location 中统一指向已定义的 upstream 名:
- upstream 必须在 http 块顶层定义,例如:upstream backend_cluster { server 192.168.1.10:8080; server 192.168.1.11:8080; }
- proxy_pass 后直接跟 upstream 名,不能带斜杠或路径:proxy_pass http://backend_cluster;(✅),不是 proxy_pass http://backend_cluster/;(❌)
- 确保 proxy_pass 后的名称与 upstream 块名完全一致,大小写和拼写都不能错
透传原始 Host 和客户端信息
后端服务需要知道用户实际访问的是哪个域名,也需保留真实来源信息:
- proxy_set_header Host $host; —— 把原始 Host 头传给后端
- proxy_set_header X-Real-IP $remote_addr; —— 传递真实客户端 IP
- proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; —— 补全代理链路 IP
- 这些 header 只需配置一次,对所有 server_name 全局生效
HTTPS 场景注意事项
多个域名共用 HTTPS 时,证书必须覆盖全部域名:
- 使用 SAN(Subject Alternative Name)证书,把 a.com、b.com、api.example.org 都加进证书的 DNS Names 列表
- 不要用仅匹配单域名的证书,否则部分域名会触发浏览器证书警告
- server 块 listen 443 ssl 后,ssl_certificate 和 ssl_certificate_key 指向同一套证书文件











