Nginx通过二级目录(路径)映射不同的反向代理,规避IP+端口访问

这是我上一家公司的案例总结,发现躺在草稿箱好几个月了,今天得空就整理发布一下。

先说一下开发那边提来的2个case:

①、同一个域名需要反向代理到前台和后台(不同机器和端口);

②、需要采用IP+端口的模式,嵌入到APP作为DNS污染后的备选方案。

Nginx通过二级目录(路径)映射不同的反向代理,规避IP+端口访问

对于第①个问题,很好解决:通过区分二级目录来反代不同的节点即可,所以代码类似如下:

如上配置即可实现通过一个域名来反代不同的后端节点,用到的思路就是匹配二级目录来反代。

对于第②个问题,可能粗略一看,还没理解是个啥意思吧!

其实就是现在业界流行的一种防DNS污染的解决方案之一:手机APP里面除了通过域名来获取数据,还会额外嵌入一些备用的IP。APP在获取数据时,会先通过域名向服务器发起一个简单的校验请求,如果得到的不是预期数据,说明该网络环境下的DNS已被污染,比如被运营商劫持,请求A内容却给你展示B内容!这时候,APP将会启动备用预案,通过IP的方式来请求数据!很明显,这个做法可以有效避免恶心的DNS劫持了(看完这段是不是有所收获呢?)。

做法很简单,就是在APP中集成多个IP和端口作为备用的访问途径。

当开发GG找到我,提出的需求是:

需要实现公网IP+端口来访问,比如邮件API使用 http://192.168.1.10:125

Ps:公网服务器是多线的,那么就有多个IP,本文假设电信是192.168.1.10,联通是192.168.2.10,移动是192.168.3.10等

说白了就是要用端口来区分不同的API,此时如果我不深究,顺手可能会写出如下配置

粗略一看,确实是可以实现开发GG的要求啊!再仔细一想,你会发现如此做法会开放越来越多的端口!运维成本以及辨识度低还只是其次,咱说好的安全第一呢?

经过思考和测试,我写出的最终配置如下:

最终实现的效果就是:你要通过IP请求邮件API,只要请求 http://192.168.1.1/mail_api/ 即可,而不需要开放多余端口。而且,后续要新增更多API,只需要定义不同的二级路径即可,这些二级路径的辨识度可比端口要好得多!

Ps:正如代码中的注释,示例代码只用了一个 DemoBackend 节点配置,为的是分享另一个小技巧:当后端节点承载了多个站点而且都是监听80端口时(比如某些小公司同一个IIS服务器部署了N个站点),反向代理中的proxy_set_header参数,可以自定义传递一个host域名给后端节点,从而正确响应预期内容!

这段解释有点无力,还是拿实际例子举例吧!

我之前供职的公司节点用的是IIS服务器,前端用Nginx反向代理,IIS服务器上有多个站点,站点之间部分会通过 rewrite 规则联系起来。

打个比方:比如A网站有个专题内容(www.a.com/zt/)是通过IIS伪静态映射到了B网站(content.b.com)。也就是访问到http://www.a.com/zt/,其实最后是通过A网站映射到了B网站上面。

后来发现IIS有个伪静态BUG,会经常奔溃,就要我用前端的Nginx来实现直接映射,而不再走IIS的A网站中转。

那么这个需求就正好用到了 proxy_set_header 技巧,一看就懂:

很明显,通过传递自定义域名,就可以实现通过A网站访问Nginx,返回B网站内容,和反向代理谷歌的原理是一致的。

当然,上文为了实现 IP 和域名都可以访问,这个proxy_set_header 设置也是必须的。说白了就是在反代过程中,对后端服务器伪装(传递)了一个自定域名,让后端响应该域名预期内容。

当然,在之前张戈博客分享的《分享几个WordPress本地缓存gravatar评论头像的方案》一文中也用到了这个技巧,感兴趣的朋友可以前往查看。

本文分享的经验,其实比较简单,主要就是通过不同路径来反代不同的目标。估计很多大拿早就用烂了吧!不过值得注意的是,通过自定义路径反代,需要注意 proxy_pass 参数后面是否需要斜杠,避免将自定义的路径传递到后端节点,导致访问404!

发表评论

gravatar

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

刷新评论

目前评论:9   其中:访客  8   博主  1

  1. 自媒体博客 1 来自天朝的朋友 谷歌浏览器 Windows 7 广东省东莞市 联通

    博主文章下面的赞、赏和分享是怎么做的?之前有分享过这个吗?

  2. 群伟伟博客 2 来自天朝的朋友 谷歌浏览器 Windows XP 广东省佛山市顺德区 联通

    草根也许根本没有发声的机会,或者说,草根出头的日子需要很长的时间,为此,我们这些草根何不试着报团取暖,来缩短出头的时间呢?

    既然大家都习惯了评论引流,那我们何不换个方式试着互相评论呢?众人拾柴火焰高,比如,每天和50人互相评论,那么每天至少都能换回50个ip以上了,为什么会有50个以上?因为别人看到你的评论时也会点击进入你的博客,这样总比评论50篇文章却不知能有多少效果要实在得多、充实得多吧?

    为此,我真诚的邀请大家来和我一起互相评论,你在给我评论的同时,我也会去给你评论,让你得到应有的回报,,而我希望我在去给你评论后,你也能来给我回评,让我知道,我的付出没有白费。。。

  3. Dzing 0 来自天朝的朋友 谷歌浏览器 Windows 7 广东省东莞市 电信IDC机房

    又是翻墙的好方法

  4. 香港云主机 3 来自天朝的朋友 谷歌浏览器 Windows 7 重庆市 电信

    博主换工作了吗?上一家公司的草稿还保存着,看来博主是一个很有存留的人额

  5. 黑苹果乐园 3 来自天朝的朋友 谷歌浏览器 Windows 8 浙江省金华市 电信

    文章不错,什么时候有时间整理一下这个滑动提交的功能奥。

  6. aleax 0 来自天朝的朋友 火狐浏览器5.0 Windows 8.1 浙江省杭州市 华数宽带

    文章不错哦,我的站点提子网

  7. neo 4 来自天朝的朋友 谷歌浏览器 Windows 7 海南省 电信

    博主,这里有一个问题和我遇到的一样的,能帮忙看看怎么解决么,先谢谢了。地址是:https://segmentfault.com/q/1010000008656682

    • 张戈 [博主] 来自天朝的朋友 QQ浏览器 Windows 7 广东省广州市 电信

      正好我家有一个群晖NAS,用的电信宽带。你这个问题很简单,因为电信外网IP是不开放80,8080 等多个常见端口的,防止不备案存放网站,但是,但是,经过我测试,443端口是开放,所以网站只要开了https,可以不用端口映射,都可以访问。
      WAN IP (https) —> 路由器映射(443–443)—> 网站(监听443)

  8. 兖州邦 0 来自天朝的朋友 谷歌浏览器 Windows 7 山东省济宁市 电信

    张老师您好,我有个问题想请教下,我的是ngnix,我尝试做反向代理想把b.com这个网站映射为a.com/test/,就是在访问a.com/test/的时候实际访问的是b.com的内容,我是这样写的
    location /test/
    {
    proxy_pass http://www.b.com/;
    }
    访问a.com/test/的时候可以显示b.com的页面,但是css jpeg js等等这些文件所在下一级image目录是不显示的,他这个映射只能映射一级目录么?有没有办法把源站里的下边的目录一起映射啊?谢谢您!

加载中,请稍候...