nginx 多域名反向代理通过独立 server 块按 host 路由,复用 upstream、ssl 配置和代理头实现合并管理;支持同后端共用、分后端模板复用及通配符动态路由三种模式,需执行 nginx -t 检查、reload 重载并验证 dns 解析。

Nginx 实现多域名合并反向代理,核心是复用同一套后端服务逻辑,但通过不同域名区分访问入口,统一由 Nginx 按 host 头路由到对应后端。它不是把多个域名“合并”成一个服务,而是让多个域名共用同一组反向代理规则(或差异化规则),由 server_name 和 location 协同控制流量分发。
关键在于:每个域名独立定义 server 块,但可共享相同的 upstream、相似的 proxy_pass 逻辑,甚至复用 SSL 配置或安全头,从而达到“合并管理、按需分流”的效果。
多域名共用同一后端服务(最简合并)
适用于多个域名指向同一套应用(如品牌镜像站、区域子站内容一致):
upstream app_backend {
server 127.0.0.1:3000;
}
server {
listen 443 ssl http2;
server_name site-a.com www.site-a.com;
include snippets/ssl-common.conf; # 公共证书与TLS配置
location / {
proxy_pass http://app_backend;
include snippets/proxy-headers.conf; # 统一代理头
}
}
server {
listen 443 ssl http2;
server_name site-b.com www.site-b.com;
include snippets/ssl-common.conf;
location / {
proxy_pass http://app_backend;
include snippets/proxy-headers.conf;
}
}
✅ 优势:
- 后端地址只写一次,修改一处全生效
- SSL 配置、安全头、超时参数等可抽离复用
- 新增域名只需复制
server块,改server_name即可
⚠️ 注意:
- 若后端应用依赖
Host头识别租户(如多租户 SaaS),需在proxy_set_header Host中保留原始域名,不能硬编码 -
upstream可配健康检查、负载策略,天然支持横向扩展
多域名指向不同后端,但共用代理模板(结构化合并)
适用于 blog.example.com、api.example.com、admin.example.com 等子域名,后端不同但代理逻辑高度一致:
# 抽取公共代理配置(保存为 /etc/nginx/snippets/proxy-common.conf)
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_connect_timeout 10s;
proxy_send_timeout 30s;
proxy_read_timeout 30s;
proxy_buffering on;
server {
listen 443 ssl http2;
server_name blog.example.com;
ssl_certificate /etc/letsencrypt/live/blog.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/blog.example.com/privkey.pem;
location / {
proxy_pass http://127.0.0.1:8080;
include snippets/proxy-common.conf;
}
}
server {
listen 443 ssl http2;
server_name api.example.com;
ssl_certificate /etc/letsencrypt/live/api.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/api.example.com/privkey.pem;
location / {
proxy_pass http://127.0.0.1:9000;
include snippets/proxy-common.conf;
}
location /v2/ {
proxy_pass http://127.0.0.1:9001;
include snippets/proxy-common.conf;
}
}
✅ 优势:
- 每个域名独立证书,保障 HTTPS 正确性
- 路径级代理(如
/v2/)可灵活切流,不破坏主逻辑 - 公共代理参数集中维护,避免重复出错
使用通配符证书 + 动态后端映射(高级合并)
适合大量子域名(如 user1.app.com、user2.app.com),后端按域名自动路由:
map $host $backend_port {
default 3000;
~^([a-z0-9]+)\.app\.com$ $1_port; # 需配合额外映射或脚本解析
}
# 更实用的做法:用变量拼接后端地址(需开启 resolver)
server {
listen 443 ssl http2;
server_name *.app.com;
ssl_certificate /etc/letsencrypt/live/app.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/app.com/privkey.pem;
location / {
set $upstream "http://backend-$host:3000";
proxy_pass $upstream;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
# 注意:动态 proxy_pass 需要 resolver,且不支持变量含端口以外的路径
}
}
⚠️ 实际建议:
-
map+upstream静态绑定更稳定(如预定义upstream user1 { server ...; }) - 动态解析适合容器/服务发现场景,需搭配 Consul 或 DNS resolver
- 通配符证书必须覆盖所有子域名(如
*.app.com),且需 Let’s Encrypt 支持 DNS-01 验证
必须验证的三项基础动作
-
语法检查:每次改完配置都执行
nginx -t,确认无语法错误 -
重载服务:用
nginx -s reload替代 restart,零中断生效 - 域名解析验证:确保各域名已正确解析到该 Nginx 服务器 IP,并开放 443/80 端口
不复杂但容易忽略细节。











