可通过单个server块配置多个空格分隔的域名(如server_name a.com b.com c.com),配合proxy_pass指向同一后端并透传$host头实现多域名共用;https需使用覆盖全部域名的san证书。

可以,但不是“多域名共用一个后端服务”的字面意思,而是让多个域名都指向同一个后端地址——这在 Nginx 中完全可行,常见于品牌矩阵、灰度发布、多语言站点或白标(white-label)场景。关键在于:server_name 可以配置多个域名,而 proxy_pass 指向同一目标,无需额外路径改写。
多个域名映射到同一个后端
比如你有一套 Web 应用运行在 http://127.0.0.1:3000,希望它同时响应以下三个域名:
- yoursite.com
- www.yoursite.com
- brand-a.com
只需在一个 server 块里声明全部域名,并统一转发:
server {
listen 80;
server_name yoursite.com www.yoursite.com brand-a.com;
location / {
proxy_pass http://127.0.0.1:3000/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
注意:server_name 后跟多个空格分隔的域名是合法且推荐的写法,比通配符更明确、更安全;proxy_pass 末尾加 / 是为了剥离 location 匹配路径(这里匹配 /,所以不改变原始 URI)。
后端需识别当前访问域名
虽然所有请求都打到同一个后端,但后端应用往往需要知道用户是通过哪个域名进来的(比如生成绝对链接、做品牌定制、或跳转逻辑)。这时依赖的是 Nginx 透传的请求头:
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
-
Host $host:把原始请求的 Host 头原样传给后端,Node.js/Express 中可通过
req.headers.host获取 -
X-Forwarded-Host(可选):如果想显式传递,可加
proxy_set_header X-Forwarded-Host $host; - 后端若依赖 Referer 或 Cookie 做域判断,也要确保这些头未被意外过滤
HTTPS 下证书怎么配
多个域名共用一个后端,不代表能共用一张证书。SSL 证书必须覆盖所有 server_name 中声明的域名:
- 单域名证书:只支持 yoursite.com → 不适用
- 泛域名证书:*.yoursite.com → 覆盖 www.yoursite.com,但不覆盖 brand-a.com
- 多域名证书(SAN 证书):包含 yoursite.com、www.yoursite.com、brand-a.com → 推荐方案
配置示例:
server {
listen 443 ssl;
server_name yoursite.com www.yoursite.com brand-a.com;
ssl_certificate /etc/nginx/ssl/multi-domain.crt;
ssl_certificate_key /etc/nginx/ssl/multi-domain.key;
# … 其他 proxy 配置同上
}
需要区分行为?加 location 或 if 判断
如果不同域名要走不同逻辑(比如 brand-a.com 需要重写路径、或加载不同静态资源),就不能全靠 proxy_pass 统一转发。可用以下方式:
- 按域名拆成多个 server 块:更清晰,利于独立配置 SSL、缓存、日志
- 在同一个 server 内用 if + map 模块做变量路由:例如根据 $host 设置不同的 proxy_pass 目标或 header
- 用 location 正则匹配 Host(不推荐,性能略低且易出错)
简单起见,多数情况直接分 server 块更稳妥,尤其涉及 HTTPS 或差异化策略时。










