nginx通过独立server块+server_name匹配host头,结合proxy_pass实现按域名分发流量;需精确配置匹配规则、使用upstream抽象后端、透传关键请求头,并设default_server兜底。

通过 Nginx 的 server 块配合 proxy_pass,可以基于请求的域名(Host 头)将流量分发到不同的后端集群。核心在于利用 server_name 指令匹配不同域名,并为每个域名配置独立的反向代理规则。
按域名区分 server 块是最直接的方式
每个需要反代的域名都定义一个独立的 server 块,Nginx 会根据 HTTP 请求中的 Host 头自动选择匹配的块。这种方式清晰、隔离性强,适合域名数量不多但后端差异大的场景。
- 确保每个
server块的server_name精确或通配匹配目标域名,例如:server_name api.example.com;或server_name *.example.org; - 在对应块内使用
proxy_pass指向各自的后端集群地址,如:proxy_pass http://backend-api-cluster; - 记得为每个
server块配置listen 443 ssl(如需 HTTPS)并加载对应证书,避免 SNI 冲突。
复用同一端口时注意 Host 头匹配优先级
Nginx 按照配置文件中 server 块出现的顺序尝试匹配 server_name,精确匹配 > 通配符开头(*.example.com)> 通配符结尾(www.example.*)> 默认 server(default_server)。若多个域名共用一个 IP 和端口,必须保证没有歧义。
安装并运行 Aperture(Lightning Labs 的 L402 闪电反向代理),用于创建 L402 付费墙、配置付费 API 端点、为其他代理托管付费内容或测试 L402 认证流程。
- 避免写成
server_name example.com *.example.com;这类重叠配置,可能导致意外匹配 - 建议为每个业务域名单独写一个
server块,并在末尾加一个带default_server的兜底块,返回 444 或 404,便于排查未覆盖的请求 - 可通过
nginx -t验证配置语法,并用curl -H "Host: test.example.com" http://your-nginx-ip测试路由是否正确
后端集群建议用 upstream 做健康检查与负载均衡
不要在 proxy_pass 中硬写 IP+端口,而是把后端节点抽象为命名 upstream 块。这样既支持多实例轮询/权重/健康检查,又便于维护和灰度发布。
- 在
http块外或顶部定义 upstream,例如:upstream backend-user {<br> server 10.0.1.10:8080 max_fails=2 fail_timeout=10s;<br> server 10.0.1.11:8080 max_fails=2 fail_timeout=10s;<br>} - 在对应
server块中直接引用:proxy_pass http://backend-user; - 可配合
proxy_next_upstream error timeout http_500;实现故障转移
注意客户端头信息透传与后端识别
后端服务常依赖原始 Host、真实 IP、协议类型等信息做鉴权或生成链接。默认情况下 Nginx 不会转发这些字段,需显式设置。
- 保留原始 Host:
proxy_set_header Host $host;(或$http_host保留端口) - 传递真实客户端 IP:
proxy_set_header X-Real-IP $remote_addr;<br>proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
- 告知后端当前是 HTTPS:
proxy_set_header X-Forwarded-Proto $scheme; - 若后端基于 Host 路由(如 Spring Cloud Gateway),务必确认
Host头是否被修改或丢失










