问题现象:
今天用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所在的服务器地址。