Nginx负载均衡器:重定向至$upstream_addr失败问题求助
解决Nginx负载均衡后重定向至选中后端域名的问题
你遇到的问题根源在于$upstream_addr变量返回的是后端服务器的IP地址+端口,而非域名。重定向到IP会导致浏览器SSL证书验证失败(因为后端证书绑定的是DOMAIN-B/C),同时也达不到显示后端域名的需求。
下面提供两种可行的解决方案:
方案一:使用$upstream_server_name变量(Nginx 1.13.0及以上版本)
该变量会直接返回upstream配置中选中的服务器名称(比如DOMAIN-B:443),我们只需通过正则去掉端口号即可:
修改你的location配置块:
location / { # 触发Nginx负载均衡选择后端服务器 proxy_pass https://backend; # 提取域名部分,移除端口号 if ($upstream_server_name ~* ^([^:]+):\d+$) { set $backend_domain $1; return 301 $scheme://$backend_domain$request_uri; } # 兼容无端口的配置场景 return 301 $scheme://$upstream_server_name$request_uri; }
方案二:IP-域名映射(兼容旧版Nginx)
如果你的Nginx版本低于1.13.0,没有$upstream_server_name变量,可以通过IP映射来实现:
- 先获取DOMAIN-B和DOMAIN-C的公网IP(假设分别为
1.2.3.4和5.6.7.8) - 在Nginx配置的
http块中添加映射规则:
map $upstream_addr $backend_domain { 1.2.3.4:443 DOMAIN-B; 5.6.7.8:443 DOMAIN-C; }
- 修改location配置:
location / { proxy_pass https://backend; return 301 $scheme://$backend_domain$request_uri; }
关键注意事项
proxy_pass是触发负载均衡选择后端的必要步骤,不能直接省略,否则Nginx无法确定要重定向到哪台服务器。- 加入
$request_uri可以保留用户原请求路径(比如访问DOMAIN-A/test会重定向到DOMAIN-B/test),如果只写域名根目录会丢失路径信息。 - 修改配置后,先用
nginx -t验证配置语法,再执行systemctl restart nginx重启服务生效。
内容的提问来源于stack exchange,提问作者radiolondra
相关产品推荐
相关产品推荐

