You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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映射来实现:

  1. 先获取DOMAIN-B和DOMAIN-C的公网IP(假设分别为1.2.3.4和5.6.7.8)
  2. 在Nginx配置的http块中添加映射规则:
map $upstream_addr $backend_domain {
    1.2.3.4:443 DOMAIN-B;
    5.6.7.8:443 DOMAIN-C;
}
  1. 修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 06:53:22