1. 程式人生 > 實用技巧 >nginx的upstream後端名稱居然變成了請求的host了?

nginx的upstream後端名稱居然變成了請求的host了?

問題現象:

今天用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所在的伺服器地址。