使nginx在反向模式下传递上游的主机名

我使用主机名运行几个docker容器:

web1.local web2.local web3.local

根据nginx的主机名路由到这些路由。 我有一个代理在这个设置(在不同的机器连接到互联网)前,我定义上游为:

upstream main { server web1.local:80; server web2.local:80; server web3.local:80; } 

和实际的虚拟主机描述:

  server { listen 80; server_name example.com; location / { proxy_pass http://main; } } 

现在,因为容器接收主机名“main”而不是“web1.local”,所以它们没有正确响应请求。

问题:在代理请求的时候,如何告诉nginx能够通过上游服务器的名字而不是主机上游服务器的名称?

    其实你可以通过proxy_set_header做到这一点。

    有关更多详细信息,请看这里: http : //nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_set_header或在这里看到一个示例用例: https : //stackoverflow.com/questions/12847771/configure-nginx-与代理通

    我已经将dynamic方法包含在您的以上发布的configuration中:

     server { listen 80; server_name example.com; location / { proxy_pass http://main; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $remote_addr; } } 

    这是一个静态主机名的例子:

     server { listen 80; server_name example.com; location / { proxy_pass http://main; proxy_set_header Host www.example.com; proxy_set_header X-Forwarded-For $remote_addr; } } 

    我有同样的问题,我终于通过使用两级代理解决了它。 下面是你如何能够为你的情况做的(我认为):

     server { listen 8001 default_server; server_name web1.example.com; location / { proxy_pass http://web1.local:80; proxy_set_header Host web1.local:80; } } server { listen 8002 default_server; server_name web2.example.com; location / { proxy_pass http://web2.local:80; proxy_set_header Host web2.local:80; } } server { listen 8003 default_server; server_name web3.example.com; location / { proxy_pass http://web3.local:80; proxy_set_header Host web3.local:80; } } upstream main { server 127.0.0.1:8001; server 127.0.0.1:8002; server 127.0.0.1:8003; } server { listen 80; server_name example.com; location / { proxy_pass http://main; } } 

    正如你所看到的,诀窍是创build一个本地服务器响应一个特定的端口,通过为每个服务器重写正确的主机来代理服务器。 然后,你可以在你的上游使用这个本地服务器,最后在真正的代理中使用这个上游。

    所以从阅读nginx的所有文档(我无法真正parsing上游模块的代码=()我想出了这个混蛋的解决scheme。不幸的是,这个解决scheme不跟踪失败的主机,而只是select随机的一个,并redirect请求。所以我必须设置一些监视,以确保所有的后端运行。

     server { listen 80; server_name example.com; resolver 127.0.0.1; location / { set $upstream ""; rewrite_by_lua ' local upstreams = { "http://web1.dokku.localdomain", "http://web2.dokku.localdomain", "http://web3.dokku.localdomain", "http://web4.dokku.localdomain" } ngx.var.upstream = upstreams[ math.random( #upstreams ) ] '; proxy_pass $upstream; } } 

    我们传入上游addr作为一个单独的头像这样

     server { listen 80; server_name example.com; location / { proxy_pass http://main; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $remote_addr; add_header X-Upstream $upstream_addr; } } 

    如果你尝试了什么?

     server { listen 80; server_name example.com; location / { proxy_pass http://main; proxy_set_header Host $upstream_addr; proxy_set_header X-Forwarded-For $remote_addr; add_header X-Host $host; } } 

    虽然目标似乎是合乎逻辑的,但nginx不会更改Host:头来匹配上游 。 相反,它将upstream域名(如DNS中的CNAME视为获取IP地址的一种方式。

    在select上游之前,请求头(和主体)是固定的。 上游可能会改变中间请求,如果它是一个特定的上游被发现是不响应,但请求不会改变。