Nginx上游的主机头(Host header)

8

我正在使用nginx,但在设置反向代理时遇到了问题。

我的nginx.conf是默认的(没有进行任何更改),我的site-available配置如下:

upstream backend_hosts {
    server server1.example.com
    server server2.example.com
}

server {
    listen 80;

    location / {
        proxy_set_header Host $host;
        proxy_pass http://backend_hosts;
    }
}

它无法正常工作,因为它没有传递主机头。当我像这样做时,它可以工作:

...

proxy_set_header Host server1.exampple.com;

...

我希望能做类似于这样的事情:
proxy_set_header Host $current_upstream_server_name;

你想使用什么值?是 server{1,2}.example.com 吗?如果是,你尝试过使用 $proxy_host 而不是 $host 吗? - sainaen
2
我希望它被设置为上游选择的那个,我已经尝试过 $proxy_host 但它也不起作用。 - Enzo
嗯,好的,你能澄清一下它到底是“不工作”了吗?头部没有设置,为空还是其他什么情况? - sainaen
3
很抱歉,我认为没有一个干净的解决方案。我已经尝试了你的设置,对我来说$host包含请求的原始值,而$proxy_host被设置为“backend_hosts”。此外,我在ServerFault上找到了一个类似的问题,可能(或可能不)有所帮助:http://serverfault.com/questions/598202/make-nginx-to-pass-hostname-of-the-upstream-when-reverseproxying - sainaen
我需要将我的主机设置为当前上游服务器的实际名称。似乎nginx无法为我完成这个任务。 - Enzo
显示剩余3条评论
1个回答

2

我们也一直在努力解决这个问题,虽然不是完整的答案,但我相信这可能会帮助未来访问此页面的用户。

通过访问上游变量$upstream_http_name,可以编写所选上游服务器的IP地址。

http {
    upstream backend {
        server server1.example.com;
        server server2.example.com;
    }
    
    server {
        location / {
            proxy_set_header Host $upstream_http_name;
            proxy_pass http://backend;
        }
    }
}

如果像我们的应用程序一样,接受IP地址,则以上配置将把该信息传递到代理请求的主机头中。
可以在上游模块提供的变量的完整列表中找到 此处

2
链接中写着: $upstream_http_name 保留服务器的响应头字段。 - M-A-X
是的,这个不起作用。检查日志后,upstream_http_name 的值总是为空,原因不明。 - theprogrammer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接