分享一个Nginx正向代理的另类应用案例

最近接到了一个需求:通过 Nginx 代理把现网一个自研代理程序给替换掉,感觉有点意思,也有所收益,简单分享下。

需求背景

部门的生产环境异常复杂,有部分第三方引入的系统位于特殊网络隔离区域,请求这些系统需要通过 2 层网络代理,如图所示:

分享一个Nginx正向代理的另类应用案例

中心源系统请求目标系统 API 的形式各异,我简单收集了下,至少有如下 3 种:

目前开发 GG 是用 lighthttp 二次开发实现了这个需求(猜测用到了一堆判断和转发逻辑),存在一定的后期维护工作量,而且这个 GG 已经转岗去其他部门了,现任开发 GG 就想直接通过 Nginx 代理来实现,淘汰这个组件,因此就将这个需求丢给了我这个运维了。

需求分析

拿到需求后,我分析了下,应该需要使用正向代理来实现,我们来看下普通的一级正向代理写法:

这个规则的意思是将所有请求都代理到请求对应的主机。这个在内网正向代理上网的时候会用到,这时候用户只需要将你提供的代理设置为 http_proxy,就可以访问到直接访问不到的站点。

看起来好像可以满足需求了,But...实际需求是要经过 2 层代理,那第一层代理的$host 必须是固定为第二层代理的地址了!而且 Nginx 也不支持类似 http_proxy 的设置,所以照搬正向代理是行不通的。

最终解决

既然正向代理涉及到自动提取目标主机、端口以及请求的特性,那我们就自己设计一个请求方式,方便使用 Nginx 自带规则来提取并自动代理。

我和开发约定了一个请求方式(之前也用了类似约定),方便 Nginx 来提取变量并自动代理:

将真正需要请求的 API 拆成: ?schema=http&host=主机:端口&proxy_url=请求路径及参数,然后请求到第一级 Nginx 代理服务,一级代理将请求原样传给 Nginx 二级代理,然后在二级代理上通过正则提取 schema、host 和 proxy_url,并代理请求,即可满足需求。

Nginx 一级代理规则(反向代理):反向代理到 2 个二级代理

Nginx 二级代理规则(正向代理):自动提取 url 里面约定的协议、目标主机和 url 并代理

最后再套了一层负载均衡,最终生产环境的拓扑如下:分享一个Nginx正向代理的另类应用案例

利用 Nginx 代理,非常轻量的替代了之前开发 GG 研发的程序,而且后期维护工作量基本可以忽略不计,其中涉及到的安全措施这里就略去不提了,请自行脑补。

发表评论

gravatar

:?::razz::sad::evil::!::smile::oops::grin::eek::shock::???::cool::lol::mad::twisted::roll::wink::idea::arrow::neutral::cry::mrgreen:

刷新评论

目前评论:11   其中:访客  9   博主  2

  1. avatar 去看你博客 0 来自天朝的朋友 QQ浏览器 Windows 10 北京市 移动

    学习到了,受益匪浅! :wink:

  2. avatar 技术宅 4 来自天朝的朋友 火狐浏览器 Windows 10 江苏省南京市 电信

    受益匪浅,mark,房间认证学习!

  3. avatar 涪陵博客 1 来自天朝的朋友 QQ浏览器 Windows 7 湖北省襄阳市 联通

    恭喜博主喜提zhang.ge

    • avatar 张戈 [博主] 来自天朝的朋友 谷歌浏览器 Mac OS X 10_14_2 广东省广州市 电信

      :cool: 这还没到手呢,都知道了。。流批流批

      • avatar 龙笑天 5 来自天朝的朋友 火狐浏览器 Windows 7 广东省深圳市宝安区 电信

        666 这域名太屌了~ :wink:

  4. avatar Man 0 Australia 谷歌浏览器 Windows 7 澳大利亚

    Congratulations to zhangge for purchasing the “zhang.ge” domain. 恭喜恭喜

    • avatar 张戈 [博主] 来自天朝的朋友 谷歌浏览器 Mac OS X 10_14_2 广东省广州市 电信

      多谢支持~ :mrgreen:

  5. avatar 南鸢离梦 0 来自天朝的朋友 火狐浏览器5.0 Windows 10 四川省成都市 电信

    不错!

  6. avatar Www.Last.City 1 来自天朝的朋友 谷歌浏览器 Windows 7 浙江省 电信

    喜提 zhang.ge 恭喜恭喜 也恭喜 @龙哥

  7. avatar 我爱技术网 1 来自天朝的朋友 谷歌浏览器 Windows 7 四川省成都市 电信

    学习到了,受益匪浅!

    能否换换友情呢 带带小弟 :mrgreen:

  8. avatar 成航先森 5 来自天朝的朋友 谷歌浏览器 Windows 7 四川省成都市 电信

    还是没能理解为什么要用两层代理,是和192网段与172网段不通有关么?

加载中,请稍候...