2013年7月29日星期一

Squid翻墙负载均衡尝试

Squid源自Linux平台,是开源软件。最新版本是3.3,但Windows上的原生版本才2.7,落后了两年。而且据说由于Windows上的支持软件的限制,Squid的Windows版本开发暂停。当然,你还是可以在Cygwin里编译Squid,就像HAProxy,这样编译好的程序加上cygwin的dll,就可以单独运行。效率就没有原生代码高了。

Squid能根据请求的特征,选择上级代理或直连,这相当于火狐插件AutoProxy和Chrome插件FoxyProxy。基于这个特性,Squid应该可以根据url屏蔽一部分广告,这相当于AdBlock Plus的部分功能。(Squid应该不能移除文字广告)

也有人让Squid根据网络状况(而非规则)自动判断直连还是走代理,见复杂版简单版

这是我的架构图:

squid.conf如下

acl localnet src 10.0.0.0/8    # RFC1918 possible internal network
acl localnet src 172.16.0.0/12    # RFC1918 possible internal network
acl localnet src 192.168.0.0/16    # RFC1918 possible internal network
acl localnet src fc00::/7       # RFC 4193 local private network range
acl localnet src fe80::/10      # RFC 4291 link-local (directly plugged) machines
acl SSL_ports port 443
acl Safe_ports port 80        # http
acl Safe_ports port 21        # ftp
acl Safe_ports port 443        # https
acl Safe_ports port 70        # gopher
acl Safe_ports port 210        # wais
acl Safe_ports port 1025-65535    # unregistered ports
acl Safe_ports port 280        # http-mgmt
acl Safe_ports port 488        # gss-http
acl Safe_ports port 591        # filemaker
acl Safe_ports port 777        # multiling http
acl CONNECT method CONNECT
http_access allow all
icp_access allow all
http_port 3128
cache_peer 127.0.0.1 parent 8087 0 no-query no-digest round-robin weight=3 name=goagent
cache_peer 127.0.0.1 parent 8580 0 no-query no-digest round-robin weight=2 name=freegate
cache_peer 127.0.0.1 parent 8090 0 no-query no-digest round-robin weight=3 name=privoxy-ha-tcp
cache_peer_domain freegate !.thisav.com  #域名以.开头,可匹配子域名
cache_peer_domain freegate !.sexinsex.net
cache_peer_domain freegate .
cache_peer_access freegate allow all
cache_mem 10 MB
cache_dir ufs /var/cache/squid 200 16 256
coredump_dir /var/cache/squid
acl msdn dstdomain -i msdn.microsoft.com
acl google dstdomain -i .google.com
cache allow msdn
cache allow google
refresh_pattern -i msdn\.microsoft\.com/.+/library 10080 20% 10080 ignore-private ignore-no-cache
refresh_pattern -i microsoft\.com/ 14400 50% 43200 ignore-private ignore-no-cache
refresh_pattern -i google\.com/.*\.js$ 2880 50% 28800 override-expire
never_direct allow all
eui_lookup off

值得注意是这么几行:

cache_peer 127.0.0.1 parent 8087 0 no-query no-digest round-robin weight=3 name=goagent
cache_peer 127.0.0.1 parent 8090 0 no-query no-digest round-robin weight=3 name=privoxy-ha-tcp
cache_peer 127.0.0.1 parent 8580 0 no-query no-digest round-robin weight=2 name=freegate

这是添加了三个上级代理。自由门比较慢,所以权重低一点。这三个代理根据权重轮流使用。比如访问facebook,流量就根据权重分配到这三个代理去了

Squid也可以根据服务器响应速度自动分配权重。这个响应速度到底是服务器ping响应的速度,还是发送请求返回请求的速度,我还没搞清楚。如果是后者的话,那就很自动化了。比如我访问facebook,goagent最先返回网页,squid就喜欢用goagent;访问twitter的时候,自由门最先返回网页,squid就喜欢用自由门。

cache_peer_domain freegate !.thisav.com  #域名以.开头,可匹配子域名
cache_peer_domain freegate !.sexinsex.net
cache_peer_domain freegate .
cache_peer_access freegate allow all

对于某些请求,不要走某个上级代理。前两句说对thisav.com的请求,不要走自由门。(因为自由门不能浏览色情网站)后两句应该是一样的,意思是其他网站可以走自由门。

acl msdn dstdomain -i msdn.microsoft.com
acl google dstdomain -i .google.com
cache allow msdn
cache allow google

设置Squid只缓存特定文件。因为毕竟浏览器端也在缓存,所以让仅让Squid缓存需要的文件,避免浪费CPU和存储器。这里设置了两个规则,用cache指令要求缓存来自msdn.microsoft.com和google.com的文件,其他文件则不缓存。注意,不能在最后写cache deny all,写了的话疑似就直接拒绝缓存任何文件了,包括来自msdn和google的,不知道是不是bug还是我哪里没设置好。

refresh_pattern -i microsoft\.com/ 14400 50% 43200 ignore-private ignore-no-cache
refresh_pattern -i msdn\.microsoft\.com/.+/library 10080 20% 10080 ignore-private ignore-no-cache

这是设置缓存策略。翻墙的时候速度比平时慢,Squid可以把网页缓存下来,下次访问这个网页的时候,Squid就直接把缓存的网页给浏览器了,不用再经过翻墙软件了

第一句指令是说microsoft.com的网页,至少缓存14400分钟,最多缓存43200分钟,有50%的概率网页在服务器端未更改(数字越大,越可能从缓存直接返回)。

eui_lookup off

如果你的cache.log写着ERROR: ARP / MAC / EUI-* operations not supported on this operating system.那么可以设置此指令。eui跟MAC差不多,就是机器地址。你也可以在编译Squid时置disable eui参数。

最后,Squid的局限在于它不支持socks的上级代理。所以socks代理必须转化成http代理,这会引起速度损失。Privoxy可以转化socks为http。所以每运行一个socks代理,就要开一个Privoxy。内存占用也增加了。

polipo也是一个HTTP缓存代理,据说支持socks代理……

没有评论: