Nginx:如何将主机标头设置为所选服务器(负载平衡)


10

我有一个站点可以用作负载平衡器。网站A。

我还有其他只能拥有一个域的站点。因此,如果我只是重定向到他们,它说找不到主机名。

因此,如果我手动将标题设置为某些内容,则仅显示该站点。

我如何设置proxy_set_header Host xxxx所选的服务器地址。这样,每个重新路由请求将具有不同且适当的主机头。

如果我的其他2个站点可以基于url而不是主机标头工作,那将不是问题。

worker_processes  1;

error_log  logs/error.log;
error_log  logs/error.log  notice;
error_log  logs/error.log  info;
error_log  logs/error.log  debug;

pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    upstream myapp1 {
        #server localhost:3333;
        server www.asd.com:80;
    }

    server {
        listen 80;

        location / {
            proxy_set_header Host            $upstream_addr;  // should become somehow www.asd.com right now this code doesn't work
            proxy_set_header X-Forwarded-For $remote_addr;
            proxy_pass http://myapp1;
        }
    }
}

$server_addr是为什么127.0.0.1为什么呢?
穆罕默德·乌默尔

我希望www.asd.com:80选择服务器时主机标头为www.asd.com
Muhammad Umer

还是有写方法if(server1) than host = a; if(server2) than host = b;
穆罕默德·乌默尔

1
我认为,适当的主机头应该是从客户端获得的任何内容。如果客户端请求www.asd.com,则主机标头应为该标头。这将有助于在需要时在后端正确生成绝对URL,为cookie等设置适当的域。无论您尝试做什么,您都可能以错误的方式查看它。
FlorinAsăvoaie2015年

客户端和中间服务器都是我。
穆罕默德·乌默尔

Answers:


6

您需要将标头设置为传入的主机变量,如此处所示

proxy_set_header Host $host;

This variable is equal to line Host in *the header of request* or name意思是无论客户/浏览器告诉谁,那都是被选择的。
穆罕默德·乌默尔

这是您想要做的,对吗?客户端从您的代理请求资源/虚拟主机,并且您需要提供虚拟主机。客户端/浏览器选择要服务的虚拟主机。
Jeff Wong)

服务器未随机选择任何虚拟主机
Muhammad Umer

1
像这样吗 创建两个级别的代理,然后将主机硬编码的主机设置为第二层上的终结点serverfault.com/a/622782/287634
Jeff Wong

请看一下,但是我认为我已经见过我了,因为我已经在那里投票了
Muhammad Umer

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.