【问题标题】:How can I set Host as $upstream_addr in Nginx如何在 Nginx 中将主机设置为 $upstream_addr
【发布时间】:2018-04-05 01:20:25
【问题描述】:

我在 Nginx.conf 上有以下配置

<b>
http {
    log_format my_upstream '$remote_addr [$time_local] "$request" $status'
        '"$upstream_addr" $upstream_response_time $upstream_http_etag $host $http_host';
    access_log /var/log/nginx/upstream.log my_upstream;

upstream myapp{
         ip_hash;
         server x.x.x.174:8001;
         server x.x.x.96:8001;
     }

    server {
     listen 9000;
     #websocket
     location /jms {
         proxy_pass http://myapp/jms;
         proxy_http_version 1.1;
         proxy_set_header Upgrade $http_upgrade;
         proxy_set_header Connection "Upgrade";
         proxy_set_header Host $upstream_addr;
     }

     location / {
        proxy_pass http://myapp;
     }
     }
}
</b>

我尝试将主机设置为 $upstream_addr,但不幸的是,我在请求中收到了 null。 谁能帮我将主机设置为 $upstream_addr。 谢谢, 巴斯卡。

【问题讨论】:

  • proxy_set_headerproxy_pass之前执行,即使你放在proxy_pass之后,并且在进入负载均衡之前,$upstream_addr为null

标签: nginx nginx-location nginx-reverse-proxy


【解决方案1】:

正如拉里所说,请求标头(和正文)在选择上游之前是固定的。因此,您的 $upstream_addr 将始终返回 null。

您可以做的是添加两级代理。但是如果你有很多 myapp 的上游,这可能会变得混乱。

upstream myapp{
     ip_hash;
     server x.x.x.174:8001;
     server x.x.x.96:8001;
 }

upstream main {
  server 127.0.0.1:8001;
  server 127.0.0.1:8002;
}
server {
  listen      8001 ;

  location / {
    proxy_pass       http://x.x.x.174:8001/jms;
    proxy_set_header Host x.x.x.174:8001;
  }
}

server {
  listen      8002 ;
  location / {
     proxy_pass       http://x.x.x.96:8001/jms;
     proxy_set_header Host x.x.x.96:8001;
  }
}

server {
listen 9000;
#websocket
location /jms {
     proxy_pass http://main;
     proxy_http_version 1.1;
     proxy_set_header Upgrade $http_upgrade;
     proxy_set_header Connection "Upgrade";
}

location / {
    proxy_pass http://myapp;
}
}

【讨论】:

  • 感谢 Larry 和 Aakash 让我理解并提供了解决方案,除了打开多个端口之外,还有其他更好的方法吗?
  • @bhaskar 我也有类似的要求,所以我也尝试了这个选项。但是使用 2 级代理,nginx 不会尝试下一个上游主服务器,以防一个本地服务器抛出 502。我什至为 proxy_upstream_next 配置了所有可能的值。你是否也遇到过这个问题
猜你喜欢
  • 1970-01-01
  • 2023-03-15
  • 2012-01-02
  • 2022-06-15
  • 2016-07-14
  • 2014-10-31
  • 2018-06-03
  • 1970-01-01
  • 2016-01-03
相关资源
最近更新 更多