如何在Nginx中将主机设置为$upstream\u addr

如何在Nginx中将主机设置为$upstream\u addr,nginx,nginx-location,nginx-reverse-proxy,Nginx,Nginx Location,Nginx Reverse Proxy,我在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_upst

我在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>

http{
日志\格式我的\上游'$remote\ u addr[$time\ u local]“$request”$status'
“$upstream_addr”$upstream_response_time$upstream_http_etag$host$http_host”;
访问\u log/var/log/nginx/upstream.log my\u upstream;
上游myapp{
ip_散列;
服务器x.x.x.174:8001;
服务器x.x.x.96:8001;
}
服务器{
听9000;
#网袋
位置/jms{
代理通行证http://myapp/jms;
proxy_http_版本1.1;
代理设置头升级$http\U升级;
代理设置头连接“升级”;
代理\u集\u头主机$upstream\u addr;
}
地点/{
代理通行证http://myapp;
}
}
}
我尝试将主机设置为$upstream_addr,但不幸的是,我在请求中接收到null。 谁能帮我把主机设置为$upstream_addr。 谢谢
Bhaskar.

正如Larry提到的,在选择上游之前,请求头(和主体)是固定的。因此,$upstream\u 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;
}
}

proxy\u set\u header
proxy\u pass
之前执行,即使您将其放在
proxy\u pass
之后,在进入负载平衡之前,$upstream\u addr为空感谢Larry和Aakash让我了解并提供了一个解决方案,还有什么比打开多个端口更好的方法吗。