SHIHUC

好记性不如烂笔头,还可以分享给别人看看! 专注基础算法,互联网架构,人工智能领域的技术实现和应用。
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

nginx的upstream后端名称居然变成了请求的host了?

Posted on 2020-12-29 19:30  shihuc  阅读(2484)  评论(0编辑  收藏  举报

问题现象:

今天用nginx做反向代理服务器时,配置upstream后,直接在location里使用,居然发现代理失败,将upstream的后端名称当做IP(Host)地址使用了,么有将nginx的IP代理到后端应用上去。。。

 

我的nginx机器的IP为10.154.44.95, nginx的配置信息如下:

[appadmin@t3-tkbranch-dcom-web01 conf]$ sudo ./../sbin/nginx -V
nginx version: openresty/1.13.6.2
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-16) (GCC)
built with OpenSSL 1.0.1e-fips 11 Feb 2013
TLS SNI support enabled
configure arguments: --prefix=/home/appadmin/nginx-1.13.6.2 --with-cc-opt=-O2 --add-module=../ngx_devel_kit-0.3.0 --add-module=../echo-nginx-module-0.61 --add-module=../xss-nginx-module-0.06 --add-module=../ngx_coolkit-0.2rc3 --add-module=../set-misc-nginx-module-0.32 --add-module=../form-input-nginx-module-0.12 --add-module=../encrypted-session-nginx-module-0.08 --add-module=../srcache-nginx-module-0.31 --add-module=../ngx_lua-0.10.13 --add-module=../ngx_lua_upstream-0.07 --add-module=../headers-more-nginx-module-0.33 --add-module=../array-var-nginx-module-0.05 --add-module=../memc-nginx-module-0.19 --add-module=../redis2-nginx-module-0.15 --add-module=../redis-nginx-module-0.3.7 --add-module=../rds-json-nginx-module-0.15 --add-module=../rds-csv-nginx-module-0.09 --with-ld-opt=-Wl,-rpath,/home/appadmin/nginx-1.13.6.2/luajit/lib --with-http_ssl_module --with-stream --with-stream_ssl_module --with-http_realip_module --with-pcre --add-module=../ngx_cache_purge-2.3/ --add-module=../nginx_upstream_check_module-0.3.0/ --add-module=../nginx-sticky-module --add-module=../nginx-module-vts --with-http_stub_status_module --with-http_v2_module

我的nginx配置如下:

http {
    include       mime.types;
    default_type  application/octet-stream;

    upstream svrsdcim {
        server 10.154.44.91:8082;
    }

    upstream svrsportal {
        server 10.154.44.91:8081;
    }

    server {
        listen       80;
        server_name  localhost;
        
        location /portal {
            proxy_pass http://svrsportal;
            proxy_set_header  X-Real-IP $remote_addr;
            proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
        }

        location /dcim {            
            proxy_pass http://svrsdcim;
            proxy_set_header  X-Real-IP $remote_addr;
            proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }    
}

出现的问题是这样的,如下图:

 

研究发现,location的配置项里面,添加一行配置即可,即: proxy_set_header Host $http_host;改后的配置如下

http {
    include       mime.types;
    default_type  application/octet-stream;

    upstream svrsdcim {
        server 10.154.44.91:8082;
    }

    upstream svrsportal {
        server 10.154.44.91:8081;
    }

    server {
        listen       80;
        server_name  localhost;
        
        location /portal {
            proxy_pass http://svrsportal;
            proxy_set_header Host $http_host;
            proxy_set_header  X-Real-IP $remote_addr;
            proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
        }

        location /dcim {            
            proxy_pass http://svrsdcim;
            proxy_set_header Host $http_host;
            proxy_set_header  X-Real-IP $remote_addr;
            proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }    
}

 

配置上上述红色的内容后,即可解决问题,svrsportal已经变成了IP和端口号了。如下图:

 

加入的这行配置,到底是什么作用呢,可以参考官方的文档说明:

 

加入proxy_set_header Host $http_host之后,相当于告知nginx,向后端被代理的服务器告知一个信息,对外呈现的服务地址为$http_host所代表的的地址,即这里就是nginx所在的服务器地址。