Squid 2.6 编译配置精解
./configure
--prefix=/opt/squid
#这里设置安装目录所有可执行文件,日志,和配置文件的默认目录
--enable-async-io
#异步 I/O 是 squid 技术之一,用以提升存储性能。aufs 模块使用大量的线程来执行磁盘I/O 操作。该代码仅仅工作在 linux 和 solaris 系统中。=N_THREADS 参数改变 squid 使用的线程数量。请注意--enable-async-io 是打开其他三个./configure 选项的快捷方式,它等同于:--with-aufs-threads=N_THREADS --with-pthreads --enable-storeio=ufs,aufs
--enable-dlmalloc
#使用该选项将 squid 源代码包中的 dlmalloc 包编译和链接进来。假如你的系统中已安装 dlmalloc,你能使用=LIB 参数指定库的路径。
--enable-storeio=ufs,aufs,diskd,null
#Squid 支持大量的不同存储模块。通过使用该选项,你告诉 squid 编译时使用哪个模块。支持 ufs,aufs,diskd,和 null 模块。
--enable-snmp
#打开SNMP管理
--disable-internal-dns
#禁止Squid进行DNS解析,由外部程序”dnsserver”来完成。
--enable-epoll
#打开EPOLL支持
--with-large-files
#打开大文件,如解决日志文件大于2G限制
--with-maxfd=65535
#进程能打开的最大文件数,默认1024,相当于ulimit -SHn 65535
--enable-default-err-language=Simplify_Chinese
#设定缺省的错误语言
--enable-err-languages=Simplify_Chinese
#选择支持的语言种类
--enable-removal-policies="heap,lru"
#排除策略是 squid 需要腾出空间给新的 cache 目标时,用以排除旧目标的机制,最少近期使用(LRU),贪婪对偶大小(GDS),最少经常使用(LFU)。为了使用 GDS 或 LFU 策略,你需要指定:--enable-removal-policies=heap,lru 默认就是这个参数
#--enable-large-cache-files
#打开大缓存文件支持,默认为不大于2G
--disable-kqueue
#关闭kqueue支持
--disable-poll
#关闭poll支持
--disable-select
#关闭select支持
--enable-x-accelerator-vary
#该高级功能可能在squid被配置成加速器时使用。它建议squid在响应请求时,从后台原始服务器中寻找X-Accelerator-Vary头
--enable-follow-x-forwarded-for
#该高级功能可能在squid被配置成加速器时使用。它建议squid在响应请求时,从后台原始服务器中寻找follow-x-forwarded-for头
[编译参数注解]
在正式开始编译、运行Squid之前,我们需要对Squid进行一系列的配置。下面我们分别解释其参数的具体含义:
--cache-file=FILE 把运行configure时的输出信息放置到指定文件中。
--help 输出帮助信息
--no-create 只是检测系统是否可以安装Squid,而不生成任何文件。
--quiet, --silent 不显示运行configure时输出信息
--site-file=FILE use FILE as the site file
--version 显示生成configure脚本的autoconf版本号
Directory and file names:
--prefix=PREFIX 将Squid的安装文件放置到此目录下
--bindir=DIR 将Squid安装目录的bin目录放置在此目录下
--sbindir=DIR 将Squid安装目录的sbin目录放置在此目录下
--libexecdir=DIR 将Squid安装目录的libexec目录放置在此目录下
--datadir=DIR 将Squid安装目录的share目录放置在此目录下
--sysconfdir=DIR 将Squid安装目录的etc目录放置在此目录下
--localstatedir=DIR 将Squid安装目录的var目录放置在此目录下
--libdir=DIR 将Squid安装目录的lib目录放置在此目录下
--includedir=DIR C header files in DIR [PREFIX/include]
--oldincludedir=DIR C header files for non-gcc in DIR [/usr/include]
--infodir=DIR info documentation in DIR [PREFIX/info]
--mandir=DIR 将Squid安装目录的man目录放置在此目录下
--enable and --with options recognized:
--enable-dlmalloc[=LIB] 使用新的malloc函数
--enable-gnuregex 支持GNUregex
--enable-xmalloc-statistics 支持在统计页面中显示malloc统计
--enable-carp 支持CARP协议
--with-aufs-threads=N_THREADS 设定aufs所使用的线程数
--with-pthreads 支持POSIX Threads
--with-aio 使用POSIX AIO
--with-dl 使用动态链接
--enable-storeio="list of modules" 选择支持的存储种类
--enable-delay-pools 支持带宽管理功能
--disable-wccp 不支持WCCP协议
--enable-kill-parent-hack 在关闭child进程时同时关闭父进程。
--enable-snmp 支持SNMP监控
--enable-cachemgr-hostname[=hostname] 设定cachemgr.cgi缺省名称
--enable-arp-acl 支持ARP ACL功能
--enable-htcp 支持HTCP协议
--enable-ssl 支持SSL协议。
--with-openssl[=prefix] 设定Openssl的开发库路径。
--enable-cache-digests 使用缓存摘要
--enable-default-err-language=lang 设定缺省的错误语言
--enable-err-languages="lang1 lang2.." 选择支持的语言种类
--with-coss-membuf-size 设定COSS membuf 大小 (缺省为1048576 bytes)
--enable-poll 使用poll()代替select()。
--disable-poll 不使用poll
--disable-http-violations 不支持HTTP标准不兼容的命令
--enable-linux-netfilter 支持透明代理
--disable-internal-dns 禁止Squid进行DNS解析,由外部程序”dnsserver”来完成。
--enable-truncate 使用truncate()代替unlink()。
--disable-hostname-checks 支持在主机名中使用特殊字符。
--enable-underscores 支持带“_”的域名。
--enable-auth="list of auth scheme modules" 配置支持的认证模块种类
[配置文件注解]
基于squid 2.6的配置文件的解释
http_port 80 vhost vport
#监听80端口,支持基于主机和端口的加速
icp_port 0
#如果制定了icp_port,代理服务器可以使用ICP协议从上层代理服务器查询缓存,这里没有指定。
cache_mem 1024 MB
#squid使用的缓存大小,一般为实体内存的一半
cache_swap_low 90
cache_swap_high 95
#当缓存空间达到95%时,新的内容将取代旧的内容而不添加到缓存目录中。直到空间又降到90%为止。这个语句可以防止cache缓存空间被占满的情况。
maximum_object_size 100 MB
#squid最大缓存对象为100MB
maximum_object_size_in_memory 8 MB
#squid内存最大存储对象为8MB,超过这个值将不保存在内存,这个对squid加速效果影响比较大,有的人将这个设置为8KB而一般网站的图像都大于8KB,如果squid每次都从磁盘为外部请求提供文件,那么是很慢的。
ipcache_size 10240
fqdncache_size 10240
#当一个域名来访问squid服务器时,DNS服务器正解后的IP放入ipcache缓存中,等待squid返回数据时建立连接使用。
# 当一个IP来访问squid服务器时,DNS服务器反解后的域名将放入fqdncache缓存中,等待squid返回数据时建立连接使用
cache_dir diskd /cache 132516 128 128
#定义cache缓存位置位于/cache ,它的容量为132516M,一级缓存为128个目录,二级缓存为128个目录
#相对于磁盘的大小,缓存目录的优化
#cache空间小于100G
#cache_dir diskd /cache 102400 64 64
#cache空间大于100G,小于500G时
#cache_dir diskd /cache 307200 128 128
#cache空间大于500G时
#cache_dir diskd /cache 1024000 256 256
logformat 21v-squid %ts.%03tu %6tr %>a %Ss/%03Hs %h" "%{User-Agent}>h"
#定义squid的日志格式
cache_access_log /cache/logs/access.log 21v-squid
#定义log日志位置
cache_log /cache/logs/cache.log
#记录squid的调试和状态出现的错误信息
cache_store_log none
#定义记录进入和离开缓存的每个文件的目录,此处定义为none,就是不存储这类信息。
#strip_query_terms off
check_hostnames off
#关闭DNS对hostname的检测
dns_children 30
#定义dns进程个数为30
dns_testnames localhost
#squid启东时dns查询测试,用squid -D 启动可以跳过此测试。
cache_mgr
#管理员邮箱
visible_hostname cdn.21vianet.com
#可见的squid服务器名称
cache_effective_user squid
#squid用户
cache_effective_group squid
#squid组
memory_pools off
#memory_pools目的是分配一些内存空间,以备squid 不时之需使用,建议关掉。
memory_pools_limit none
#当开启momory_pools时在这里指定分配空间大小
read_ahead_gap 20 KB
#squid 第一次缓冲数据的大小(默认为16KB)
store_avg_object_size 6 KB
#指定文件的平均大小,squid可以根据这个估计出它能存储的文件个数
store_objects_per_bucket 256
#哈希表中每个容器存储的对象个数,此值过低将增加容器(buecket)个数,降低存储速度。
request_header_max_size 64 KB
#指定接受http头的最大量,可以用于定位bugs.
log_icp_queries off
#关掉icp日志,与icp_port 这个有关,既然我们没有给icp传输端口,当然也就要关掉日志了。
negative_ttl 0
#将404错误,缓存时间设置为0,即不缓存404错误网页
acl IP dstdom_regex ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$
http_access deny IP
#不接受IP地址的目的域名
refresh_pattern -i ^。com.cn/json/.* 10 50% 20 ignore-reload ignore-private ignore-no-cache
# -i 为忽略大小写
ignore-reload: 忽略http的no-cache头,reload 头
ignore-private: 忽略http的private头
ignore-no-cache:忽略Pragma: no-cache和Cache-control:no-cache头
acl 2 url_regex -i ^*.(asp|php|jsp|cgi|pl|py|aspx)
cache deny xindanzhongguo2
不缓存下的动态页面
refresh_pattern . 1440 20% 4320 ignore-reload reload-into-ims override-expire override-lastmod
reload-into-ims:改变no-cache为返回时间戳对比验证。
override-expire:忽略有效期验证,先考虑最小时间min.如果文件存活时间小于min,认为是新的。
override-lastmod:忽略更改时间,先考虑最小时间min.如果文件存活时间小于min,认为是新的
error_directory /squid/share/errors/Simplify_Chinese
定义错误日志语言为中文
quick_abort_min 16 KB
quick_abort_max 16 KB
quick_abort_pct 100
#定义缓存继续下载已经终止的请求的大小,如果未下载完的小于最小值继续下载直到完成为止,最小值默认值16,
#大于最大值立即终止下载,最大值默认值16
#超过已经完成部分的指定百分比,继续下载直到完成为止,百分比默认值95
#一下设定主要是保证数据完整性
range_offset_limit -1
关闭 squid对于http多线程服务的预抓取
read_timeout 5 minutes
当 squid服务器读取到请求后5分钟无其它数据,则服务器认为超时
request_timeout 5 minutes
建立连接后,squid等待会话的时间
client_lifetime 30 minute
浏览器可以连接服务器的最大时间
acl all src 0.0.0.0/0.0.0.0
acl localhost src 127.0.0.1/255.255.255.255
acl ControlCentre src 211.151.67.0/255.255.255.0 59.151.19.0/255.255.255.0
acl PURGE method PURGE
acl manager proto cache_object
http_access allow PURGE localhost
http_access allow PURGE ControlCentre
http_access allow manager ControlCentre
http_access deny PURGE !ControlCentre
hierarchy_stoplist cgi-bin
acl QUERY urlpath_regex cgi-bin
cache deny QUERY
acl DYNTYPE urlpath_regex -i cgi-bin \.asp \.php \.jsp \.cgi \.pl \.py \.aspx
cache deny DYNTYPE
header_access Via deny all
#header_access X-Forwarded-For deny all
header_access header allow all
#acl banned_sites url_regex "/home/squid/etc/banned.list"
#http_access deny banned_sites
http_access allow all
#Parent
acl ParentDomain dstdomain
cache_peer 211.151.78.40 parent 80 0 no-query no-netdb-exchange originserver round-robin
cache_peer 211.151.78.38 parent 80 0 no-query no-netdb-exchange originserver round-robin
cache_peer_access 211.151.78.40 allow ParentDomain
cache_peer_access 211.151.78.38 allow ParentDomain
always_direct allow !ParentDomain
#Parent end
[cache_peer命令]
NO-QUERY:不做查询操作,直接获取数据
NO-NETDB-EXCHANGE:代理服务器之间不交互信息
NO-DIGEST:代理服务器之间不做摘要表查询,直接用ICP协议沟通(同级代理)
PROXY-ONLY:直接获取对方缓冲,转交给代理服务器的客户端,而不存入本地
ROUND-ROBIN:如果设置数部上层服务器,那么轮流查询父级服务器
LOGIN=USER:PASSWD:要求对方做帐号及密码验证
[Squid安装调试中的几个常用命令]
1,初始化你在 squid.conf 里配置的 cache 目录,第一次启动squid服务时必须输入此命令,如果有错误提示,请检查你的 cache目录的权限。
squid/sbin/squid -z
2,对你的squid.conf 排错,即验证 squid.conf 的 语法和配置。
squid/sbin/squid -k parse
如果squid.conf 有语法或配置错误,这里会返回提示你,如果没有返回,恭喜,可以尝试启动squid。
3,在前台启动squid,并输出启动过程。
squid/sbin/squid -N -d1
如果有到 ready to server reques,恭喜,启动成功。
然后 ctrl + c,停止squid,并以后台运行的方式启动它。
4,启动squid在后台运行。
squid/sbin/squid -s
这时候可以 ps -A 来查看系统进程,可以看到俩个 squid 进程。
5,停止 squid
squid/sbin/squid -k shutdown
这个不用解释吧。
6,重引导修改过的 squid.conf
squid/sbin/squid -k reconfigure
这个估计用的时候比较多,当你发现你的配置有不尽你意的时候,可以随时修改squid.conf,然后别忘记对你的 squid.conf排错,然后再执行此指令,即可让运行中squid重新按照你的squid.conf 来运行。
7,把squid添加到系统启动项
编辑 /etc/rc.d/rc.local
添加如下行:/usr/local/squid/sbin/squid -s
当然,并不是每个人都喜欢这种启动方式,你可以用你最习惯的方式;或者把它安装为服务。
再来点其他的。
1,修改cache 缓存目录的权限。
chown -R squid:squid /home/cache
我的cache缓存目录是 /home/cache,squid执行用户和用户组是 squid,squid。
2,修改squid 日志目录的权限
chown -R squid:squid /usr/local/squid/var/logs
这一步并不是适合每一个使用squid的用户.意为让squid有权限在该目录进行写操作 。
例如生成access.log cache.log store.log
3,查看你的日志文档。
more /usr/local/squid/var/logs/access.log | grep TCP_MEM_HIT
该指令可以看到在squid运行过程中,有那些文件被squid缓存到内存中,并返回给访问用户。
more /usr/local/squid/var/logs/access.log | grep TCP_HIT
该指令可以看到在squid运行过程中,有那些文件被squid缓存到cache目录中,并返回给访问用户。
more /usr/local/squid/var/logs/access.log | grep TCP_MISS
该指令可以看到在squid运行过程中,有那些文件没有被squid缓存,而是现重原始服务器获取并返回给访问用户。
关于 TCP_XXXX 等参数及代表的信息,请参看彭勇华《squid中文权威指南》13.2.1 章节。
当然,本例中的蓝色文字是可以修改为其他的参数,例如你的域名 ,同样可以看到access.log里关于该域名的行。
4,squid -k rotate 轮换squid的日志文件/var/log/squid,Squid代理服务器日志文件
的增长速度是惊人的,很容易点球满磁盘空间导致系统不能正常工作,甚至是死机.为了解决日志文件增长太快的问题,squid采用了"轮换"的方法.在squid.conf中可以通过logfile_rotate来设置文件轮换的个数,如:
logfile_rotate 10 ,轮换的工作一般用crontab定时器完在周期性的日志轮换,例如每周六凌晨2:00进行日志轮换,则执行如下命令: crontab -e
0 2 * * 6 squid -k rotate
5,Squid默认的错误提示信息为英文,对于英文不好的用户来说,实在不方便.在/etc/squid/squid.conf里添加如下:
error_directory /usr/share/squid/errors/Simplify_Chinese
6.squidclient -p 80 mgr:info 查看命中率
[Squid 中 refresh_pattern 的作用]
用于确定一个页面进入cache后,它在cache中停留的时间。refresh_pattern 规则仅仅应用到没有明确过时期限的响应。原始服务器能使 用 Expires 头部,或者 Cache-Control:max-age 指令来指定过时期限 ,只要没有在设置 override-expire。
语法:
refresh_pattern [-i] regexp min percent max [options]
min 参数是分钟数量。它是过时响应的最低时间限制。如果某个响应驻留在 cache 里的时间没有超过这个最低限制,那么它不会过期。类似的,max 参数是存活响应的最高时间限制。如果某个响应驻留在 cache 里的时间高于这个最高限制,那么它必须被刷新。
在最低和最高时间限制之间的响应,会面对 squid 的最后修改系数 LM-factor 算法 LM-factor=(response age)/(resource age)。对这样的响应,squid 计算响应的年龄和最后修改系数,然后将它作为百分比值进行比较。响应年龄简单的就是从原始服务器产生,或最后一次验证响应后,经历的时间数量。源年龄在 Last-Modified 和 Date头 部之间是不同的。LM-factor 是响应年龄与源年龄的比率。这个基本不用详细了解,这是不是一个精确控制过期的参数,如果要精确控制过期,就不要使用这个。
Refresh_pattern 有14个参数
我讲讲常用的几个参数的意思
override-expire
该选项导致 squid 在检查 Expires 之前,先检查 min 值。这样,一个非零的 min 时间让 squid 返回一个未确认的 cache 命中,即使该响应准备过期。
override-lastmod
改选项导致 squid 在检查 LM-factor 百分比之前先检查min ,它生效在expire 之后
reload-into-ims
该选项让 squid 在确认请求里,以 no-cache 指令传送一个请求。换句话说,squid 在转发请求之前,对该请求增加一个 If-Modified- Since 头部。注意这点仅仅在目标有 Last-Modified 时间戳时才能工作。外面进来的请求保留 no-cache 指令,以便它到达原始服务器。
一般情况可以使用 reload-into-ims。它其实是强行控制对象的超时时间,这违反了http协议的精神,但是在带宽较窄的场合,可以提高明显系统相应时间。
举例:
refresh_pattern -i \.css$ 1440 50% 129600 reload-into-ims
refresh_pattern -i \.xml$ 1440 50% 129600 reload-into-ims
refresh_pattern -i \.html$ 1440 90% 129600 reload-into-ims-
refresh_pattern -i \.shtml$ 1440 90% 129600 reload-into-ims
refresh_pattern -i \.hml$ 1440 90% 129600 reload-into-ims
refresh_pattern -i \.jpg$ 1440 90% 129600 reload-into-ims
refresh_pattern -i \.png$ 1440 90% 129600 reload-into-ims
refresh_pattern -i \.gif$ 1440 90% 129600 ignore-reload
refresh_pattern -i \.bmp$ 1440 90% 129600 reload-into-ims
refresh_pattern -i \.js$ 1440 90% 129600 reload-into-ims
ignore-reload
该选项导致 squid 忽略请求里的任何 no-cache 指令。
所以。如果希望内容一进入 cache 就不删除,直到被主动 purge 掉为止,可以加上 ignore-reload 选项,这个我们常用在mp3,wma,wmv,gif之类。
Examples:
refresh_pattern -i \.mp3$ 1440 50% 2880 ignore-reload
refresh_pattern -i \.wmv$ 1440 50% 2880 ignore-reload
refresh_pattern -i \.rm$ 1440 50% 2880 ignore-reload
refresh_pattern -i \.swf$ 1440 50% 2880 ignore-reload
refresh_pattern -i \.mpeg$ 1440 50% 2880 ignore-reload
refresh_pattern -i \.wma$ 1440 50% 2880 ignore-reload
ignore-no-cache
该选项导致 Squid 强制忽略从源站而来的“Pragma: no-cache”和“Cache-control: no-cache”
ignore-private
该选项导致 Squid 强制忽略从源站而来的“Cache-control: private”
ignore-auth:强制将一个请求认为是源站发送的带有“Cache-control: public”
ignore-auth
该选项导致 Squid 强制将一个请求认为是源站发送的带有“Cache-control: public”
Refresh_pattern percent 的计算
resource age =对象进入cache的时间-对象的last_modified
response age =当前时间-对象进入cache的时间
LM-factor=(response age)/(resource age)
举个例子,这里只考虑percent, 不考虑min 和max
例如:refresh_pattern 20%
假设源服务器上 —–lastmodified 是 2007-04-10 02:00:00
squid上 proxy.aaa.com/index.htm index.htm进入cache的时间 2007-04-10 03:00:00
1)如果当前时间 2007-04-10 03:00:00
resource age =3点-2点=60分钟
response age =0分钟
index.htm还可以在cache停留的时间(resource age)*20%=12分钟
也就是说,index.htm进入cache后,可以停留12分钟,才被重新确认。
2)如果当前时间 2007-04-10 03:05:00
resource age =3点-2点=60分钟
response age =5分钟
index.htm还可以在cache停留的时间(resource age)*20%=12分钟-5=7
LM-factor=5/60=8.3%<20%
一直到2007-04-10 03:12:00 LM-factor=12/60=20% 之后,cache中的页面index.htm终于stale。
如果这时没有 index.htm 的请求,index.htm 会一直在缓存中,如果有 index.htm 请求,squid 收到该请求后,由于已经过期, squid 会向源服务器发一个 index.htm 是否有改变的请求,源服务器收到后,如果 index.htm 没有更新,squid 就不用更新缓存,直接把 缓存的内容放回给客户端,同时,重置对象进入 cache 的时间为与源服务器确认的时间,比如 2007-04-10 03:13:00,如果正好在这个后重新确认了页面。重置后,resource age 变长,相应在 cache 中存活的时间也变长。
如果有改变则把最新的 index.htm 返回给 squid,squid 收到会更新缓存,然后把新的 index.htm 返回给客户端,同时根据新页面 中的Last_Modified 和取页面的时间,重新计算 resource age,进一步计算出存活时间。
实际上,一个页面进入 cache 后,他的存活时间就确定了,即 (resource age) * 百分比,一直到被重新确认。