前段时间发现使用 COW 这个项目来做代理有一个很不错的功能就是二级代理可以实现多线路的负载均衡!它默认是一条主要其他做备份的,通过配置,把代理模式改为hash则可以实现多条线路负载均衡!
当然了, COW 也是有缺点的,第一它对于陌生网站会直接连接至少一次,这会造成DNS泄露,关于这个我之前专门写了一篇文章讲过,这里不再赘述;第二用久了不知道是我的使用习惯问题还是算法问题,经常还是会遇到能直连的走代理,要代理的走直连;第三这个的规则都给我写在了网络配置里边的忽略代理的框框里,我去,虽然无所谓但看起来好变态!
好吧,对于 COW 的智能代理来说,我更喜欢它的负载均衡这一功能——毕竟,我还是推崇白名单的。为此,我还专门写过一篇文章,说“是时候使用 PAC 白名单了”。
但平时买一个 SS 账号,都会给你不止一条的线路,只用一条简直浪费啊!尤其是在体验了 COW 的负载均衡——我第一次知道原来出了宽带,代理也可以负载均衡啊我去——普通的代理怎么能够满足我的需求~~~
于是我就把之前一直使用的 breakwa11 的白名单 PAC 配置文件做了点修改,让它也实现了简单的负载均衡。
原理
我们所说的pac其实是一个自动获取代理的配置文件,浏览器在解析域名的时候会用钩子调用 FindProxyForURL(url, host) 这个函数,其实,pac配置文件本质就是一个 javascript 脚本!
所以,我们只需要在pac里多写一个函数,在返回代理的时候随机返回多个就行了,这样浏览器每次访问不同的URL,就会请求到不同的代理配置,从而达到了负载均衡的效果。
缺点
好吧,这其实是个伪负载均衡,但确实有效,只不过没有那么智能,简单粗暴!遇到需要 IP 验证的网站则需要设置全局或者关闭代理从而避开 PAC 才行(好在这样的网站不多,现在都是 cookie 啦)。
代码
我们只在最后返回代理配置处做修改,所以不会影响到其他的配置,理论上你可以对正在使用的任意版本pac做补丁,首先我们把代理地址从变量改为数组:
1 2 3 4 5 |
var wall_proxy = new Array( "SOCKS5 127.0.0.1:1080; SOCKS 127.0.0.1:1080;", "SOCKS5 127.0.0.1:1081; SOCKS 127.0.0.1:1081;", "SOCKS5 127.0.0.1:1081; SOCKS 127.0.0.1:1082;", //add more proxy to loadbalance! "SOCKS5 127.0.0.1:1082; SOCKS 127.0.0.1:1083;"); |
这样添加多个代理上去,然后在返回代理的地方插入函数:
1 2 3 |
if (okToLoadBalance) { return loadBalance(); } |
在这里我插入了一个 okToLoadBalance的变量作为开关,如果关闭则与普通pac一样,只对第一条代理生效。
1 2 3 4 5 6 7 8 9 |
function loadBalance() { var random = 0; while(1) { random = Math.round((Math.random() * 10) - 1); if (random < wall_proxy.length) { return wall_proxy[random]; } } } |
然后根据 javascript 的随机数生成来实现随机取数组中的代理条目返回,这里我做了一个选择器,会根据数组的元素数量做选择——这样就可以支持“任意”数量的代理条目了。
这里的任意是指10条一下哈,因为随机数就是0-1嘛,我觉得再多……也没有意义了是吧?
这样这个pac就支持了负载均衡。Safari 9.0.2 执行查询100000次查询耗时100毫秒多一点,速度较之不负载均衡的话差别不大。
使用
好了,其实不需要你自己动手去修改的,我已经改好了呢!去GitHub下载我修改的版本即可。
注意我只修改了whitelist.pac——即域名白名单,其他未动!
1 2 3 4 5 6 7 8 |
cd ~ mkdir git cd git git clone https://github.com/R0uter/gfw_whitelist.git cd gfw_whitelist python main.py //编辑whitelist.pac文件,在第一行打开负载均衡并添加你的代理配置 |
如果你实在懒得生成,就直接点这里下载这个pac文件,打开编辑代理即可食用!
本文由 落格博客 原创撰写:落格博客 » 用 PAC 实现类似 COW 的多 代理 负载均衡
转载请保留出处和原文链接:https://www.logcg.com/archives/1412.html
tcproute2试过吗?说是比cow好,能否也写个教程啊,谢谢!
cow就是策略比较软,优点是负载均衡~这个我看了,还在快速迭代呢,不稳定啊。先不测试了,主要是目前也没有个好的客户端,我还在用没人维护了的goagentx……唉。