环境:Ubuntu 12.04 LTS x64
ziproxy部分
1. 安装
ziproxy(以及其他)的安装,可以从source里面直接安装二进制版,也可以自行编译安装。一般而言,source里面的版本不会是软件的最新版本,而是经过测试的较为稳定的版本,但是最新版会修正一些bug,因此可根据情况妥善考虑。这里(以及下面)都是使用命令直接从source里面安装的。
输入sudo aptitude install ziproxy ,目前源里面的版本是3.2.0(使用aptitude show ziproxy 可以查看源里面的版本)。安装后服务(守护进程)会自动启动,并自动加入开机启动项。
2. 配置
输入sudo vim /etc/ziproxy/ziproxy.conf ,编辑配置文件。默认配置需要修改的部分并不多,,以下是对配置文件的详细分析,如果要做快速测试,那么仅需要修改常规选项部分。
常规选项
#监听端口,默认8080 Port=8001 #本地网卡绑定,默认绑定所有 #如果有多网卡,可以考虑绑定特定的IP Address="127.0.0.1" #Debug Log,默认关闭 DebugLog = "/var/log/ziproxy/debug.log" #Error Log,默认关闭 ErrorLog = "/var/log/ziproxy/error.log" #Access Log,默认关闭 AccessLog = "/var/log/ziproxy/access.log" #指定dump服务pid号的文件,默认打印到标准输出 PIDFile = "/var/run/ziproxy.pid" #下一跳代理地址,默认关闭 NextProxy = "127.0.0.1" NextPort=3128
控制选项
#禁止外部连接,仅接受来自该IP的请求 OnlyFrom="127.0.0.1" (注意:一定要去掉本行的注释。 我在自己的vps上,忘了注释掉本行,竟然导致网上有25000多个connections连接到这个ziproxy,最终导致我的vps不堪重负而down机) #最大同时访问数,默认无限制 MaxActiveUserConnections = 20 #以另外的身份运行,权限控制,默认关闭(以当前用户运行) RunAsUser = "ziproxy" RunAsGroup = "ziproxy" #信号拦截/屏蔽,默认关闭 InterceptCrashes = false #加密认证,默认关闭,枚举选项 AuthMode = 0 #认证文件(纯文本),当AutoMode=1时使用 AuthPasswdFile = "/etc/ziproxy/http.passwd" #认证文件(SSAL),当AutoMode=2时使用 AuthSASLConfPath = "/etc/ziproxy/sasl/" -
#对外部服务器的绑定地址,默认使用OS的默认IP #可以用来做负载均衡,有些网站会拒绝一个IP的频繁请求 #所有绑定IP的使用几率是均等的 BindOutGoing={} #与上述选项对应,在请求时不转换ip的白名单 BindOutgoingExList="/etc/ziproxy/bo_exception.list" #上述白名单中应该绑定的特定IP BindOutgoingExAddr="98.7.65.43" -
#是否将ziproxy作为透明代理,默认关闭 #如果需要打开,必须对本地用户做相应的转发处理 #与传统代理功能可以并存 TransparentProxy = false #传统代理 ConventionalProxy = true #是否允许CONNECT请求,默认打开 #一般用来过滤https请求 AllowMethodCONNECT = true #本地请求限制(HTTP),配合透明代理使用,默认关闭 RestrictOutPortHTTP = {80, 8080} #本地请求限制(HTTPS) RestrictOutPortCONNECT = {443} -
#更改UA,默认不更改,以下示例表示如何伪装Firefox RedefineUserAgent = "Mozilla/5.0 (compatible; UltraBrowser/8.1; CP/M; console40x24; z80)"
数据处理
总体相关
#黑名单,不使用ziproxy的列表;可以作为bug的临时解决方案 URLNoProcessing = "/etc/ziproxy/noprocess.list" #禁止访问的名单,会返回一个403错误 URLDeny = "/etc/ziproxy/deny.list" #Check header的选项,默认关闭 ViaServer = ... #超时设置,默认90s ConnTimeout = 90
Gzip相关
#是否在Accept-Encoding中覆盖客户端设置,加入gzip选项,默认true #ziproxy会根据客户端原始的Http首部决定是否需要解压gzip流 OverrideAcceptEncoding = true #如果远程服务器已经启用gzip压缩,是否解压 #ziproxy的某些操作(html优化、DNS相关的选项)必须解压后才能操作 #一般与下面的Gzip选项同值 DecompressIncomingGzipData = true #最大解压缩比例(如果超出,则放弃解压),默认是20倍 MaxUncompressedGzipRatio = 2000 #最大压缩文件(默认1M),超出此数值不再(重新)压缩 MaxSize=1048576 #是否使用gzip无损压缩 Gzip=true #使用gzip压缩的文件类型,默认一大堆,基本包含了所有text like选项 LosslessCompressCT={...} LosslessCompressCTAlsoXST = true #优化html/css/js的选项,默认关闭 #在当前版本,该功能还不稳定 ProcessHTML = false ProcessCSS = false ProcessJS = false #HTML优化的细节,仅当ProcessHTML=true时生效 ProcessHTML_CSS = true ProcessHTML_JS = true ProcessHTML_tags = true ProcessHTML_text = true ProcessHTML_PRE = true ProcessHTML_NoComments = true ProcessHTML_TEXTAREA = true
Image相关
#原图像最大压缩率,超过该数值不再重新压缩图像 MaxUncompressedImageRatio = 500 #压缩的图像格式 ProcessPNG=true ProcessGIF=true ProcessJPG=true #压缩的图像质量,四个参数指的都是压缩率的百分比(压缩后的体积:压缩前) #分别应用于图像像素在(0,5000],(5000,50000]或某个尺度<150pixel,(50000,250000], (250000,...)范围内 ImageQuality = {65,65,65,65} #Image压缩后是否允许信息丢失,默认关闭 #如果打开,会进一步压缩图像,但是可能做图像alpha通道去除、gif只保留第一帧等处理 AllowLookChange = true #是否转化成灰度图像,默认关闭 ConvertToGrayscale = false -
##JPEG 2000相关选项 ##注意JPEG2000一般不能直接在浏览器中显示,因此必须还要转回普通JPEG才能显示 ##JPEG2000的压缩比更高,因此可以用来节省传输流量 #原文件是JP2000时是否处理 ProcessJP2=false #是否压缩成JP2 ProcessToJP2=true #禁止JP2输出(会覆盖上一个选项) ForceOutPutNoJP2=false #根据客户端智能选择是否压缩成JP2 JP2OutRequiresExpCap = true #JP2压缩的图像质量 JP2ImageQuality = {65,65,65,65} #下面还有一些JP2的图像压缩算法的选项,这里从略
Ad-Blocker功能:通过黑名单设置,ziproxy可以作为广告过滤器
#名单,默认有个简单的过滤:不显示1×1的透明GIF对象 URLReplaceData = "/etc/ziproxy/replace.list" #类似,但是仅屏蔽可见元素(即不会屏蔽脚本),兼容性更好 URLReplaceDataCT = "/etc/ziproxy/replace_ct.list" #配合上个选项,屏蔽的类型 URLReplaceDataCTList = {"image/jpeg", "image/gif", "image/png", "application/x-shockwave-flash"} #依然是一个类型自动扩展的便捷选项 URLReplaceDataCTListAlsoXST = true
优化选项
TOS相关
#TOS选项开关,默认关闭 TOSMarking = false #默认情况 TOSFlagsDefault = 0 #特殊TOS控制名单 TOSMarkAsDiffURL = "/etc/ziproxy/change_tos.list" #特殊TOS控制类型 TOSMarkAsDiffCT = {"video/flv", "video/x-msvideo", "audio/*", "application/x-shockwave-flash", "application/x-rpm", "application/x-msi", "application/x-tar"} #以上类型子类型的前缀为"x-"时,是否也使用特殊TOS控制 TOSMarkAsDiffCTAlsoXST = true #特殊TOS流量阈值 TOSMarkAsDiffSizeBT = 4000000 #对特殊名单或特殊类型进行的TOS设置 TOSFlagsDiff = 16
DNS相关
#如果拥有DNS缓存服务器,可以考虑以下选项 #由于比较专业,请自行查看注释文件 PreemptNameRes = false PreemptNameResMax = 50 PreemptNameResBC = true
特殊选项
#如果用户使用IE浏览,对于出错信息的优化 WA_MSIE_FriendlyErrMsgs = true
3. 测试
测试分为两个部分:页面总体测试和元素单个测试,需要测试的主要参数是压缩率和压缩所用时间。测试之前需要使用sudo service ziproxy restart 重启服务,以应用修改后的配置文件。
手工测试
以上配置文件中我们使用了传统正向代理的转发方式,因此手工测试只需要把浏览器的代理设为常规选项中的 Address:Port 即可。推荐使用可以随时切换代理的插件,chrome可以使用 SwithySharp,Firefox可使用著名的 AutoProxy,方便随时切换代理状态,插件的使用方法较为简单,请自行搜索。
测试步骤为:打开一个页面,按 F12 打开开发者工具(IE9+, chrome, firefox, 以下以chrome为例),在 Network 选项页查看压缩效果;关闭代理,打开同一页面,按 Ctrl+F5 强制刷新,然后看看原始页面大小,进行对比;或者在开发者工具中设置关闭cache,亦可避免浏览器直接从缓存中读取内容(响应代码304)。注意 Size 表示传输大小,而 Content 表示实际大小,二者的区别参见 这里。页面总体加载时间显示在最下方,而元素的加载时间可以通过各自的 Timeline 查看。
自动测试
这里通过分析ziproxy的日志文件来达到自动测试的目的,AccessLog 的格式如下:
Log format: TIME (unix time as seconds.msecs) PROCESS_TIME (ms) [USER@]ADDRESS (address with daemon mode only) FLAGS ORIGINAL_SIZE SIZE_AFTER_(RE)COMPRESSION METHOD URL
所以,根据URL(第8列)来分析PROCESS_TIME、ORIGINAL_SIZE和SIZE_AFTER_(RE)COMPRESSION这三列(2,5,6)即可得到所需数据。
如果是编译安装ziproxy,官方提供了 ziproxylogtool 这个日志分析工具。当然,也可以自己写一个脚本分析。可以使用 PhantomJS作为前端自动化测试工具(可配合 CasperJS),将其后端配置为ziproxy,即可将整个测试工作自动化。
Squid3部分
1. 安装
sudo aptitude install squid3 ,目前源里面的版本是3.1.19。
从源里面直接安装的版本不能支持ssl,我们要使用https_port ,所以这里需要编译安装。
sudo apt-get build-dep openssl sudo apt-get build-dep openssh sudo apt-get install devscripts build-essential fakeroot sudo apt-get build-dep squid3 sudo apt-get source squid3 cd squid-<version> sudo vim debian/rules
在DEB_CONFIGURE_EXTRA_FLAGS 中添加--enable-ssl (如果需要动态证书生成功能,还需要加上--enable-ssl-crtd 选项),然后使用sudo debuild -us -uc -b 进行自动编译,编译的时间可能比较长。其输出是几个deb包,使用dpkg安装即可,可能会缺少某些依赖,请根据提示安装。安装完成后可以使用sudo squid3 -v | grep ssl 看一下是不是已经激活。
如果需要squid的最新版,就只能编译安装了。从网站上下载 squid的最新源码,安装依赖(可以用上面的 build-dep 方法),然后configure,注意这里的选项非常多,可以参考以下:
./configure -prefix=/usr -localstatedir=/var -libexecdir=${prefix}/lib/squid3 -srcdir=. -datadir=${prefix}/share/squid3 -sysconfdir=/etc/squid3 -with-default-user=proxy -with-logdir=/var/log -with-pidfile=/var/run/squid3.pid -enable-inline -enable-async-io=8 -enable-storeio="ufs,aufs,diskd" -enable-removal-policies="lru,heap" -enable-delay-pools -enable-cache-digests -enable-underscores -enable-icap-client -enable-follow-x-forwarded-for -enable-basic-auth-helpers="LDAP,MSNT,NCSA,PAM,SASL,SMB,YP,DB,POP3,getpwnam,squid_radius_auth,multi-domain-NTLM" -enable-ntlm-auth-helpers="smb_lm," -enable-digest-auth-helpers="ldap,password" -enable-negotiate-auth-helpers="squid_kerb_auth" -enable-external-acl-helpers="ip_user,ldap_group,session,unix_group,wbinfo_group" -enable-arp-acl -enable-esi -enable-ssl -enable-ssl-crtd -enable-icmp -enable-zph-qos -enable-wccpv2 -disable-translation -with-logdir=/var/log/squid3 -with-filedescriptors=65536 -with-large-files -with-default-user=proxy
其实有些选项用默认的就可以了,这里全部列出来了…官方的安装文档是2.6的,不保证一样适用。另外需要注意,编译安装后,程序的名字是squid而不是squid3,切记切记。
2. 配置
squid3的配置较之ziproxy更加复杂,可以参考这本 《squid 中文权威指南》进行上手。虽然该书中使用的squid版本较为陈旧,但是绝大多数参数配置还是类似的,3.1的官方文档 见此,当然也可以直接看 /etc/squid3/squid3.conf 文档。
由于squid3的配置参数过于繁多,这里仅列出需要注意的几个部分,其余部分请自行查看相关注释或官方文档。
网络参数
#监听端口,默认是3128 #可以绑定IP或hostname,可以在此设置透明代理 http_port 8002 #监听https请求的端口,只在加速模式有用,默认没有打开 https_port 443 #外部访问地址,配合acl使用,在访问特定网址时使用特定IP #默认为none tcp_outgoing_address none
控制参数
Access List,即ACL,是访问控制的核心部分,其格式是acl aclname acltype argument ,其中acltype 是配置文件内定的关键词,包括port, dst, src, proto, method, myip, myip, dstdomain,srcdomain, time, ident, proxy_auth, src_as, dst_as..,共计20多项,默认打开了最小配置。
一般而言,src使用ip匹配,dst使用域名匹配(dstdomain )速度较快,否则需要进行正/反向DNS查询,增加延迟时间;src_as 和dst_as 使用了路由器的AS(自主系统)号;myport , myip , mydomain 指的都是对squid自身参数的配置(从哪个端口/ip/域名可以访问squid);method , proto 分别指的是HTTP方法和访问协议;ident 指的是RFC 1413规定的ident协议;maxconn 可以限制用户的最大TCP连接数;browser 可以限制UA;以_regex 为后缀的选项,支持正则表达式;以_type 为后缀的选项,限制的是Content-Type 首部的内容。
acl的匹配使用OR逻辑, aclname 可以拆开成多行,也可以合并成一行(用空格隔开)。Squid在重新启动(或使用 squid -k reconfigure 重新加载配置)后,会从上向下扫描ACL,构建数据结构,将所有分组放在内存中。squid以一种叫做 splay tree的数据结构存放一般的acl,该数据结构会在search发生后,返回结果的同时,将树的root旋转到树根的位置,如果下次搜索命中同一acl,查询时间会减少到O(1);对于正则acl,则使用链表存储,以减少比较时间。
根据匹配规则速度的区别,acl type被分为 fast 和 slow 两类,详见 官方文档,推荐尽量使用标记为 fast 的类型。
-
|