前段時間發現使用 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就支援了負載均衡。蘋果瀏覽器 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...... 唉。