下面是最基本的 Nginx 配置,它直接演示了我遇到的问题。“真实世界”的设置有多个上游和多个条件检查,为了清晰起见,这里省略了。
upstream barhost {
server example.com;
}
server {
listen 8080;
location / {
# this works fine if used directly:
# proxy_pass http://example.com/;
# this doesn't work, returns 404:
proxy_pass http://barhost/;
}
}
结果:
- 使用
proxy_pass http://example.com/;
效果很好,返回200 - 使用
proxy_pass http://barhost/;
(使用upstream
)它返回404
一些背景信息:
- 这种动态上游的全部意义在于作为这个悬赏但尚未解决的问题。
- 我无法用来
if()
实现这个特定的目标,正如解释的那样对该相关问题的答复,这就是我走这条路的原因(这个想法是使用 来map
决定upstream
) - 看来我不能使用
map
其中的主机名,因为Nginx 无法解析 DNS这就是为什么map
我要使用upstream
。我本质上尝试模仿这个配置。
我在这里做错了什么?
一些相关的帖子:
- nginx proxy_pass 与动态上游服务器
- nginx 动态 proxy_pass 带有重定向之间的变量
- https://stackoverflow.com/questions/50121492/using-nginx-map-directive-to-dynamically-set-proxy-upstream
更新:
感谢评论中一位热心的用户,我调查了此场景中代理到 example.com 的请求标头。它被设置为barhost
服务器将给出无效响应的对象。这是问题的根本原因。
因此,了解这一点后,我想Host
正确设置标题。
设置上游名称以匹配所需的Host
标头名称确实有效:
upstream example.com {
server example.com:80;
}
硬编码Host
标头proxy_set_header
似乎也有效:
upstream barhost {
server example.com;
}
server {
listen 8080;
location / {
# This works:
proxy_set_header Host example.com;
# None of these work:
# proxy_set_header Host $host;
# proxy_set_header Host $http_upstream_host;
# proxy_set_header Host $proxy_host;
proxy_pass http://barhost/;
}
}
然而,在我的特定用例中,最好使用proxy_set_header
变量来动态设置它 -那可能吗?