Squid配置详解

安装

从源中安装

源中自带稳定版本,执行下面的命令进行安装

是大家也许不知道,Squid有一个for Windows的版本,下载地址为: http://www.acmeconsulting.it/pagine/opensource/squid/SquidNT.htm

sudo apt-get install squid squid-common

源码编译安装

当然你也可以到下面的官方网站下载最新的版本进行编译安装:

http://www.squid-cache.org/

其中STABLE稳定版、DEVEL版通常是提供给开发人员测试程序的,假定下载了最新 的稳定版squid-2.5.STABLE2.tar.gz,用以下命令解开压缩包:

tar xvfz squid-2.5.STABLE.tar.gz

用bz2方式压缩的包可能体积更小,相应的命令是:

tar xvfj squid-2.5.STABLE.tar.bz2 

然后,进入相应目录对源代码进行配置和编译,命令如下:

cd squid-2.5.STABLE2

配置命令configure有很多选项,如果不清楚可先用“-help”查看。通常情况下,用到的选项有以下几个:

--prefix=/web/squid

指定Squid的安装位置,如果只指定这一选项,那么该目录下会有bin、sbin、man、conf等目录,而主要的配置文件此时在conf子目录中。为便于管理,最好用参数--sysconfdir=/etc把这个文件位置配置为/etc。

--enable-storeio=ufs,null

使用的文件系统通常是默认的ufs,不过如果想要做一个不缓存任何文件的代理服 务器,就需要加上null文件系统。

--enable-arp-acl

这样可以在规则设置中直接通过客户端的MAC地址进行管理,防止客户使用IP欺骗。

--enable-err-languages="Simplify_Chinese"
--enable-default-err-languages="Simplify_Chinese"

上面两个选项告诉Squid编入并使用简体中文错误信息。

--enable-linux-netfilter

允许使用Linux的透明代理功能。

--enable-underscore

允许解析的URL中出现下划线,因为默认情况下Squid会认为带下划线的URL是 非法的,并拒绝访问该地址。 整个配置编译过程如下:

./configure --prefix=/var/squid 
--sysconfdir=/etc 
--enable-arp-acl 
--enable-linux-netfilter 
--enable-pthreads 
--enable-err-language="Simplify_Chinese" 
--enable-storeio=ufs,null 
--enable-default-err-language="Simplify_Chinese" 
--enable-auth="basic" 
--enable-baisc-auth-helpers="NCSA" 
--enable-underscore 

其中一些选项有特殊作用,将在下面介绍它们。 最后执行下面两条命令,将源代码编译为可执行文件,并拷贝到指定位置。

make
sudo make install

基本配置

安装完成后,接下来要对Squid的运行进行配置(不是前面安装时的配置)。所有项目都在squid.conf中完成。Squid自带的squid.conf包括非常详尽的说明,相当于一篇用户手册,对配置有任何疑问都可以参照解决。

在这个例子中,代理服务器同时也是网关,内部网络接口eth0的IP地址为192.168.0.1,外部网络接eth1的IP地址为202.103.x.x。下面是一个基本的代理所需要配置选项:

http_port 192.168.0.1:3128

默认端口是3128,当然也可以是任何其它端口,只要不与其它服务发生冲突即可。为了安全起见,在前面加上IP地址,Squid就不会监听外部的网络接口。 下面的配置选项是服务器管理者的电子邮件,当错误发生时,该地址会显示在错误页面上,便于用户联系:

cache_mgr start@soocol.com

以下这些参数告诉Squid缓存的文件系统、位置和缓存策略:

cache_dir ufs /var/squid 
cache_mem 32MB 
cache_swap_low 90 
cache_swap_high 95 

在这里,Squid会将/var/squid目录作为保存缓存数据的目录,每次处理的缓存大小是32兆字节,当缓存空间使用达到95%时,新的内容将 取代旧的而不直接添加到目录中,直到空间又下降到90%才停止这一活动。

如果不想Squid缓存任何文件,如某些存储空间有限的专有系统,可以使用 null文件系统(这样不需要那些缓存策略):

cache_dir null /tmp

下面的几个关于缓存的策略配置中,较主要的是第一行,即用户的访问记录,可以通过分析它来了解所有用户访问的详尽地址:

cache_access_log /var/squid/access.log 
cache_log /var/squid/cache.log 
cache_store_log /var/squid/store.log 

下面这行配置是在较新版本中出现的参数,告诉Squid在错误页面中显示的服务器名称:

visible_hostname No1.proxy

以下配置告诉Squid如何处理用户,对每个请求的IP地址作为单独地址处理:

client_netmask 255.255.255.255

如果是普通代理服务器,以上的配置已经足够。但是很多Squid都被用来做透明代理。

所谓透明代理,就是客户端不知道有代理服务器的存在,当然也不需要进行任何与代理有关的设置,从而大大方便了系统管理员。相关的选项有以下几个:

httpd_accel_host virtual 
httpd_accel_port 80 
httpd_accel_with_proxy on 
httpd_accel_user_host_header on 

在Linux上,可以用iptables/ipchains直接将对Web端口80的请求直接转发到Squid端口3128,由Squid接手,而用户浏览器仍然认为它访问的是对方的80端口。例如以下这条命令:

iptables -t nat -A PREROUTING -s 192.168.0.200/32 -p tcp --dport 80 -j REDIRECT 3128 

就是将192.168.0.200的所有针对80端口的访问重定向到3128端口。

所有设置完成后,关键且重要的任务是访问控制。Squid支持的管理方式很多,使用起来也非常简单(这也是有人宁愿使用不做任何缓存的Squid,也 不愿意单独使用iptables的原因)。

Squid可以通过IP地址、主机名、MAC地址、用户/密码认证等识别用户,也可以通过域名、域后缀、文件类 型、IP地址、端口、URL匹配等控制用户的访问,还可以使用时间区间对用户进行管理,所以访问控制是Squid配置中的重点。

Squid用ACL (Access Control List,访问控制列表)对访问类型进行划分,用http_access deny 或allow进行控制。根据需求首先定义两组用户advance和normal,还有代表所有未指明的用户组all及不允许上网的baduser,配置代 码如下:

acl advance 192.168.0.2-192.168.0.10/32 
acl normal src 192.168.0.11-192.168.0.200/32 
acl baduser src 192.168.0.100/32 
acl baddst dst www.soocol.com 
acl all src 0.0.0.0/0 

http_access deny baduser 
http_access allow advance 
http_access allow normal 

可以看出,ACL的基本格式如下: acl 列表名称 控制方式 控制目标 比如acl all src 0.0.0.0/0,其名称是all,控制方式是src源IP地址,控制目标是0.0.0.0/0的IP地址,即所有未定义的用户。出于安全考虑,总是在最后禁止这个列表。 下面这个列表代表高级用户,包括IP地址从192.168.0.2到192.168.0.10的所有计算机:

acl advance 192.168.0.2-192.168.0.20/32

下面这个baduser列表只包含一台计算机,其IP地址是192.168.0.100:

acl baduser 192.168.0.100/32 

ACL写完后,接下来要对它们分别进行管理,代码如下:

http_access deny baduser 
http_access allow advance 
http_access allow normal 

上面几行代码告诉Squid不允许baduser组访问Internet,但advance、normal组允许(此时还没有指定详细的权限)。由于 Squid是按照顺序读取规则,会首先禁止baduser,然后允许normal。如果将两条规则顺序颠倒,由于baduser在normal范围中, Squid先允许了所有的normal,那么再禁止baduser就不会起作用。

特别要注意的是,Squid将使用allow-deny-allow-deny……这样的顺序套用规则。例如,当一个用户访问代理服务器时, Squid会顺序测试Squid中定义的所有规则列表,当所有规则都不匹配时,Squid会使用与最后一条相反的规则。

就像上面这个例子,假设有一个用户 的IP地址是192.168.0.201,他试图通过这台代理服务器访问Internet,会发生什么情况呢?我们会发现,他能够正常访问,因为 Squid找遍所有访问列表也没有和192.168.0.201有关的定义,便开始应用规则,而最后一条是deny,那么Squid默认的下一条处理规则 是allow,所以192.168.0.201反而能够访问Internet了,这显然不是我们希望的。所以在所有squid.conf中,最后一条规则 永远是http_access deny all,而all就是前面定义的“src 0.0.0.0”。

高级控制

前面说过,Squid的控制功能非常强大,只要理解Squid的行为方式,基本上就能够满足所有的控制要求。下面就一步一步来了解Squid是如何进行控制管理的。

通过IP地址来识别用户很不可靠,比IP地址更好的是网卡的MAC物理地址。要在Squid中使用MAC地址识别,必须在编译时加上“--enable-arp-acl”选项,然后可以通过以下的语句来识别用户:

acl advance arp 00:01:02:1f:2c:3e 00:01:02:3c:1a:8b ...

它直接使用用户的MAC地址,而MAC地址一般是不易修改的,即使有普通用户将自己的IP地址改为高级用户也无法通过,所以这种方式比IP地址可靠得多。

假如不想让用户访问某个网站应该怎么做呢?可以分为两种情况:一种是不允许访问某个站点的某个主机,比如ok的主机是ok.sina.com.cn,而其它的新浪资源却是允许访问的,那么ACL可以这样写:

acl sinapage dstdomain ok.sina.com.cn 
... ... 
http_access deny ok 
... ...

由此可以看到,除了ok,其它如http://www.sina.com.cn、news.sina.c...��常访问。

另一种情况是整个网站都不许访问,那么只需要写出这个网站共有的域名即可,配置如下:

acl qq dstdomain .tcccent.com.cn

注意tcccent前面的“.”,正是它指出以此域名结尾的所有主机都不可访问,否则就只有tcccent.com.cn这一台主机不能访问。

如果想禁止对某个IP地址的访问,如202.118.2.182,可以用dst来控制,代码如下:

acl badaddr dst 202.118.2.182

当然,这个dst也可以是域名,由Squid查询DNS服务器将其转换为IP。

还有一种比较广泛的控制是文件类型。如果不希望普通用户通过代理服务器下载MP3、AVI等文件,完全可以对他们进行限制,代码如下:

acl mmxfile urlpath_regex \.mp3$ \.avi$ \.exe$ 
http_access deny mmxfile 

看到regex,很多读者应该心领神会,因为这条语句使用了标准的规则表达式(又叫正则表达式)。它将匹配所有以.mp3、.avi等结尾的URL请求,还可以用-i参数忽略大小写,例如以下代码:

acl mmxfile urlpath_regex -i \.mp3$

这样,无论是.mp3还是.MP3都会被拒绝。当然,-i参数适用于任何可能需要区分大小写的地方,如前面的域名控制。

如果想让普通用户只在上班时间可以上网,而且是每周的工作日,用Squid应当如何处理呢?看看下面的ACL定义:

acl worktime time MTWHF 8:30-12:00 14:00-18:00 
http_access deny !worktime 

首先定义允许上网的时间是每周工作日(星期一至星期五)的上午和下午的固定时段,然后用http_access 定义所有不在这个时间段内的请求都是不允许的。

或者为了保证高级用户的带宽,希望每个用户的并发连接不能太多,以免影响他人,也可以通过Squid控制,代码如下:

acl conncount maxconn 3 
http_access deny conncount normal 
http_access allow normal

这样,普通用户在某个固定时刻只能同时发起三个连接,从第四个开始,连接将被拒绝。

总之,Squid的ACL配置非常灵活、强大,更多的控制方式可以参考squid.conf.default。

认证

用户/密码认证为Squid管理提供了更多便利,最常用的认证方式是NCSA。从Squid 2.5版本开始,NCSA认证包含在了basic中,而非以前单独的认证模块。下面来看看实现认证的具体操作。

首先在编译时配置选项应包括以下配置:

--enable-auth="basic" --enable-basic-auth-helpers="NCSA" 

“make install”以后,需要将“helpers/basic_auth/NCSA/ncsa_auth”拷贝到用户可执行目录中,如/usr/bin(如 果在该目录中找不到这个执行文件,在编译时请使用make all而不是make,或者直接在该目录中执行make),然后需要借助Apache的密码管理程序htpasswd来生成用户名/密码对应的文件,就像 下面这行代码:

htpasswd -c /var/squid/etc/password guest

在输入两遍guest用户的密码后,一个guest用户就生成了。如果以后需要添加用户,把上面的命令去掉-c参数再运行即可。

Squid 2.5在认证处理上有了较大的改变,这里就只讨论2.5版本的处理方法,2.4及以下版本请参考squid.conf.default。在2.5版的squid.conf中,包括以下几个相关选项:

该选项指出了认证方式(basic)、需要的程序(ncsa_auth)和对应的密码文件(password)

auth_param basic program /usr/bin/ncsa_auth /var/squid/etc/password 

指定认证程序的进程数

auth_param basic children 5

浏览器显示输入用户/密码对话框时的领域内容

auth_param basic realm My Proxy Caching Domain

基本的认证有效时间

auth_param basic credentialsttl 2 hours

普通用户需要通过认证才能访问Internet

acl normal proxy_auth REQUIRED 
http_access allow normal

通过以上的配置即可完成认证工作。有的读者可能要问:认证只针对普通用户,而高级用户是直接上网的,该怎么处理呢?其实,这两种用户是可以共存的。

如 前所述,Squid是顺序处理http_access的,所以在http_access处理过程中,如果先处理normal用户,那么当前用户无论是否属 于高级用户,都会被要求进行认证;相反如果先处理高级用户,剩下的就只有需要认证的普通用户了。例如以下配置代码:

... 
http_access allow normal (需要认证) 
http_access allow advance (不需要认证) 
...

不管是否为noauth用户,都要求进行用户名/密码验证。正确的方法是将二者位置交换,代码如下:

... 
http_access allow advance 
http_access allow normal 
...

这时,高级用户不会受到任何影响。

总结

下面把整个squid.conf总结一下:

服务器配置

http_port 192.168.0.1:3128 
cache_mgr start@soocol.com 
cache_dir null /tmp 
cache_access_log /var/squid/access.log 
cache_log /var/squid/cache.log 
cache_store_log /var/squid/store.log 
visible_hostname No1.proxy 
client_mask 255.255.255.255 
httpd_accel_host virtual 
httpd_accel_port 80 
httpd_accel_with_proxy on 
httpd_accel_user_host_header on

用户分类

acl advance arp 00:01:02:1f:2c:3e 00:01:02:3c:1a:8b ... 
acl normal proxy_auth REQUIED 
acl all src 0.0.0.0

行为分类

acl mmxfile urlpath_regex \.mp3$ \.avi$ \.exe$ 
acl conncount maxconn 3 
acl worktime time MTWHF 8:30-12:00 14:00-18:00 
acl sinapage dstdomain ok.sina.com.cn 
acl qq dstdomain .tcccent.com.cn

处理

http_access allow advance 
http_access deny conncount normal 
http_access deny !worktime 
http_access deny mmxfile 
http_access deny sinapage 
http_access deny qq 
http_access allow normal

配置后的状况是,advance组可以不受任何限制地访问Internet,而normal组则只能在工作时间上网,而且不能下载多媒体文件,不能访问某些特定的站点,而且发送请求不能超过3个。

通过本文的介绍,它可以了解Squid的基本能力。当然,它的能力远不止此,可以建立强大的代理服务器阵列,可以帮助本地的Web服务器提高性能,可以提高本地网络的安全性等。要想发挥它的功效,还需要进一步控制。

----------------------------------------------------------------------------------------

其实主要就是refresh_pattern的一些理解和建议.

概念LM,LM就是页面Header里时间(Date)和Last-Modified时间的差。Date一般是Squid从后面取页面的时间,Last-Modified 一般是页面生成时间。
refresh_pattern 的语法是
refresh_pattern [-i] regexp min percent max [options]

min, max的单位是分钟,percent就是百分比。
refresh_pattern 的算法如下:(当前时间定义为CURRENT_DATE)
1) If ((CURRENT_DATE-DATE(就是LM里定义的时间)) < min),cache是新鲜的
2) else if ((CURRENT_DATE-DATE) < (min + (max-min)*percent),cache是新鲜的
3) else cache是过期的
cache过期就需要从后面server取新鲜内容。

常用的几个参数的意思

override-expire
该选项导致squid在检查Expires头部之前,先检查min值。这样,一个非零的min时间让squid返回一个未确认的cache命中,即使该响应准备过期。

override-lastmod
改选项导致squid在检查LM-factor百分比之前先检查min值。

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
resource age =对象进入cache的时间-对象的last_modified
response age =当前时间-对象进入cache的时间
LM-factor=(response age)/(resource age)

--------------------------------------------------------------------------------------

经过这两天测试,提出下面的改进:[asp.net]

<%
Response.Cache.SetNoServerCaching();
Response.Cache.SetCacheability(HttpCacheability.Public);
Response.Cache.SetAllowResponseInBrowserHistory(true);
Response.Cache.SetExpires( DateTime.Now.AddMinutes(10) );
Response.Cache.SetMaxAge( new TimeSpan(0,10,0) );
Response.Cache.SetLastModified( DateTime.Now.AddMinutes(-5) );
Response.Cache.SetValidUntilExpires(true);
%>

第一句是清理掉当前 IIS 端的 Cache ,其实际作用是防止由于域名,参数带来的串页。

 

第二句是设置 cache 可以作用在 squid 上。
第三句是允许浏览器端可以缓存,其实第二句 public 就是已经包含这个,但是避免 squid 上有其他设置,还是把这句话加上。
第四句是设置页面的过期时间是 10 分钟以后。
第五句是设置页面的最大生存时间是 300 秒,就是 5 分钟。
第六句是设置页面的最后修改时间是 5 分钟以前。
第七句是设置页面的缓存一直不要失效,其实这句话没有用途。

<%
Response.Cache.SetNoServerCaching();
Response.Cache.SetCacheability(HttpCacheability.Public);
Response.Cache.SetAllowResponseInBrowserHistory(true);
Response.Cache.SetExpires( DateTime.Now.AddMinutes(10) );
Response.Cache.SetMaxAge( new TimeSpan(0,10,0) );
Response.Cache.SetLastModified( DateTime.Now.AddMinutes(-5) );
Response.Cache.SetValidUntilExpires(true);
%>

第一句是清理掉当前 IIS 端的 Cache ,其实际作用是防止由于域名,参数带来的串页。

 

第二句是设置 cache 可以作用在 squid 上。
第三句是允许浏览器端可以缓存,其实第二句 public 就是已经包含这个,但是避免 squid 上有其他设置,还是把这句话加上。
第四句是设置页面的过期时间是 10 分钟以后。
第五句是设置页面的最大生存时间是 300 秒,就是 5 分钟。
第六句是设置页面的最后修改时间是 5 分钟以前。
第七句是设置页面的缓存一直不要失效,其实这句话没有用途。

<%
Response.Cache.SetNoServerCaching();
Response.Cache.SetCacheability(HttpCacheability.Public);
Response.Cache.SetAllowResponseInBrowserHistory(true);
Response.Cache.SetExpires( DateTime.Now.AddMinutes(10) );
Response.Cache.SetMaxAge( new TimeSpan(0,10,0) );
Response.Cache.SetLastModified( DateTime.Now.AddMinutes(-5) );
Response.Cache.SetValidUntilExpires(true);
%>

第一句是清理掉当前 IIS 端的 Cache ,其实际作用是防止由于域名,参数带来的串页。

 

第二句是设置 cache 可以作用在 squid 上。
第三句是允许浏览器端可以缓存,其实第二句 public 就是已经包含这个,但是避免 squid 上有其他设置,还是把这句话加上。
第四句是设置页面的过期时间是 10 分钟以后。
第五句是设置页面的最大生存时间是 300 秒,就是 5 分钟。
第六句是设置页面的最后修改时间是 5 分钟以前。
第七句是设置页面的缓存一直不要失效,其实这句话没有用途。

<%
Response.Cache.SetNoServerCaching();
Response.Cache.SetCacheability(HttpCacheability.Public);
Response.Cache.SetAllowResponseInBrowserHistory(true);
Response.Cache.SetExpires( DateTime.Now.AddMinutes(10) );
Response.Cache.SetMaxAge( new TimeSpan(0,10,0) );
Response.Cache.SetLastModified( DateTime.Now.AddMinutes(-5) );
Response.Cache.SetValidUntilExpires(true);
%>

第一句是清理掉当前 IIS 端的 Cache ,其实际作用是防止由于域名,参数带来的串页。

 

第二句是设置 cache 可以作用在 squid 上。
第三句是允许浏览器端可以缓存,其实第二句 public 就是已经包含这个,但是避免 squid 上有其他设置,还是把这句话加上。
第四句是设置页面的过期时间是 10 分钟以后。
第五句是设置页面的最大生存时间是 300 秒,就是 5 分钟。
第六句是设置页面的最后修改时间是 5 分钟以前。
第七句是设置页面的缓存一直不要失效,其实这句话没有用途。

<%
Response.Cache.SetNoServerCaching();
Response.Cache.SetCacheability(HttpCacheability.Public);
Response.Cache.SetAllowResponseInBrowserHistory(true);
Response.Cache.SetExpires( DateTime.Now.AddMinutes(10) );
Response.Cache.SetMaxAge( new TimeSpan(0,10,0) );
Response.Cache.SetLastModified( DateTime.Now.AddMinutes(-5) );
Response.Cache.SetValidUntilExpires(true);
%>

第一句是清理掉当前 IIS 端的 Cache ,其实际作用是防止由于域名,参数带来的串页。

 

第二句是设置 cache 可以作用在 squid 上。
第三句是允许浏览器端可以缓存,其实第二句 public 就是已经包含这个,但是避免 squid 上有其他设置,还是把这句话加上。
第四句是设置页面的过期时间是 10 分钟以后。
第五句是设置页面的最大生存时间是 300 秒,就是 5 分钟。
第六句是设置页面的最后修改时间是 5 分钟以前。
第七句是设置页面的缓存一直不要失效,其实这句话没有用途。

<%
Response.Cache.SetNoServerCaching();
Response.Cache.SetCacheability(HttpCacheability.Public);
Response.Cache.SetAllowResponseInBrowserHistory(true);
Response.Cache.SetExpires( DateTime.Now.AddMinutes(10) );
Response.Cache.SetMaxAge( new TimeSpan(0,10,0) );
Response.Cache.SetLastModified( DateTime.Now.AddMinutes(-5) );
Response.Cache.SetValidUntilExpires(true);
%>

第一句是清理掉当前 IIS 端的 Cache ,其实际作用是防止由于域名,参数带来的串页。

 

第二句是设置 cache 可以作用在 squid 上。
第三句是允许浏览器端可以缓存,其实第二句 public 就是已经包含这个,但是避免 squid 上有其他设置,还是把这句话加上。
第四句是设置页面的过期时间是 10 分钟以后。
第五句是设置页面的最大生存时间是 300 秒,就是 5 分钟。
第六句是设置页面的最后修改时间是 5 分钟以前。
第七句是设置页面的缓存一直不要失效,其实这句话没有用途。

<%
Response.Cache.SetNoServerCaching();
Response.Cache.SetCacheability(HttpCacheability.Public);
Response.Cache.SetAllowResponseInBrowserHistory(true);
Response.Cache.SetExpires( DateTime.Now.AddMinutes(10) );
Response.Cache.SetMaxAge( new TimeSpan(0,10,0) );
Response.Cache.SetLastModified( DateTime.Now.AddMinutes(-5) );
Response.Cache.SetValidUntilExpires(true);
%>

第一句是清理掉当前 IIS 端的 Cache ,其实际作用是防止由于域名,参数带来的串页。

 

第二句是设置 cache 可以作用在 squid 上。
第三句是允许浏览器端可以缓存,其实第二句 public 就是已经包含这个,但是避免 squid 上有其他设置,还是把这句话加上。
第四句是设置页面的过期时间是 10 分钟以后。
第五句是设置页面的最大生存时间是 300 秒,就是 5 分钟。
第六句是设置页面的最后修改时间是 5 分钟以前。
第七句是设置页面的缓存一直不要失效,其实这句话没有用途。

<%
Response.Cache.SetNoServerCaching();
Response.Cache.SetCacheability(HttpCacheability.Public);
Response.Cache.SetAllowResponseInBrowserHistory(true);
Response.Cache.SetExpires( DateTime.Now.AddMinutes(10) );
Response.Cache.SetMaxAge( new TimeSpan(0,10,0) );
Response.Cache.SetLastModified( DateTime.Now.AddMinutes(-5) );
Response.Cache.SetValidUntilExpires(true);
%>

第一句是清理掉当前 IIS 端的 Cache ,其实际作用是防止由于域名,参数带来的串页。

 

第二句是设置 cache 可以作用在 squid 上。
第三句是允许浏览器端可以缓存,其实第二句 public 就是已经包含这个,但是避免 squid 上有其他设置,还是把这句话加上。
第四句是设置页面的过期时间是 10 分钟以后。
第五句是设置页面的最大生存时间是 300 秒,就是 5 分钟。
第六句是设置页面的最后修改时间是 5 分钟以前。
第七句是设置页面的缓存一直不要失效,其实这句话没有用途。<%
Response.Cache.SetNoServerCaching();
Response.Cache.SetCacheability(HttpCacheability.Public);
Response.Cache.SetAllowResponseInBrowserHistory(true);
Response.Cache.SetExpires( DateTime.Now.AddMinutes(10) );
Response.Cache.SetMaxAge( new TimeSpan(0,10,0) );
Response.Cache.SetLastModified( DateTime.Now.AddMinutes(-5) );
Response.Cache.SetValidUntilExpires(true);
%>

第一句是清理掉当前 IIS 端的 Cache ,其实际作用是防止由于域名,参数带来的串页。

 

第二句是设置 cache 可以作用在 squid 上。
第三句是允许浏览器端可以缓存,其实第二句 public 就是已经包含这个,但是避免 squid 上有其他设置,还是把这句话加上。
第四句是设置页面的过期时间是 10 分钟以后。
第五句是设置页面的最大生存时间是 300 秒,就是 5 分钟。
第六句是设置页面的最后修改时间是 5 分钟以前。
第七句是设置页面的缓存一直不要失效,其实这句话没有用途。

-----------------------------------------------------------------------------------------

1. 首先强调一下视频文件的特点
视频文件的尺寸比起普通 HTTP 请求的文件要大得多
视频文件上传以后就不会被修改
视频文件被播放器下载时,存在大量多线程下载

2. 为了跟踪你的命中率和观察你的文件里的 TCP_MISS 的类型,请增加 squid cache manager 和 access.log 的输出。在配置文件中增加以下内容
acl managerip src [HOSTIP]
acl manager proto cache_object
http_access allow manager managerip

logformat analyse %&gt;a &quot;%rm %ru HTTP/%rv&quot; %Ss:%Sh/%Hs
access_log /usr/local/squid/var/logs/access.log analyse
分别增加了 manager 的访问和 access.log 的跟踪

3. 优化前,先关注你当前的 squid 运行情况
squidclient -h[SQUIDIP] -p[PORT] mgr:info
mgr 的其他选项,用 squidclient mgr: 查看
Request Hit Ratios 和 Byte Hit Ratios 这两项重要指标就是我们要追求的结果。他的指标高地直接说明了 squid 的起到的 cache 效果
Memory accounted for: 项中的 Total accounted 指标表示你所允许 squid 使用的 cache 内存有多少空间已经存储了 cache 文件
File descriptor usage for squid: 项里面的指标指明了你的文件描述符数量是否 cache 瓶颈,如果你的 FD 不足请你重新设置并安装 squid
tail -10000 access.log | awk '{printf $5;}' | sort -rn | uniq -c | sort -rn
用此命令跟踪访问客户端命中率,下面列出日志的名种字段的含义
http://www.maycode.com/index.php/forum.html?func=view&amp;id=809&amp;catid=10

通过日志来观察哪类文件的命中率低,追查根源。
以上两项无论是否视频命中率的优化都要熟练使用

4. 介绍过分析方法后,说下关键的设置参数
maximum_object_size 最大磁盘缓存文件尺寸
maximum_object_size_in_memory 最大内存缓存文件尺寸
默认都是 8K ,如果不改变这两个值,出现的问题不用我多说了
range_offset_limit -1
Sets a upper limit on how far into the the file a Range request
may be to cause Squid to prefetch the whole file. If beyond this
limit Squid forwards the Range request as it is and the result
is NOT cached.
This is to stop a far ahead range request (lets say start at 17M
from making Squid fetch the whole object up to that point before
sending anything to the client.
A value of -1 causes Squid to always fetch the object from the
beginning so it may cache the result. (2.0 style)
A value of 0 causes Squid to never fetch more than the
client requested. (default)
上面是官方的解释,含义就是这个值限制多大的 range request 会触发缓存整个文件,如果这个值过大,会导致小的 range 请求,无法被缓存,会导致大量的不命中。对于视频设置为 -1 就可以了。
quick_abort_min -1 KB
The cache by default continues downloading aborted requests
which are almost completed (less than 16 KB remaining). This
may be undesirable on slow (e.g. SLIP) links and/or very busy
caches. Impatient users may tie up file descriptors and
bandwidth by repeatedly requesting and immediately aborting
downloads.
含义就是在用户突然中断请求时,还差多少大小的时候,继续完成全文件的缓存工作。此值对于性能的影响不是非常明显。
refresh_pattern -i \.flv$ 1440 50% 2880 ignore-reload
这个参数的各项含义不详细解释了, ignore-reload 很重要,很多浏览器发来的请求都带着 no-cache 头,所以造成了大量的不命中,这些 no- cache 毫无疑义,视频文件被修改的几率非常小,如果你的播放器请求又都带着 no-cache 头。因此增加 ignore-reload 对于性能提升有非常大的作用
cache_dir aufs /cache/squid 102400 16 256
另外我启用了 aufs 作为缓存存储,启用了异步 IO ,我认为对于优化 IO 有些效果。

5. 最后强调一下,如果你要给视频文件做 squid 请准备好足够的物理内存,并且让 squid 充分的 cache 视频于内存,会对你的服务相应有巨大帮助的。

 

-----------------------------------------------------------------------------------------

1. 首先强调一下视频文件的特点
视频文件的尺寸比起普通 HTTP 请求的文件要大得多
视频文件上传以后就不会被修改
视频文件被播放器下载时,存在大量多线程下载

2. 为了跟踪你的命中率和观察你的文件里的 TCP_MISS 的类型,请增加 squid cache manager 和 access.log 的输出。在配置文件中增加以下内容
acl managerip src [HOSTIP]
acl manager proto cache_object
http_access allow manager managerip

logformat analyse %&gt;a &quot;%rm %ru HTTP/%rv&quot; %Ss:%Sh/%Hs
access_log /usr/local/squid/var/logs/access.log analyse
分别增加了 manager 的访问和 access.log 的跟踪

3. 优化前,先关注你当前的 squid 运行情况
squidclient -h[SQUIDIP] -p[PORT] mgr:info
mgr 的其他选项,用 squidclient mgr: 查看
Request Hit Ratios 和 Byte Hit Ratios 这两项重要指标就是我们要追求的结果。他的指标高地直接说明了 squid 的起到的 cache 效果
Memory accounted for: 项中的 Total accounted 指标表示你所允许 squid 使用的 cache 内存有多少空间已经存储了 cache 文件
File descriptor usage for squid: 项里面的指标指明了你的文件描述符数量是否 cache 瓶颈,如果你的 FD 不足请你重新设置并安装 squid
tail -10000 access.log | awk '{printf $5;}' | sort -rn | uniq -c | sort -rn
用此命令跟踪访问客户端命中率,下面列出日志的名种字段的含义
http://www.maycode.com/index.php/forum.html?func=view&amp;id=809&amp;catid=10

通过日志来观察哪类文件的命中率低,追查根源。
以上两项无论是否视频命中率的优化都要熟练使用

4. 介绍过分析方法后,说下关键的设置参数
maximum_object_size 最大磁盘缓存文件尺寸
maximum_object_size_in_memory 最大内存缓存文件尺寸
默认都是 8K ,如果不改变这两个值,出现的问题不用我多说了
range_offset_limit -1
Sets a upper limit on how far into the the file a Range request
may be to cause Squid to prefetch the whole file. If beyond this
limit Squid forwards the Range request as it is and the result
is NOT cached.
This is to stop a far ahead range request (lets say start at 17M

from making Squid fetch the whole object up to that point before
sending anything to the client.
A value of -1 causes Squid to always fetch the object from the
beginning so it may cache the result. (2.0 style)
A value of 0 causes Squid to never fetch more than the
client requested. (default)
上面是官方的解释,含义就是这个值限制多大的 range request 会触发缓存整个文件,如果这个值过大,会导致小的 range 请求,无法被缓存,会导致大量的不命中。对于视频设置为 -1 就可以了。
quick_abort_min -1 KB
The cache by default continues downloading aborted requests
which are almost completed (less than 16 KB remaining). This
may be undesirable on slow (e.g. SLIP) links and/or very busy
caches. Impatient users may tie up file descriptors and
bandwidth by repeatedly requesting and immediately aborting
downloads.
含义就是在用户突然中断请求时,还差多少大小的时候,继续完成全文件的缓存工作。此值对于性能的影响不是非常明显。
refresh_pattern -i \.flv$ 1440 50% 2880 ignore-reload
这个参数的各项含义不详细解释了, ignore-reload 很重要,很多浏览器发来的请求都带着 no-cache 头,所以造成了大量的不命中,这些 no- cache 毫无疑义,视频文件被修改的几率非常小,如果你的播放器请求又都带着 no-cache 头。因此增加 ignore-reload 对于性能提升有非常大的作用
cache_dir aufs /cache/squid 102400 16 256
另外我启用了 aufs 作为缓存存储,启用了异步 IO ,我认为对于优化 IO 有些效果。

5. 最后强调一下,如果你要给视频文件做 squid 请准备好足够的物理内存,并且让 squid 充分的 cache 视频于内存,会对你的服务相应有巨大帮助的。

 

-----------------------------------------------------------------------------------------

1. 首先强调一下视频文件的特点
视频文件的尺寸比起普通 HTTP 请求的文件要大得多
视频文件上传以后就不会被修改
视频文件被播放器下载时,存在大量多线程下载

2. 为了跟踪你的命中率和观察你的文件里的 TCP_MISS 的类型,请增加 squid cache manager 和 access.log 的输出。在配置文件中增加以下内容
acl managerip src [HOSTIP]
acl manager proto cache_object
http_access allow manager managerip

logformat analyse %&gt;a &quot;%rm %ru HTTP/%rv&quot; %Ss:%Sh/%Hs
access_log /usr/local/squid/var/logs/access.log analyse
分别增加了 manager 的访问和 access.log 的跟踪

3. 优化前,先关注你当前的 squid 运行情况
squidclient -h[SQUIDIP] -p[PORT] mgr:info
mgr 的其他选项,用 squidclient mgr: 查看
Request Hit Ratios 和 Byte Hit Ratios 这两项重要指标就是我们要追求的结果。他的指标高地直接说明了 squid 的起到的 cache 效果
Memory accounted for: 项中的 Total accounted 指标表示你所允许 squid 使用的 cache 内存有多少空间已经存储了 cache 文件
File descriptor usage for squid: 项里面的指标指明了你的文件描述符数量是否 cache 瓶颈,如果你的 FD 不足请你重新设置并安装 squid
tail -10000 access.log | awk '{printf $5;}' | sort -rn | uniq -c | sort -rn
用此命令跟踪访问客户端命中率,下面列出日志的名种字段的含义
http://www.maycode.com/index.php/forum.html?func=view&amp;id=809&amp;catid=10

通过日志来观察哪类文件的命中率低,追查根源。
以上两项无论是否视频命中率的优化都要熟练使用

4. 介绍过分析方法后,说下关键的设置参数
maximum_object_size 最大磁盘缓存文件尺寸
maximum_object_size_in_memory 最大内存缓存文件尺寸
默认都是 8K ,如果不改变这两个值,出现的问题不用我多说了
range_offset_limit -1
Sets a upper limit on how far into the the file a Range request
may be to cause Squid to prefetch the whole file. If beyond this
limit Squid forwards the Range request as it is and the result
is NOT cached.
This is to stop a far ahead range request (lets say start at 17M

from making Squid fetch the whole object up to that point before
sending anything to the client.
A value of -1 causes Squid to always fetch the object from the
beginning so it may cache the result. (2.0 style)
A value of 0 causes Squid to never fetch more than the
client requested. (default)
上面是官方的解释,含义就是这个值限制多大的 range request 会触发缓存整个文件,如果这个值过大,会导致小的 range 请求,无法被缓存,会导致大量的不命中。对于视频设置为 -1 就可以了。
quick_abort_min -1 KB
The cache by default continues downloading aborted requests
which are almost completed (less than 16 KB remaining). This
may be undesirable on slow (e.g. SLIP) links and/or very busy
caches. Impatient users may tie up file descriptors and
bandwidth by repeatedly requesting and immediately aborting
downloads.
含义就是在用户突然中断请求时,还差多少大小的时候,继续完成全文件的缓存工作。此值对于性能的影响不是非常明显。
refresh_pattern -i \.flv$ 1440 50% 2880 ignore-reload
这个参数的各项含义不详细解释了, ignore-reload 很重要,很多浏览器发来的请求都带着 no-cache 头,所以造成了大量的不命中,这些 no- cache 毫无疑义,视频文件被修改的几率非常小,如果你的播放器请求又都带着 no-cache 头。因此增加 ignore-reload 对于性能提升有非常大的作用
cache_dir aufs /cache/squid 102400 16 256
另外我启用了 aufs 作为缓存存储,启用了异步 IO ,我认为对于优化 IO 有些效果。

5. 最后强调一下,如果你要给视频文件做 squid 请准备好足够的物理内存,并且让 squid 充分的 cache 视频于内存,会对你的服务相应有巨大帮助的。

 

-----------------------------------------------------------------------------------------

1. 首先强调一下视频文件的特点
视频文件的尺寸比起普通 HTTP 请求的文件要大得多
视频文件上传以后就不会被修改
视频文件被播放器下载时,存在大量多线程下载

2. 为了跟踪你的命中率和观察你的文件里的 TCP_MISS 的类型,请增加 squid cache manager 和 access.log 的输出。在配置文件中增加以下内容
acl managerip src [HOSTIP]
acl manager proto cache_object
http_access allow manager managerip

logformat analyse %&gt;a &quot;%rm %ru HTTP/%rv&quot; %Ss:%Sh/%Hs
access_log /usr/local/squid/var/logs/access.log analyse
分别增加了 manager 的访问和 access.log 的跟踪

3. 优化前,先关注你当前的 squid 运行情况
squidclient -h[SQUIDIP] -p[PORT] mgr:info
mgr 的其他选项,用 squidclient mgr: 查看
Request Hit Ratios 和 Byte Hit Ratios 这两项重要指标就是我们要追求的结果。他的指标高地直接说明了 squid 的起到的 cache 效果
Memory accounted for: 项中的 Total accounted 指标表示你所允许 squid 使用的 cache 内存有多少空间已经存储了 cache 文件
File descriptor usage for squid: 项里面的指标指明了你的文件描述符数量是否 cache 瓶颈,如果你的 FD 不足请你重新设置并安装 squid
tail -10000 access.log | awk '{printf $5;}' | sort -rn | uniq -c | sort -rn
用此命令跟踪访问客户端命中率,下面列出日志的名种字段的含义
http://www.maycode.com/index.php/forum.html?func=view&amp;id=809&amp;catid=10

通过日志来观察哪类文件的命中率低,追查根源。
以上两项无论是否视频命中率的优化都要熟练使用

4. 介绍过分析方法后,说下关键的设置参数
maximum_object_size 最大磁盘缓存文件尺寸
maximum_object_size_in_memory 最大内存缓存文件尺寸
默认都是 8K ,如果不改变这两个值,出现的问题不用我多说了
range_offset_limit -1
Sets a upper limit on how far into the the file a Range request
may be to cause Squid to prefetch the whole file. If beyond this
limit Squid forwards the Range request as it is and the result
is NOT cached.
This is to stop a far ahead range request (lets say start at 17M

from making Squid fetch the whole object up to that point before
sending anything to the client.
A value of -1 causes Squid to always fetch the object from the
beginning so it may cache the result. (2.0 style)
A value of 0 causes Squid to never fetch more than the
client requested. (default)
上面是官方的解释,含义就是这个值限制多大的 range request 会触发缓存整个文件,如果这个值过大,会导致小的 range 请求,无法被缓存,会导致大量的不命中。对于视频设置为 -1 就可以了。
quick_abort_min -1 KB
The cache by default continues downloading aborted requests
which are almost completed (less than 16 KB remaining). This
may be undesirable on slow (e.g. SLIP) links and/or very busy
caches. Impatient users may tie up file descriptors and
bandwidth by repeatedly requesting and immediately aborting
downloads.
含义就是在用户突然中断请求时,还差多少大小的时候,继续完成全文件的缓存工作。此值对于性能的影响不是非常明显。
refresh_pattern -i \.flv$ 1440 50% 2880 ignore-reload
这个参数的各项含义不详细解释了, ignore-reload 很重要,很多浏览器发来的请求都带着 no-cache 头,所以造成了大量的不命中,这些 no- cache 毫无疑义,视频文件被修改的几率非常小,如果你的播放器请求又都带着 no-cache 头。因此增加 ignore-reload 对于性能提升有非常大的作用
cache_dir aufs /cache/squid 102400 16 256
另外我启用了 aufs 作为缓存存储,启用了异步 IO ,我认为对于优化 IO 有些效果。

5. 最后强调一下,如果你要给视频文件做 squid 请准备好足够的物理内存,并且让 squid 充分的 cache 视频于内存,会对你的服务相应有巨大帮助的。

 

-----------------------------------------------------------------------------------------

1. 首先强调一下视频文件的特点
视频文件的尺寸比起普通 HTTP 请求的文件要大得多
视频文件上传以后就不会被修改
视频文件被播放器下载时,存在大量多线程下载

2. 为了跟踪你的命中率和观察你的文件里的 TCP_MISS 的类型,请增加 squid cache manager 和 access.log 的输出。在配置文件中增加以下内容
acl managerip src [HOSTIP]
acl manager proto cache_object
http_access allow manager managerip

logformat analyse %&gt;a &quot;%rm %ru HTTP/%rv&quot; %Ss:%Sh/%Hs
access_log /usr/local/squid/var/logs/access.log analyse
分别增加了 manager 的访问和 access.log 的跟踪

3. 优化前,先关注你当前的 squid 运行情况
squidclient -h[SQUIDIP] -p[PORT] mgr:info
mgr 的其他选项,用 squidclient mgr: 查看
Request Hit Ratios 和 Byte Hit Ratios 这两项重要指标就是我们要追求的结果。他的指标高地直接说明了 squid 的起到的 cache 效果
Memory accounted for: 项中的 Total accounted 指标表示你所允许 squid 使用的 cache 内存有多少空间已经存储了 cache 文件
File descriptor usage for squid: 项里面的指标指明了你的文件描述符数量是否 cache 瓶颈,如果你的 FD 不足请你重新设置并安装 squid
tail -10000 access.log | awk '{printf $5;}' | sort -rn | uniq -c | sort -rn
用此命令跟踪访问客户端命中率,下面列出日志的名种字段的含义
http://www.maycode.com/index.php/forum.html?func=view&amp;id=809&amp;catid=10

通过日志来观察哪类文件的命中率低,追查根源。
以上两项无论是否视频命中率的优化都要熟练使用

4. 介绍过分析方法后,说下关键的设置参数
maximum_object_size 最大磁盘缓存文件尺寸
maximum_object_size_in_memory 最大内存缓存文件尺寸
默认都是 8K ,如果不改变这两个值,出现的问题不用我多说了
range_offset_limit -1
Sets a upper limit on how far into the the file a Range request
may be to cause Squid to prefetch the whole file. If beyond this
limit Squid forwards the Range request as it is and the result
is NOT cached.
This is to stop a far ahead range request (lets say start at 17M
from making Squid fetch the whole object up to that point before
sending anything to the client.
A value of -1 causes Squid to always fetch the object from the
beginning so it may cache the result. (2.0 style)
A value of 0 causes Squid to never fetch more than the
client requested. (default)
上面是官方的解释,含义就是这个值限制多大的 range request 会触发缓存整个文件,如果这个值过大,会导致小的 range 请求,无法被缓存,会导致大量的不命中。对于视频设置为 -1 就可以了。
quick_abort_min -1 KB
The cache by default continues downloading aborted requests
which are almost completed (less than 16 KB remaining). This
may be undesirable on slow (e.g. SLIP) links and/or very busy
caches. Impatient users may tie up file descriptors and
bandwidth by repeatedly requesting and immediately aborting
downloads.
含义就是在用户突然中断请求时,还差多少大小的时候,继续完成全文件的缓存工作。此值对于性能的影响不是非常明显。
refresh_pattern -i \.flv$ 1440 50% 2880 ignore-reload
这个参数的各项含义不详细解释了, ignore-reload 很重要,很多浏览器发来的请求都带着 no-cache 头,所以造成了大量的不命中,这些 no- cache 毫无疑义,视频文件被修改的几率非常小,如果你的播放器请求又都带着 no-cache 头。因此增加 ignore-reload 对于性能提升有非常大的作用
cache_dir aufs /cache/squid 102400 16 256
另外我启用了 aufs 作为缓存存储,启用了异步 IO ,我认为对于优化 IO 有些效果。

5. 最后强调一下,如果你要给视频文件做 squid 请准备好足够的物理内存,并且让 squid 充分的 cache 视频于内存,会对你的服务相应有巨大帮助的。

 

-----------------------------------------------------------------------------------------

1. 首先强调一下视频文件的特点
视频文件的尺寸比起普通 HTTP 请求的文件要大得多
视频文件上传以后就不会被修改
视频文件被播放器下载时,存在大量多线程下载

2. 为了跟踪你的命中率和观察你的文件里的 TCP_MISS 的类型,请增加 squid cache manager 和 access.log 的输出。在配置文件中增加以下内容
acl managerip src [HOSTIP]
acl manager proto cache_object
http_access allow manager managerip

logformat analyse %&gt;a &quot;%rm %ru HTTP/%rv&quot; %Ss:%Sh/%Hs
access_log /usr/local/squid/var/logs/access.log analyse
分别增加了 manager 的访问和 access.log 的跟踪

3. 优化前,先关注你当前的 squid 运行情况
squidclient -h[SQUIDIP] -p[PORT] mgr:info
mgr 的其他选项,用 squidclient mgr: 查看
Request Hit Ratios 和 Byte Hit Ratios 这两项重要指标就是我们要追求的结果。他的指标高地直接说明了 squid 的起到的 cache 效果
Memory accounted for: 项中的 Total accounted 指标表示你所允许 squid 使用的 cache 内存有多少空间已经存储了 cache 文件
File descriptor usage for squid: 项里面的指标指明了你的文件描述符数量是否 cache 瓶颈,如果你的 FD 不足请你重新设置并安装 squid
tail -10000 access.log | awk '{printf $5;}' | sort -rn | uniq -c | sort -rn
用此命令跟踪访问客户端命中率,下面列出日志的名种字段的含义
http://www.maycode.com/index.php/forum.html?func=view&amp;id=809&amp;catid=10

通过日志来观察哪类文件的命中率低,追查根源。
以上两项无论是否视频命中率的优化都要熟练使用

4. 介绍过分析方法后,说下关键的设置参数
maximum_object_size 最大磁盘缓存文件尺寸
maximum_object_size_in_memory 最大内存缓存文件尺寸
默认都是 8K ,如果不改变这两个值,出现的问题不用我多说了
range_offset_limit -1
Sets a upper limit on how far into the the file a Range request
may be to cause Squid to prefetch the whole file. If beyond this
limit Squid forwards the Range request as it is and the result
is NOT cached.
This is to stop a far ahead range request (lets say start at 17M

from making Squid fetch the whole object up to that point before
sending anything to the client.
A value of -1 causes Squid to always fetch the object from the
beginning so it may cache the result. (2.0 style)
A value of 0 causes Squid to never fetch more than the
client requested. (default)
上面是官方的解释,含义就是这个值限制多大的 range request 会触发缓存整个文件,如果这个值过大,会导致小的 range 请求,无法被缓存,会导致大量的不命中。对于视频设置为 -1 就可以了。
quick_abort_min -1 KB
The cache by default continues downloading aborted requests
which are almost completed (less than 16 KB remaining). This
may be undesirable on slow (e.g. SLIP) links and/or very busy
caches. Impatient users may tie up file descriptors and
bandwidth by repeatedly requesting and immediately aborting
downloads.
含义就是在用户突然中断请求时,还差多少大小的时候,继续完成全文件的缓存工作。此值对于性能的影响不是非常明显。
refresh_pattern -i \.flv$ 1440 50% 2880 ignore-reload
这个参数的各项含义不详细解释了, ignore-reload 很重要,很多浏览器发来的请求都带着 no-cache 头,所以造成了大量的不命中,这些 no- cache 毫无疑义,视频文件被修改的几率非常小,如果你的播放器请求又都带着 no-cache 头。因此增加 ignore-reload 对于性能提升有非常大的作用
cache_dir aufs /cache/squid 102400 16 256
另外我启用了 aufs 作为缓存存储,启用了异步 IO ,我认为对于优化 IO 有些效果。

5. 最后强调一下,如果你要给视频文件做 squid 请准备好足够的物理内存,并且让 squid 充分的 cache 视频于内存,会对你的服务相应有巨大帮助的。

 

-----------------------------------------------------------------------------------------

1. 首先强调一下视频文件的特点
视频文件的尺寸比起普通 HTTP 请求的文件要大得多
视频文件上传以后就不会被修改
视频文件被播放器下载时,存在大量多线程下载

2. 为了跟踪你的命中率和观察你的文件里的 TCP_MISS 的类型,请增加 squid cache manager 和 access.log 的输出。在配置文件中增加以下内容
acl managerip src [HOSTIP]
acl manager proto cache_object
http_access allow manager managerip

logformat analyse %&gt;a &quot;%rm %ru HTTP/%rv&quot; %Ss:%Sh/%Hs
access_log /usr/local/squid/var/logs/access.log analyse
分别增加了 manager 的访问和 access.log 的跟踪

3. 优化前,先关注你当前的 squid 运行情况
squidclient -h[SQUIDIP] -p[PORT] mgr:info
mgr 的其他选项,用 squidclient mgr: 查看
Request Hit Ratios 和 Byte Hit Ratios 这两项重要指标就是我们要追求的结果。他的指标高地直接说明了 squid 的起到的 cache 效果
Memory accounted for: 项中的 Total accounted 指标表示你所允许 squid 使用的 cache 内存有多少空间已经存储了 cache 文件
File descriptor usage for squid: 项里面的指标指明了你的文件描述符数量是否 cache 瓶颈,如果你的 FD 不足请你重新设置并安装 squid
tail -10000 access.log | awk '{printf $5;}' | sort -rn | uniq -c | sort -rn
用此命令跟踪访问客户端命中率,下面列出日志的名种字段的含义
http://www.maycode.com/index.php/forum.html?func=view&amp;id=809&amp;catid=10

通过日志来观察哪类文件的命中率低,追查根源。
以上两项无论是否视频命中率的优化都要熟练使用

4. 介绍过分析方法后,说下关键的设置参数
maximum_object_size 最大磁盘缓存文件尺寸
maximum_object_size_in_memory 最大内存缓存文件尺寸
默认都是 8K ,如果不改变这两个值,出现的问题不用我多说了
range_offset_limit -1
Sets a upper limit on how far into the the file a Range request
may be to cause Squid to prefetch the whole file. If beyond this
limit Squid forwards the Range request as it is and the result
is NOT cached.
This is to stop a far ahead range request (lets say start at 17M
from making Squid fetch the whole object up to that point before
sending anything to the client.
A value of -1 causes Squid to always fetch the object from the
beginning so it may cache the result. (2.0 style)
A value of 0 causes Squid to never fetch more than the
client requested. (default)
上面是官方的解释,含义就是这个值限制多大的 range request 会触发缓存整个文件,如果这个值过大,会导致小的 range 请求,无法被缓存,会导致大量的不命中。对于视频设置为 -1 就可以了。
quick_abort_min -1 KB
The cache by default continues downloading aborted requests
which are almost completed (less than 16 KB remaining). This
may be undesirable on slow (e.g. SLIP) links and/or very busy
caches. Impatient users may tie up file descriptors and
bandwidth by repeatedly requesting and immediately aborting
downloads.
含义就是在用户突然中断请求时,还差多少大小的时候,继续完成全文件的缓存工作。此值对于性能的影响不是非常明显。
refresh_pattern -i \.flv$ 1440 50% 2880 ignore-reload
这个参数的各项含义不详细解释了, ignore-reload 很重要,很多浏览器发来的请求都带着 no-cache 头,所以造成了大量的不命中,这些 no- cache 毫无疑义,视频文件被修改的几率非常小,如果你的播放器请求又都带着 no-cache 头。因此增加 ignore-reload 对于性能提升有非常大的作用
cache_dir aufs /cache/squid 102400 16 256
另外我启用了 aufs 作为缓存存储,启用了异步 IO ,我认为对于优化 IO 有些效果。

5. 最后强调一下,如果你要给视频文件做 squid 请准备好足够的物理内存,并且让 squid 充分的 cache 视频于内存,会对你的服务相应有巨大帮助的。

 

-----------------------------------------------------------------------------------------

1. 首先强调一下视频文件的特点
视频文件的尺寸比起普通 HTTP 请求的文件要大得多
视频文件上传以后就不会被修改
视频文件被播放器下载时,存在大量多线程下载

2. 为了跟踪你的命中率和观察你的文件里的 TCP_MISS 的类型,请增加 squid cache manager 和 access.log 的输出。在配置文件中增加以下内容
acl managerip src [HOSTIP]
acl manager proto cache_object
http_access allow manager managerip

logformat analyse %&gt;a &quot;%rm %ru HTTP/%rv&quot; %Ss:%Sh/%Hs
access_log /usr/local/squid/var/logs/access.log analyse
分别增加了 manager 的访问和 access.log 的跟踪

3. 优化前,先关注你当前的 squid 运行情况
squidclient -h[SQUIDIP] -p[PORT] mgr:info
mgr 的其他选项,用 squidclient mgr: 查看
Request Hit Ratios 和 Byte Hit Ratios 这两项重要指标就是我们要追求的结果。他的指标高地直接说明了 squid 的起到的 cache 效果
Memory accounted for: 项中的 Total accounted 指标表示你所允许 squid 使用的 cache 内存有多少空间已经存储了 cache 文件
File descriptor usage for squid: 项里面的指标指明了你的文件描述符数量是否 cache 瓶颈,如果你的 FD 不足请你重新设置并安装 squid
tail -10000 access.log | awk '{printf $5;}' | sort -rn | uniq -c | sort -rn
用此命令跟踪访问客户端命中率,下面列出日志的名种字段的含义
http://www.maycode.com/index.php/forum.html?func=view&amp;id=809&amp;catid=10

通过日志来观察哪类文件的命中率低,追查根源。
以上两项无论是否视频命中率的优化都要熟练使用

4. 介绍过分析方法后,说下关键的设置参数
maximum_object_size 最大磁盘缓存文件尺寸
maximum_object_size_in_memory 最大内存缓存文件尺寸
默认都是 8K ,如果不改变这两个值,出现的问题不用我多说了
range_offset_limit -1
Sets a upper limit on how far into the the file a Range request
may be to cause Squid to prefetch the whole file. If beyond this
limit Squid forwards the Range request as it is and the result
is NOT cached.
This is to stop a far ahead range request (lets say start at 17M
from making Squid fetch the whole object up to that point before
sending anything to the client.
A value of -1 causes Squid to always fetch the object from the
beginning so it may cache the result. (2.0 style)
A value of 0 causes Squid to never fetch more than the
client requested. (default)
上面是官方的解释,含义就是这个值限制多大的 range request 会触发缓存整个文件,如果这个值过大,会导致小的 range 请求,无法被缓存,会导致大量的不命中。对于视频设置为 -1 就可以了。
quick_abort_min -1 KB
The cache by default continues downloading aborted requests
which are almost completed (less than 16 KB remaining). This
may be undesirable on slow (e.g. SLIP) links and/or very busy
caches. Impatient users may tie up file descriptors and
bandwidth by repeatedly requesting and immediately aborting
downloads.
含义就是在用户突然中断请求时,还差多少大小的时候,继续完成全文件的缓存工作。此值对于性能的影响不是非常明显。
refresh_pattern -i \.flv$ 1440 50% 2880 ignore-reload
这个参数的各项含义不详细解释了, ignore-reload 很重要,很多浏览器发来的请求都带着 no-cache 头,所以造成了大量的不命中,这些 no- cache 毫无疑义,视频文件被修改的几率非常小,如果你的播放器请求又都带着 no-cache 头。因此增加 ignore-reload 对于性能提升有非常大的作用
cache_dir aufs /cache/squid 102400 16 256
另外我启用了 aufs 作为缓存存储,启用了异步 IO ,我认为对于优化 IO 有些效果。

5. 最后强调一下,如果你要给视频文件做 squid 请准备好足够的物理内存,并且让 squid 充分的 cache 视频于内存,会对你的服务相应有巨大帮助的。

-----------------------------简单一例--------------------------------------

 

Squid 3.0 反向代理(加速模式)配置

visible_hostname squid1 . ihompy . com
#设定squid的主机名,如无此项squid将无法启动
http_port 80 accel vhost vport
#设定squid为accel加速模式,vhost必须要加.否则将无法将主机头转发至后端服务器,访问时就会出现无法找到主机头的错误
cache_peer www . contentchina . com parent 80 0 no - query originserver name = contentchina
cache_peer bbs . contentchina . com parent 80 0 no - query originserver name = bbs
cache_peer www . ihompy . com parent 80 0 no - query originserver name = ihompy
#定义不同的父节点,将节点设为no-query以及originserver说明这些节点是实际服务器
cache_peer_domain contentchina www . contentchina . com
cache_peer_domain bbs bbs . contentchina . com
cache_peer_domain ihompy www . ihompy . com
#设定不同域名转发到不同的cache_peer上,如果没有这项.不同域名的域名可能被分发到同一台服务器上.
acl all src 0.0.0.0 / 0.0.0.0
http_access allow all
#允许所有客户端访问
cache_log / var / log / squid / cache . log
#记录日志
#***********ACL存取控制*************
acl QueryString url_regex \. php ?
#***********缓冲存取控制*************
no_cache deny QueryString
#不对符合QueryString的ACL内容进行缓冲
#***********性能优化配置*************
maximum_object_size 320010 KB
#大于此容量的对象将不会被保存在磁盘上,默认大小是4M,如果squid服务器用于缓冲flash等大型文件,建议将此值变大.否则过大的文件在下次重启后将需要重新获取
maximum_object_size_in_memory 100 KB
#最大位于内存中的对象的大小,默认大小是8K,如果服务器内存很大.可以适当提高此值的大小,建议根据网站的80%图片的大小来定.或者根据WEB服务器实际存取文件中最常访问的文件大小来定制
#***********其他可选配置*************
dns_nameservers 10.0.0.1 192.172.0.4
#配置DNS服务器地址.获取后端时将从此dns获取IP地址
cache_mgr code_tin @ msn . com
#在错误日志中出现的webmaster地址.

Squid 3.0与2.6一样.相较2.5的accel模式下配置要简单许多
只要设置不同的后端,cache_peer parent originserver
就可以进行反向代理
而不再需要httpd_accel系列参数的配置.
配置squid时最好制定内部dns,或者修改/etc/hosts文件
否则squid可能会回环访问其自身而出现问题.

---------------------------------------------------------------------------------------------------------------

修改Linux提高Squid服务器并发 Linux下高并发的Squid服务器,TCP TIME_WAIT套接字数量经常达到两、三万,服务器很容易被拖死。通过修改Linux内核参数,可以减少Squid服务器的TIME_WAIT套接字数量。

vi /etc/sysctl.conf

增加以下几行:
引用
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.ip_local_port_range = 1024 65000
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_max_tw_buckets = 5000

说明:
net.ipv4.tcp_syncookies = 1 表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;
net.ipv4.tcp_tw_reuse = 1 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
net.ipv4.tcp_tw_recycle = 1 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。
net.ipv4.tcp_fin_timeout = 30 表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。
net.ipv4.tcp_keepalive_time = 1200 表示当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时,改为20分钟。
net.ipv4.ip_local_port_range = 1024 65000 表示用于向外连接的端口范围。缺省情况下很小:32768到61000,改为1024到65000。
net.ipv4.tcp_max_syn_backlog = 8192 表示SYN队列的长度,默认为1024,加大队列长度为8192,可以容纳更多等待连接的网络连接数。
net.ipv4.tcp_max_tw_buckets = 5000 表示系统同时保持TIME_WAIT套接字的最大数量,如果超过这个数字,TIME_WAIT套接字将立刻被清除并打印警告信息。默认为180000,改为5000。对于Apache、Nginx等服务器,上几行的参数可以很好地减少TIME_WAIT套接字数量,但是对于Squid,效果却不大。此项参数可以控制TIME_WAIT套接字的最大数量,避免Squid服务器被大量的TIME_WAIT套接字拖死。

执行以下命令使配置生效:

/sbin/sysctl -p

----------------------------------------------------------------

13.2.5 access.log分析工具

access.log包含很多信息,远不止你简单的浏览该文件所见。为了完整的浏览,必须使用第三方的日志文件分析包。你可在Squid的web页面的链接里,找到它们的列表。或者直接访问:http://www.squid-cache.org/Scripts/
.

最流行的工具之一是Calamaris -- 一个Perl脚本,解析日志文件并产生基于文本的或HTML的报告。它提供关于会话的详细分类包括请求方式、客户端IP地址、原始服务器域名、内容类型、文件名扩展、响应size、以及更多。Calamaris也报告ICP查询会话,甚至其他cache产品的日志分析。其站点是:http://calamaris.cord.de
.

Squeezer以及它的派生Squeezer2,是Squid专有的分析工具。它们提供许多统计,能帮助你了解Squid的性能,特别是在有邻居cache时。两者都产生HTML文件作为输出。squid-cache.org站点的Logfile Analysis页有这些程序的链接。

Webalyzer是另一个有用工具。它运行快速,并且产生带表格和柱形统计表的HTML页面。它原始是设计成分析原始服务器的访问日志的。尽管它能解析Squid的日志,但不会报告诸如命中率和响应时间的事件。它使用的某些条款不同于我的做法。例如,Webalyzer把任何请求叫做一个"命中",这不同于cache命中。它也把"页面"和"文件"加以区别。更多信息请访问Webalyzer的主页:http://www.mrunix.net/webalyzer/.

 

13.3 store.log

store.log记录Squid关于存储或删除cache目标的决定。对每个存在cache里的目标、每个不可cache的目标、以及每个被轮换策略删除的目标,Squid都会创建相应的日志条目。该日志文件内容既包含了内存cache又包含了磁盘cache。

store.log提供了下述不能从access.log获取的内容:

  • 1)某个特定的响应是否被cache。
  • 2)cache目标的文件号。对UFS基础的存储机制,你可转换该文件号到路径名,并且检查cache文件的内容。
  • 3)响应的内容长度:包括Content-Length值和实际的body大小。
  • 4)Date, Last-Modified, 和Expires头部的值。
  • 5)响应的cache关键字(例如MD5哈希值)。

如你所见,这些都是相对低级的信息,在日常管理中可能用不上。除非你要做专业的分析,或打算debug某程序,否则store.log可有可无。可以如下来禁止它:

cache_store_log none

跟其他日志文件一样,Squid将最新的日志条目写到该文件的末尾。某个给定的URI可能出现在日志文件里多次。例如,它先被cache,然后删除,接着又cache住。仅仅最近来的日志条目才反映目标的当前值。

store.log是文本基础的,看起来如下:

1067299212.411 RELEASE -1 FFFFFFFF A5964B32245AC98592D83F9B6EA10B8D 206

    1067299212 1064287906 -1 application/octet-stream 6840/6840

    GET http://download.windowsupdate.com/msdownload/update/v3-19990518/cab...

1067299212.422 SWAPOUT 02 0005FD5F 6F34570785CACABC8DD01ABA5D73B392 200

    1067299210 1057899600 -1 image/gif 1125/1125

    GET http://forum.topsportsnet.com/shf./images/nav_members1.gif

1067299212.641 RELEASE -1 FFFFFFFF B0616CB4B7280F67672A40647DD08474 200

    1067299212 -1 -1 text/html -1/67191

    GET http://www.tlava.com/

1067299212.671 RELEASE -1 FFFFFFFF 5ECD93934257594825659B596D9444BC 200

    1067299023 1034873897 1067299023 image/jpeg 3386/3386

    GET http://ebiz0.ipixmedia.com/abc/ebiz/_EBIZ_3922eabf57d44e2a4c3e7cd234a...

1067299212.786 RELEASE -1 FFFFFFFF B388F7B766B307ADEC044A4099946A21 200

    1067297755 -1 -1 text/html -1/566

    GET http://www.evenflowrocks.com/pages/100303pic15.cfm

1067299212.837 RELEASE -1 FFFFFFFF ABC862C7107F3B7E9FC2D7CA01C8E6A1 304

    1067299212 -1 1067299212 unknown -1/0

    GET http://ebiz0.ipixmedia.com/abc/ebiz/_EBIZ_3922eabf57d44e2a4c3e7cd234a...

1067299212.859 RELEASE -1 FFFFFFFF 5ED2726D4A3AD83CACC8A01CFDD6082B 304

    1066940882 1065063803 -1 application/x-javascript -1/0

    GET http://www.bellsouth.com/scripts/header_footer.js

每个日志条目包含如下13个域:

  • 1. 时间戳

    事件何时发生,表现为Unix纪元以来的秒数,它是毫秒级的。

     

  • 2. 动作

     

  • cache目标发生的动作。该域有3个可能值:SWAPOUT,RELEASE,和SO_FAIL。

     

    • 1)SWAPOUT在Squid成功的存储目标到磁盘时发生。某些目标例如那些消极cache的,仅保存在内存而不是磁盘,Squid不会在store.log里记录它们。

       

    • 2)SO_FAIL表明Squid不能完整的存储目标到磁盘。多半意味着存储机制拒绝以写方式打开新的磁盘文件。

       

    • 3)RELEASE在Squid从cache里删除目标,或首先就决定响应不可存储时发生。

     

  • 3. 目录号

     

  • 目录号是十进制小数形式,它是个到cache目录的7位索引。对没有存储到磁盘的目标,该域包含-1值。

     

  • 4. 文件号

     

  • 文件号是25位的标识符,内在的被squid使用。它被写成8字符的十六进制号。对UFS基础的存储机制,有算法可以转换文件号到路径名(见13.3.1节)。没有存储到磁盘的目标,没有有效的文件号。对这些目标,该域的值是FFFFFFFF。仅仅在RELEASE和SO_FAIL情况下才会出现这个值。

     

  • 5. cache关键字

    Squid使用MD5哈希值作为主要的索引来定位目标。该关键字基于请求方式、URI、和其他可能的信息计算得来。可以从cache关键字来查找store.log条目。然而请注意,目标的cache关键字可能改变。当Squid在access.log里记录TCP_REFRESH_MISS请求时,这点会发生。情况类似如下:

    1065837334.045 SWAPOUT ... 554BACBD2CB2A0C38FF9BF4B2239A9E5 ... http://blah
    
    1066031047.925 RELEASE ... 92AE17121926106EB12FA8054064CABA ... http://blah
    
    1066031048.074 SWAPOUT ... 554BACBD2CB2A0C38FF9BF4B2239A9E5 ... http://blah

    发生了什么呢?该目标原本cache在某个关键字下(554B...)。一段时间后,Squid接受到对该目标的另一请求,并转发确认请求到原始服务器。当响应以新内容返回时,Squid改变旧目标的cache关键字(92AE...),以便它能授予新目标正确的关键字(554B...)。然后旧目标删除,新目标存储到磁盘。

     

  • 6. 状态码

     

  • 该域显示响应的HTTP状态码,跟access.log一样。表13.1是状态码列表。

     

  • 7. 日期

     

  • HTTP响应的Date头部值,表现为Unix纪元以来的秒数。值-1表示Date头部不可解析,-2意味着头部完缺。

     

  • 8. 最后修改时间

     

  • HTTP响应的Last-Modified头部值,表现为Unix纪元以来的秒数。值-1表示Last-Modified头部不可解析,-2意味着头部完缺。

     

  • 9. 过期时间

     

  • HTTP响应的Expires头部值,表现为Unix纪元以来的秒数。值-1表示Expires头部不可解析,-2意味着头部完缺。

     

  • 10. 内容类型

     

  • HTTP响应的Content-Type头部值,排除了任何media-type参数。假如Content-Type丢失了,Squid插入值unknown。

     

  • 11. 内容长度/大小

     

  • 该域包含2个数字,以斜杠分开。第一个是Content-Length头部值。-1表明Content-Length头部不存在。第二个是HTTP消息body的实际大小。你可使用这2个数字来部分的验证接受到的响应,并验证原始服务器是否不正确的计算了内容长度。大多数情形下,这2个数字相等。

     

  • 12. 方式

     

  • 请求目标的HTTP方式,跟access.log里的一样。

     

  • 13. URI

     

  • 最后一个域是请求URI,跟access.log里的一样。该域也有前述章节提到的空格问题。然而,这里不必为此担忧,因为你可安全的忽略任何多余的域。

     

  • 对许多RELEASE的条目,在最后8个域出现的是疑问号(?)。这是因为这些域的大部分值来自squid称为MemObject的结构。该结构仅在目标已被接受时,或目标被完整存储在内存时,才会出现。Squid cache里的大部分目标没有MemObject结构,因为它们仅存在于磁盘。对这些情况,Squid在相应域放置一个疑问号。

 

13.3.1 转换文件号到路径名

假如想要检查某个特定的cache文件,你可稍费工夫将文件号转换到路径名。另外目录号和L1和L2值也是必需的。在squid的源代码里,storeUfsDirFullPath( )函数做这个事情。可在src/fs/ufs/store_dir_ufs.c文件里找到它。如下短小的perl脚本模拟了当前算法:

#!/usr/bin/perl

$L1 = 16;

$L2 = 256;

while (<>) {

    $filn = hex(

第13章 日志文件

13.1 cache.log

cache.log包含多种消息,例如Squid的配置信息、性能警告、以及严重错误。如下是cache.log的

输出样本:

2003/09/29 12:09:45| Starting Squid Cache version 2.5.STABLE4 for i386-unknown-freebsd4.8...    
2003/09/29 12:09:45| Process ID 18990    
2003/09/29 12:09:45| With 1064 file descriptors available    
2003/09/29 12:09:45| Performing DNS Tests...    
2003/09/29 12:09:45| Successful DNS name lookup tests...    
2003/09/29 12:09:45| DNS Socket created at 0.0.0.0, port 1154, FD 5    
2003/09/29 12:09:45| Adding nameserver 24.221.192.5 from /etc/resolv.conf    
2003/09/29 12:09:45| Adding nameserver 24.221.208.5 from /etc/resolv.conf    
2003/09/29 12:09:45| helperOpenServers: Starting 5 'redirector.pl' processes    
2003/09/29 12:09:45| Unlinkd pipe opened on FD 15    
2003/09/29 12:09:45| Swap maxSize 10240 KB, estimated 787 objects    
2003/09/29 12:09:45| Target number of buckets: 39    
2003/09/29 12:09:45| Using 8192 Store buckets    
2003/09/29 12:09:45| Max Mem  size: 8192 KB    
2003/09/29 12:09:45| Max Swap size: 10240 KB    
2003/09/29 12:09:45| Rebuilding storage in /usr/local/squid/var/cache (CLEAN)    
2003/09/29 12:09:45| Using Least Load store dir selection    
2003/09/29 12:09:45| Set Current Directory to /usr/local/squid/var/cache    
2003/09/29 12:09:45| Loaded Icons.    
2003/09/29 12:09:45| Accepting HTTP connections at 0.0.0.0, port 3128, FD 16.    
2003/09/29 12:09:45| Accepting ICP messages at 0.0.0.0, port 3130, FD 17.    
2003/09/29 12:09:45| WCCP Disabled.    
2003/09/29 12:09:45| Ready to serve requests.

每个cache.log条目以时间戳开始,指示消息何时产生。本示例里的日志报告了squid的版本

(2.5.STABLE4),以及squid所运行的操作系统标识符(i386-unknown-freebsd4.8)。接下来

是进程ID(18990)。许多cache.log条目看起来含义不明(例如Target number of buckets: 39)。

大多数正常情形下,可以忽略这些不易理解的条目。另一方面,你也许该仔细看一下本质的配置细节,

例如名字服务器的地址,或HTTP服务器地址。本示例日志最后陈述了Squid准备接受请求。此时

Squid可以接受来自客户端的HTTP连接。

通常,cache.log增长缓慢。然而,不正常的HTTP事务或类似的事件可以导致squid发布一个debug

消息。假如这样的事件经常发生(例如DOS攻击、新的病毒、磁盘意外等),日志文件会增长很快。

定期轮转日志减少了用光磁盘的风险。

主要的错误和异常条件最可能报告在cache.log里。我推荐存档这些日志,以便以后回查事件的源头。

当在Squid的邮件列表或类似论坛描述这些故障时,相应的cache.log非常有用。某些情形下,你也

许应该调大日志的debug级别,以便其他人能更好的理解和修正你的问题。

 

13.1.1 debug级别

debug_options指令控制cache.log的日志级别。默认值(ALL,1)通常是最佳选择。在更高级别上,

不重要的消息会混淆视线。请参考16.2节关于debug_options指令的完整描述。

请注意最高级别的debug(9或10)会对每个请求产生数千行日志,快速消耗磁盘空间和显著影响

squid的性能。

可以使用squid的-X命令行选项来对所有情形激活完整的debug。假如squid拒绝启动,并且

squid.conf里的debug级别不足以诊断问题时,该模式特别有用。这也是在配置文件解析器解析到

debug_options指令之前,激活它的完整debug的好方法。在squid运行正常时,请勿使用-X。

对运行的squid进程,可使用squid的-k debug命令行选项来立刻激活完整debug。这个命令是循环

使用的:第一次调用打开完整debug,第二次调用则关闭它。请见第5章关于-k选项的通用讨论。

如前所述,完整debug会产生难以控制的日志增长。这会使squid和操作系统运行缓慢。在极端情形

下,你会发现终端session在运行第一个squid -k debug命令后,变得没有响应。在squid狂写日志

 

的同时让操作无法进行,这情形并不好。如下技巧也许有用,它获取5秒钟的debug数据快照:

% squid -k debug; sleep 5; squid -k debug

 

13.1.2 转发cache.log消息到系统日志

为了让squid发送cache.log消息的拷贝到系统日志,请使用-s命令行选项。仅仅在debug级别0和1

的消息会被转发。级别0的消息以syslog级别LOG_WARNING记录,级别1的消息以syslog级别

LOG_NOTICE记录。所有消息使用LOCAL4的syslog设备。如下是配置syslogd的一个方法,以便这

些消息能保存下来:

local4.warning                           /var/log/squid.log

在维护多个squid主机时,使用syslog来记录cache.log特别方便。可以配置每个本地syslog进程,

转发这些消息到中央日志主机,这样就可在一个地方统一浏览所有cache日志。例如,可在

/etc/syslogd.conf里使用如下接口:

---------------------------------------------------------------------------

squid的日志很重要。常常要了解的,其中最重要的就是命中率啦,不然反向代理做的用就不大。

#cat access.log|gawk ‘{print $4}’|sort|uniq -c|sort -nr

9568 TCP_IMS_HIT/304
6313 TCP_HIT/200
2133 TCP_MISS /200
1568 TCP_MISS/206
587 TCP_MEM_HIT/200
531 TCP_MISS/304
207 TCP_REFRESH_HIT/200
152 TCP_REFRESH_HIT/304
86 TCP_NEGATIVE_HIT/404
69 TCP_MISS/404
9 TCP_MISS/000
4 TCP_MISS/503
1 TCP_REFRESH_MISS/000
1 TCP_DENIED/400

可以使用上面的方法,大约的分析一下命令中比。什么意思就看下面的详解.

#cat /var/log/squid/access.log |grep TCP_MEM_HIT

如果看到很多的TCP_MEM_HIT ,这表明该文件是从内存缓存读取的,squid已经起作用了!你再用浏览器打开该文件,应该是快如闪电了。。呵呵,大功告成了!还有其他类型的HIT,如TCP_HIT等等,这些是从磁盘 读取的,我觉得加速的意义不大,只不过缓解了apache的压力而已。

相应于HTTP请求,下列标签可能出现在access.log文件的第四个域。

TCP_HIT

Squid发现请求资源的貌似新鲜的拷贝,并将其立即发送到客户端。

TCP_MISS

Squid没有请求资源的cache拷贝。

TCP_REFERSH_HIT

Squid发现请求资源的貌似陈旧的拷贝,并发送确认请求到原始服务器 。原始服务器 返回304(未修改)响应,指示squid的拷贝仍旧是新鲜的。

TCP_REF_FAIL_HIT

Squid发现请求资源的貌似陈旧的拷贝,并发送确认请求到原始服务器。然而,原始服务器响应失败,或者返回的响应Squid不能理解。在此情形下,squid发送现有cache拷贝(很可能是陈旧的)到客户端。

TCP_REFRESH_MISS

Squid发现请求资源的貌似陈旧的拷贝,并发送确认请求到原始服务器。原始服务器响应新的内容,指示这个cache拷贝确实是陈旧的。

TCP_CLI ENT_REFRESH_MISS

Squid发现了请求资源的拷贝,但客户端的请求包含了Cache-Control: no-cache指令。Squid转发客户端的请求到原始服务器,强迫cache确认。

TCP_IMS_HIT

客户端发送确认请求,Squid发现更近来的、貌似新鲜的请求资源的拷贝。Squid发送更新的内容到客户端,而不联系原始服务器。

TCP_SWAPFAIL_MISS

Squid发现请求资源的有效拷贝,但从磁盘装载它失败。这时squid发送请求到原始服务器,就如同这是个cache丢失一样。

TCP_NEGATIVE_HIT

在对原始服务器的请求导致HTTP错误时,Squid也会cache这个响应。在短时间内对这些资源的重复请求,导致了否命中。 negative_ttl指令控制这些错误被cache的时间数量。请注意这些错误只在内存cache,不会写往磁盘。下列HTTP状态码可能导致否定 cache(也遵循于其他约束): 204, 305, 400, 403, 404, 405, 414, 500, 501, 502, 503, 504。

TCP_MEM_HIT

Squid在内存cache里发现请求资源的有效拷贝,并将其立即发送到客户端。注意这点并非精确的呈现了所有从内存服务的响应。例如,某些cache在内存里,但要求确认的响应,会以TCP_REFRESH_HIT, TCP_REFRESH_MISS等形式记录。

TCP_DENIED

因为http_access或http_reply_access规则,客户端的请求被拒绝了。注意被http_access拒绝的请求在第9域的值是NONE/-,然而被http_reply_access拒绝的请求,在相应地方有一个有效值。

TCP_OFFLINE_HIT

当offline_mode激活时,Squid对任何cache响应返回cache命中,而不用考虑它的新鲜程度。

TCP_REDIRECT

重定向程序告诉Squid产生一个HTTP重定向到新的URI(见11.1节)。正常的,Squid不会记录这些重定向。假如要这样做,必须在编译squid前,手工定义LOG_TCP_REDIRECTS预处理指令。

NONE

无分类的结果用于特定错误,例如无效主机名。

相应于ICP查询,下列标签可能出现在access.log文件的第四域。

UDP_HIT

Squid在cache里发现请求资源的貌似新鲜的拷贝。

UDP_MISS

Squid没有在cache里发现请求资源的貌似新鲜的拷贝。假如同一目标通过HTTP请求,就可能是个cache丢失。请对比UDP_MISS_NOFETCH。

UDP_MISS_NOFETCH

跟UDP_MISS类似,不同的是这里也指示了Squid不愿去处理相应的HTTP请求。假如使用了-Y命令行选项,Squid在启动并编译其内存索引时,会返回这个标签而不是UDP_MISS。

UDP_DENIED

因为icp_access规则,ICP查询被拒绝。假如超过95%的到某客户端的ICP响应是UDP_DENIED,并且客户端数据库 激活了(见附录A),Squid在1小时内,停止发送任何ICP响应到该客户端。若这点发生,你也可在cache.log里见到一个警告。

UDP_INVALID

Squid接受到无效查询(例如截断的消息、无效协议版本、URI里的空格等)。Squid发送UDP_INVALID响应到客户端。

---------------------------------------------------------------------------------------------

squid反向代理对后端进行负载均衡

八月 6th, 2008 Posted in Squid
< by Johnny Woo >

修改squid.conf文件
cache_peer 10.11.12.151 parent 80 0 no-query originserver name=web1 round-robin
cache_peer 10.11.12.146 parent 80 0 no-query originserver name=web2 round-robin
cache_peer_domain web1 web2 .test.com

这样访问squid时,
squid会从后端的实际服务器中挑选一台进行抓取
例子中使用的是RR的方法轮询
squid同时会对后端的健康状态进行检查
如果后端服务器down了
那么squid会从剩余的origin服务器中抓取数据

此条目发表在article分类目录,贴了标签。将固定链接加入收藏夹。