栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

Nginx如何动态转发到动态IP的内网服务?

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Nginx如何动态转发到动态IP的内网服务?

Nginx如何动态转发到不同IP的内网服务? 场景:

有三台主机,A ,B,C;A和B网络互通,B和C互通,而B的IP固定不变,A和C都是动态IP。
B主机作为代理,转发到C服务器上,A作为客户端,如何做?才能一次配置后不需要修改B,就可以代理到C上?

通常,我们配置Nginx代理如下:

        location ^~ /proxy/ {
                proxy_pass http://127.0.0.1:8080;
                proxy_set_header Host $Host;
                proxy_set_header   X-Real-IP  $remote_addr;
                proxy_set_header X-Forwarded-For  $remote_addr;
                proxy_set_header X-Forwarded-Proto $scheme;
        }

但是这种方式面对动态IP,就会比较头疼了。所以现在出现了很多微服务,通过注册中心和心跳机制,可以灵活的剔除联系不上的主机,从而达到自动化的效果

但是Nginx这里能否做到更灵活一点?
答案是肯定的,
怎么做?

一次配置

就是在发起到B服务的请求中,将C的动态IP带上,如下:
curl http://B-host/proxy/newC-host:port/…
这样,我们截取proxy后面的信息作为代理的目标,就能一次配置B,后续都不需要在修改B了

Nginx中有一个变量:request_uri,这个变量可以获取到对应的请求接口路径,不包含IP地址,在结合正则表达式,就能很好的实现功能
例如,
接口:http://B-host/proxy/newC-host:port/…
对应的request_uri 就是/proxy/newC-host:port/…

看配置

        if ($request_uri ~ ^/proxy/(.*)){    #通过正则表达式,截取指定路径
                set $backend_host http://$1;
        }
                location ^~ /proxy/ {
                proxy_pass $backend_host;
                #proxy_set_header Host $Host;
                proxy_set_header   X-Real-IP  $remote_addr;
                proxy_set_header X-Forwarded-For  $remote_addr;
                proxy_set_header X-Forwarded-Proto $scheme;
        }

这里说明一下,通过正则判断$request_uri 是否是以/proxy开头,是的话,就将/proxy/后面的数据截取
,赋值给变量backend_host 为http://$1 ,其中$1 就是/proxy/ 后面的所有路径

        if ($request_uri ~ ^/proxy/(.*)){
                set $backend_host http://$1;
        }

接下来就是指定代理方向就可以了

        location ^~ /proxy/ {
                proxy_pass $backend_host;
                proxy_set_header Host $Host;
                proxy_set_header   X-Real-IP  $remote_addr;
                proxy_set_header X-Forwarded-For  $remote_addr;
                proxy_set_header X-Forwarded-Proto $scheme;
        }

配置好后,重启Nginx
nginx -s reload
完成

看效果

这样,只要B固定,C变动,也不需要改变B的配置,只要知道C的IP和端口号,A就能访问到

应用场景

那么,这种配置方案有什么应用场景吗?
肯定是有的,不然我也不会那么辛苦写这些了

一般在企业中,会有本地环境和测试环境。测试环境可能会有很多很多的服务,而本地环境只和测试环境的Nginx打通,和其他服务可能网络不通,但是想要更好的在本地调试提高工作效率,就可以通过本文的配置方式做代理了

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/974578.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号