Goproxy代理-灵活的反向代理和静态资源代理

 

goproxy代理

goproxy代理

goproxy代理可以实时的让hosts文件的修改生效,而且对hosts文件的配置功能进行了增强,用起来会很有意思,(因为是用go语言写的,所以取名为goproxy)。先说说这个软件的来由:

做web开发的同学难免会碰到线上、线下、预发布、其他环境相互切换的场景,目前有两个方案:

  1. 方案一:直接在浏览器中把url中的域名改成指定环境的ip:port,回车直接访问。不过这个办法是有缺陷的,比如:你的web应用和样式都需要使用线下的环境时,你就不能通过修改浏览器的url来实现了,因为浏览器的url只能指定web应用的环境,html中的js和css还是使用的域名,当然,如果你不嫌麻烦,也可以修改web应用的源码来使js、css资源的域名改成ip:port。这个方式对于频繁切换环境的人来说无疑很痛苦。而且为了测试而修改了源码,在提交代码时,有会把测试代码提交到线上的风险。
  2. 方案二:在hosts文件中配置几套环境,用switchhosts软件来做几个环境的切换,配合firefox的dns flusher插件(点一下这个插件,可以让firefox立刻重新加载hosts文件),可以比较快速的切换环境。而且dns flusher可以实时查看当前的域名访问的ip是哪个。这个方案明显比第一个方案好很多。但是我使用这种方案很长时间,发现firefox打开页面的速度确实不如chrome,对于每天要刷新页面千百次的我,我甚至快忍受不了firefox的那么一点点慢。但是chrome有个致命的弱点,就是没有一个类似dns flusher的软件,让修改后的hosts文件立刻对浏览器生效。这导致喜欢chrome的同学,每次用hosts切换软件切换了域名绑定后,都只能把chrome关掉,然后重新打开,这样才能让修改后的hosts文件立即生效,好在chrome关闭和打开的速度很算过得去(firefox,估计想屎的心都有了)。

好吧,话归正题,我其实是想用chrome和switchhosts软件做到快速的切换环境,于是用golang开发了goproxy。(项目是开源的代码很简单,大家觉得比较麻烦的代码用golang两行就能搞定,详细使用文档请见项目主页:https://bitbucket.org/weager/goproxy)。

为什么要用代理?代理相当于是浏览器和最终的服务器之间的中转站,浏览器如果使用了代理,你就可以控制浏览器打开的所有页面的,既然chrome不能实时的读取hosts文件,那我可以让goproxy实时的读取hosts文件(其实是每次url访问经过goproxy时去检查一下hosts文件是否修改,修改了就reload一下)。这样每次需要切换环境只需要用switchhosts选择一套环境的hosts绑定,然后F5刷新chrome就可以了。其操作步骤比firefox+dns flusher+switchhosts还要少(dns flusher需要点击触发reload hosts文件)。

这只是一个基本的goproxy代理功能,其实goproxy还有更有意思的功能。下面来一一解读:

hosts文件中配置的映射一般都是把多个域名映射到一个ip上,如果把url前面的“http://”去掉的话,hosts里面的映射,其实就是前缀的替换,比如这个hosts配置:

127.0.0.1  www.1688.com

如果一个url去掉http://后为www.1688.com/index.html,那么映射后的url就为127.0.0.1/index.html。试想,如果我本地的环境端口号不是80,而是8080,怎么办?你能在hosts文件中配置成127.0.0.1:8080 www.1688.com吗?如果你用goproxy就可以这么配了。因为goproxy的原理就是一个前缀的替换,他的配置格式和hosts文件本身的格式非常类似,只是做了一点扩展。所以你可以这样配置:

127.0.0.1:8080  www.1688.com   search.china.alibaba.com   list.china.alibaba.com

127.0.0.1:8080/aaa/ddd   www.1688.com   search.china.alibaba.com/ccc   list.china.alibaba.com/bbb

(注意:路径的斜杠是向左的斜杠,不是windows里面的向右的斜杠。)

继续在url上做文章,上面的两行配置都是反向代理,那是不是也可以把静态资源给代理起来呢?goproxy也做到了,你甚至可以这样配置:

D:/workspace/work/style   style.china.alibaba.com/app/search

看到这个简单的配置,你会意识到你装的apache、varnish可以卸掉了吧

既然代理的功能可以自己定制,那功能应该可以再多一点,比如:对某个前缀的url添加或者删除参数。比如下面的配置:

127.0.0.1:8080    www.1688.com     +debug=true   +begin=2    -n=y  -version

110.20.30.41:8080    www.1688.com     +debug=true   +begin=2    -n=y  -version=2

第一行配置的意思是:如果一个url的前缀是“www.1688.com”,那么就给这个url的参数中添加debug=true和begin=2(如果已经有了begin=1,则会被覆盖成begin=2,debug参数也同理),并移除n=y和version参数(无论version的值是什么,被移除的参数在url中时才移除,不在url中则不作修改)

第二行配置与第一行配置的不同是,移除version参数的条件必须是version的值等于2。

这种些看起来很奇特的配置在hosts中显得很另类,好在现在的浏览器对这种他们看不懂的映射配置直接忽略,只读取他们认识的配置,所以你可以在hosts文件中配置正常的和不正常的配置,正常的配置对没有使用代理的浏览器依然有效,不正常的配置则不会影响浏览器的工作。

目前goproxy我自己一直在使用,用得很爽,也有其他人在用,评价是很轻量级,如果你偏爱goproxy的简单强大的配置功能,那么做web开发切换环境时,可以考虑试试goproxy。当然goproxy不仅仅用于chrome,任何浏览器都可以可以配置代理指向goproxy所在机器的ip和端口号(默认是8000端口),欢迎交流。

原创文章:Goproxy代理-灵活的反向代理和静态资源代理,转载请注明:转载自戎码一生

Post Footer automatically generated by wp-posturl plugin for wordpress.



好书推荐:Java Web开发实战
  1. 博主这个项目还有更新吗?

    我最近用VPN的时候觉得有些地方不太好用,比如说用HTTP代理的时候可以用Chrome的proxy-switchysharp插件做自动切换,这样访问国内资源时和访问国外资源时都很快。因此我也用goproxy写了几行代码做了个可以指定本地出口IP的http proxy,然后用proxy-switchysharp自动切换出口。

    我在查找资料的时候找到了你这个项目,觉得可以把这个功能也加进去。

    不知道你有在github上传吗。