nginx实现指定url转发详解
作者:玛奇玛丶
故事背景
目前有一个鉴权服务流量很大,部署了很多台机器,由于流量太大会导致整个现网的网络资源不够用,需要切换一些流量到备灾机房,在备灾节点也部署多个服务,分摊服务器和网络的压力。但是在后面测试的时候发现有一个问题,有一个功能会通过HTTP请求通知在线的黑名单刷新,走的是内网,但是现网机房和备灾机房网络互不相通,无法走内网,所以无法通知到备灾的服务刷新黑名单。
思考方案
遇到这个问题,我的第一反应是可以用mq消息队列做订阅服务,当离线修改黑名单后,把数据放到生产者中,每个在线的服务订阅后可以拉取到信息更新黑名单列表,这个业务场景其实挺适合用MQ的,因为如果扩容的话直接部署多一个服务,不需要做另外的配置,目前用HTTP请求通知的话,如果扩容需要重新配置多一个通知的ip......但是,领导可能对于引入新的中间件觉得有一些风险,所以还是考虑另外的方法。
因为无法通过现网机房直接请求到指定的备灾机房的某一台机器上,我就想写一个java接口,是备灾机房专用的,接收到请求之后,会请求到备灾的某一台机器上,通过新写的postPrepareAll()接口,请求到其他的备灾服务刷新黑名单。
如图,请求12.12.12.12/test/postPrepareAll接口,随机请求到10.0.0.3,在通过postPrepareAll,请求所有的服务(10.0.0.1、10.0.0.2、10.0.0.3)刷新黑名单。
nginx指定路径转发
后面领导说还有一个更好的方案,直接用nginx转发请求就好了,都不用写代码。我熟悉了下这个确实方便很多。因为nginx一般都是用于做反向代理负载均衡,我都快忘记还有代理转发的功能了......通过nginx配置端口或者路径后缀实现代理转发。
端口:
监听8881端口的所有路径转发到10.0.0.1:8080的服务下
监听8882端口的所有路径转发到10.0.0.2:8080的服务下
server { listen 8881 ; server_name 负载ip; root html; index index.html index.htm; location / { proxy_pass http://10.0.0.1:8080/; #以下是一些反向代理的配置可删除 proxy_redirect off; } } server { listen 8882 ; server_name 负载ip; root html; index index.html index.htm; location / { proxy_pass http://10.0.0.2:8080/; #以下是一些反向代理的配置可删除 proxy_redirect off; } }
路径:
监听路径为/test/addblack/1的请求转发到10.0.0.1:8080/test/addblack
监听路径为/test/addblack/2的请求转发到10.0.0.2:8080/test/addblack
server { listen 8832 ; server_name 负载ip; root html; index index.html index.htm; location /test/addblack/1 { proxy_pass http://10.0.0.1:8080/test/addblack; #以下是一些反向代理的配置可删除 proxy_redirect off; } location /test/addblack/2 { proxy_pass http://10.0.0.2:8080/test/addblack; #以下是一些反向代理的配置可删除 proxy_redirect off; } }
因为两边网络不是互通的,需要开通端口访问,所以我们选择了用后缀的方式代理转发,不用开通多个端口的网络。
总结
nginx的负载均衡本质上其实也是代理转发,只不过代理的是一个列表,可以配置权重、轮询啥的。还有监听某个端口,或者某个路径指定转发到对应的url中。由于安全原因考虑,很多服务器没有开通外网地址访问,只有一个负载地址,需要通过nginx做网关转发。
到此这篇关于nginx实现指定url转发详解的文章就介绍到这了,更多相关nginx指定url转发内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!