Nginx基于域名的反向代理核心是通过server_name匹配Host头并路由至对应upstream集群;需为每个域名配置独立server块,配合proxy_pass、upstream负载均衡及proxy_set_header传递真实请求头。

通过 Nginx 的 proxy_pass 实现基于域名的反向代理,核心是利用 server_name 匹配请求 Host 头,再将不同域名的流量分发到对应后端集群。这不是简单的“一个 proxy_pass 写到底”,而是需要按域名做逻辑隔离和路由分发。
按域名定义独立 server 块
每个要代理的域名应配置一个独立的 server 块,明确指定 server_name,避免 Host 头误匹配。Nginx 会根据请求中的 Host 字段精确(或通配)匹配这些块。
- 确保 DNS 已将域名解析到该 Nginx 服务器 IP
- 支持精确匹配(
app.example.com)、通配符(*.example.com)或正则(~^([a-z]+)\.example\.com$) - 多个域名可写在同一行,用空格分隔:
server_name api.example.com admin.example.com;
为每个域名配置专属 proxy_pass 和后端集群
在对应 server 块内,使用 proxy_pass 指向目标后端。推荐配合 upstream 块定义集群,便于负载均衡与健康检查。
- 定义 upstream 集群(放在 http 块中):
upstream cluster-a {<br> server 10.0.1.10:8080;<br> server 10.0.1.11:8080;<br> keepalive 32;<br>} - 在 server 块中引用:
location / {<br> proxy_pass http://cluster-a;<br> proxy_set_header Host $host;<br> proxy_set_header X-Real-IP $remote_addr;<br>} -
proxy_pass后不带 URI 路径(如不写/api/),则完整转发原始路径;若带路径(如proxy_pass http://backend/api/;),则会重写路径 —— 这点常被误用
注意关键代理头与协议一致性
后端服务依赖请求头判断来源、构建跳转链接或校验 Referer。缺失或错误的 header 可能导致 400、重定向异常或鉴权失败。
- 必须设置
proxy_set_header Host $host;(而非$http_host),保证 Host 值纯净,不带端口 - 添加
proxy_set_header X-Forwarded-For $remote_addr;传递真实客户端 IP - 若后端依赖 HTTPS 上下文(如生成全站链接),需显式传
X-Forwarded-Proto https;并配置proxy_redirect修正响应头中的 Location - 后端若为 HTTP/2 或 gRPC,需启用
http2协议并配置proxy_http_version 1.1;+proxy_set_header Upgrade $http_upgrade;
验证与调试技巧
上线前务必验证路由是否准确,尤其多域名共存时易出现 fallback 到 default_server 的情况。
- 用
curl -H "Host: app.example.com" http://nginx-ip/health模拟 Host 请求,绕过 DNS - 检查 Nginx 错误日志:
tail -f /var/log/nginx/error.log,关注 “no resolver defined”(DNS 解析失败)或 “connection refused”(后端不可达) - 开启
log_format记录$host、$upstream_addr和$upstream_http_x_backend等字段,定位实际转发目标 - 临时加
return 200 "Served by: app.example.com → $upstream_addr";快速确认路由逻辑











