nginx可通过多个server块共用同一proxy_pass实现多域名反向代理,依赖host头区分请求;也可单server块用server_name列表或正则匹配多域名;必要时用map按域名动态分发后端。

可以配置多个 server 块共用同一个 proxy_pass 地址,Nginx 会根据 Host 请求头自动区分域名,后端服务无需修改即可响应不同域名的请求。
多 server 块指向同一 proxy_pass
这是最常用也最清晰的方式。每个域名独立定义一个 server,但 location 内的 proxy_pass 指向相同的后端地址(如 http://127.0.0.1:8000)。
- 确保每个
server_name唯一且正确填写实际使用的域名(支持通配符或多个空格分隔) - 后端服务收到请求时,
Host头仍保留原始域名,可用于路由或日志识别 - 若需透传真实客户端 IP,记得加
proxy_set_header X-Real-IP $remote_addr;等头部
单 server 块匹配多个域名
用正则或列表方式在一个 server 中声明多个域名,减少重复配置。
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
- 写法示例:
server_name example.com www.example.com api.example.com; - 或用正则:
server_name ~^(www\.)?(example|test)\.com$; - 所有匹配到的域名都走同一个
location / { proxy_pass http://backend; }
注意后端服务对 Host 头的处理
共享后端时,关键在于后端是否依赖 Host 头做逻辑判断(比如多租户、静态资源路径、重定向 Location 生成等)。
- 默认情况下 Nginx 不修改
Host头,后端收到的就是浏览器发来的原始值 - 如果后端强制要求某个固定
Host,才需要显式设置:proxy_set_header Host $host;或指定值 - 避免误加
proxy_set_header Host $proxy_host;,否则所有域名都会被覆盖成后端地址,失去区分意义
可选:用 map 实现更灵活的后端分发
当不同域名需要指向不同后端端口或路径,但又想复用大部分代理逻辑时,可用 map 提前定义变量。
- 在
http块中定义:map $host $backend { example.com "http://127.0.0.1:8000"; test.com "http://127.0.0.1:8001"; default "http://127.0.0.1:8000"; } - 在
location中直接写:proxy_pass $backend; - 这种方式便于集中管理映射关系,适合域名较多或需动态调整的场景










