Nginx域名转发使用场景代码实例
场景1:因服务器限制,所以只对外开放了一个端口,但是需要请求不同的外网环境,所以在中转服务器上用nginx做了一次转发
实现:
server{ listen8051; server_namelocalhost; location/license/{ proxy_passhttp://xxx.xxx.xxx.xxx:8058/; } location/{ proxy_passhttp://xxx.xxx.xxx.xxx:8051/;}}
特别注意:
敲黑板:此处如果涉及到文件上传的转发,相应在server_name下添加client_max_body_size100m;
域名转发的地址,proxy_pass后面必须跟"/",否则会造成转发不正常
在nginx中配置proxy_pass代理转发时,如果在proxy_pass后面的url加/,表示绝对根路径;
如果没有/,表示相对路径,把匹配的路径部分也给代理走。
假设下面四种情况分别用http://192.168.1.1/proxy/aerchi.html进行访问。
第一种:
location/proxy/{
proxy_passhttp://127.0.0.1/;
}
代理到URL:http://127.0.0.1/aerchi.html
第二种(相对于第一种,最后少一个/)
location/proxy/{
proxy_passhttp://127.0.0.1;
}
代理到URL:http://127.0.0.1/proxy/aerchi.html
第三种:
location/proxy/{
proxy_passhttp://127.0.0.1/aaa/;
}
代理到URL:http://127.0.0.1/aaa/aerchi.html
第四种(相对于第三种,最后少一个/)
location/proxy/{
proxy_passhttp://127.0.0.1/aaa;
}
代理到URL:http://127.0.0.1/aaaaerchi.html
场景2:因业务需要,一套前段代码需要映射到两个后台地址上,所以需要在接口上进行区分转发,同时转发时需要把区分标志去掉
实现:
server{ listen0.0.0.0:8204; server_namelocalhost; #静态页面目录 rootE:\xxxxxxx; #默认首页 index/index.html; proxy_set_headerHost$http_host; proxy_set_headerX-Real-IP$remote_addr; proxy_set_headerX-Forwarded-For$proxy_add_x_forwarded_for; #proxy_cookie_path/*/*; client_max_body_size100m; location~*/wx/(.*){#根绝接口是否包含/wx/来区分 #动态页面,交给tomcat处理 if(!-e$request_filename){ proxy_passhttp://127.0.0.1:8091/$1;#转到后台时需要把/wx去掉 } } location/{ #用户浏览器端的缓存设置 location~*\.(css|js|jpg|jpeg|gif|png|swf|htm|html|json|xml|svg|woff|ttf|eot|map|ico)${ expires-1; if(-f$request_filename){ break; } } #动态页面,交给tomcat处理 if(!-e$request_filename){ proxy_passhttp://127.0.0.1:8092; #proxy_cookie_path/*/*; } } error_page500502503504/50x.html; location=/50x.html{ roothtml; } }
特别注意:
1、proxy_set_headerHost$http_host;
不改变请求头。
2、proxy_set_headerHosthost;如果客户端请求头中没有携带这个头部,那么传递到后端服务器的请求也不含这个头部。这种情况下,使用host;如果客户端请求头中没有携带这个头部,那么传递到后端服务器的请求也不含这个头部。这种情况下,使用host;如果客户端请求头中没有携带这个头部,那么传递到后端服务器的请求也不含这个头部。这种情况下,使用host变量它的值在请求包含“Host”请求头时为“Host”字段的值,在请求未携带“Host”请求头时为虚拟主机的主域名;
3、proxy_set_headerHosthost:host:host:proxy_port;
服务器名可以和后端服务器的端口一起传送:
4、如果某个请求头的值为空,那么这个请求头将不会传送给后端服务器:
proxy_set_headerAccept-Encoding“”;
5、用户真实的ip地址转发给后端服务器
proxy_set_headerHost$host;
proxy_set_headerX-Forwarded-For$proxy_add_x_forwarded_for;
proxy_set_headerX-Real-IP$remote_addr;
场景3:前段代码用vue实现,vue没有具体的页面,也是通过/xx/xx来访问资源,这时候需要与后台接口进行区分
实现:
可以通过特殊字符类似“#”来区分,携带#的请求默认是静态资源
location~*\.(#|css|js|jpg|jpeg|gif|png|swf|htm|html|json|xml|svg|woff|ttf|eot|map|ico)${ expires-1; if(-f$request_filename){ break; } }
场景4:因服务器限制,数据库访问需要nginx进行转发
实现:
stream{ upstreamcloudsocket{ hash$remote_addrconsistent; server数据库实际ip:3306weight=5max_fails=3fail_timeout=30s; } server{ listen127.0.0.1:8058;#本机代理端口 proxy_connect_timeout10s; proxy_timeout300s;#设置客户端和代理服务之间的超时时间,如果5分钟内没操作将自动断开。 proxy_passcloudsocket; } }
特别注意:
stream与http同级,所以不要放到http里
场景5:访问某域名时需要重定向到另一个地址
实现:
server{ listen7000; server_namelocalhost; client_max_body_size100m; location=/{ rewrite^(.*)https://www.baidu.compermanent; } }
特别注意:
last本条规则匹配完成后继续向下匹配新的locationURI规则
break本条规则匹配完成后终止,不在匹配任何规则
redirect返回302临时重定向
permanent返回301永久重定向
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。