ziproxy和squid3搭建过程及配置步骤
时间:2016-06-15 来源:FISHERMAN\'S BLOG 作者:FISHERMAN 条评论
ziproxy部分
1. 安装
sudo aptitude install ziproxy,目前源里面的版本是3.2.0(使用aptitude show ziproxy可以查看源里面的版本)。安装后服务(守护进程)会自动启动,并自动加入开机启动项。2. 配置
sudo vim /etc/ziproxy/ziproxy.conf,编辑配置文件。默认配置需要修改的部分并不多,,以下是对配置文件的详细分析,如果要做快速测试,那么仅需要修改常规选项部分。常规选项
#监听端口,默认8080Port=8001#本地网卡绑定,默认绑定所有#如果有多网卡,可以考虑绑定特定的IPAddress="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"#上述白名单中应该绑定的特定IPBindOutgoingExAddr="98.7.65.43"#是否将ziproxy作为透明代理,默认关闭#如果需要打开,必须对本地用户做相应的转发处理#与传统代理功能可以并存TransparentProxy = false#传统代理ConventionalProxy = true#是否允许CONNECT请求,默认打开#一般用来过滤https请求AllowMethodCONNECT = true#本地请求限制(HTTP),配合透明代理使用,默认关闭RestrictOutPortHTTP = {80, 8080}#本地请求限制(HTTPS)RestrictOutPortCONNECT = {443}#更改UA,默认不更改,以下示例表示如何伪装FirefoxRedefineUserAgent = "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 = ...#超时设置,默认90sConnTimeout = 90
#是否在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 = falseProcessCSS = falseProcessJS = false#HTML优化的细节,仅当ProcessHTML=true时生效ProcessHTML_CSS = trueProcessHTML_JS = trueProcessHTML_tags = trueProcessHTML_text = trueProcessHTML_PRE = trueProcessHTML_NoComments = trueProcessHTML_TEXTAREA = true
#原图像最大压缩率,超过该数值不再重新压缩图像MaxUncompressedImageRatio = 500#压缩的图像格式ProcessPNG=trueProcessGIF=trueProcessJPG=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#是否压缩成JP2ProcessToJP2=true#禁止JP2输出(会覆盖上一个选项)ForceOutPutNoJP2=false#根据客户端智能选择是否压缩成JP2JP2OutRequiresExpCap = true#JP2压缩的图像质量JP2ImageQuality = {65,65,65,65}#下面还有一些JP2的图像压缩算法的选项,这里从略
#名单,默认有个简单的过滤:不显示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选项开关,默认关闭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缓存服务器,可以考虑以下选项#由于比较专业,请自行查看注释文件PreemptNameRes = falsePreemptNameResMax = 50PreemptNameResBC = 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查看。自动测试
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
ziproxylogtool这个日志分析工具。当然,也可以自己写一个脚本分析。可以使用PhantomJS作为前端自动化测试工具(可配合CasperJS),将其后端配置为ziproxy,即可将整个测试工作自动化。Squid3部分
1. 安装
sudo aptitude install squid3,目前源里面的版本是3.1.19。https_port,所以这里需要编译安装。
sudo apt-get build-dep opensslsudo apt-get build-dep opensshsudo apt-get install devscripts build-essential fakerootsudo apt-get build-dep squid3sudo apt-get source squid3cd 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看一下是不是已经激活。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. 配置
/etc/squid3/squid3.conf文档。网络参数
#监听端口,默认是3128#可以绑定IP或hostname,可以在此设置透明代理http_port 8002#监听https请求的端口,只在加速模式有用,默认没有打开https_port 443#外部访问地址,配合acl使用,在访问特定网址时使用特定IP#默认为nonetcp_outgoing_address none
控制参数
acl aclname acltype argument,其中acltype是配置文件内定的关键词,包括port, dst, src, proto, method, myip, myip, dstdomain,srcdomain, time, ident, proxy_auth, src_as, dst_as..,共计20多项,默认打开了最小配置。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首部的内容。aclname可以拆开成多行,也可以合并成一行(用空格隔开)。Squid在重新启动(或使用squid -k reconfigure重新加载配置)后,会从上向下扫描ACL,构建数据结构,将所有分组放在内存中。squid以一种叫做splay tree的数据结构存放一般的acl,该数据结构会在search发生后,返回结果的同时,将树的root旋转到树根的位置,如果下次搜索命中同一acl,查询时间会减少到O(1);对于正则acl,则使用链表存储,以减少比较时间。