squid命中率(转)

察看命中率的shell
cat access.log|gawk '{print $4}'|sort|uniq -c|sort -nr

重点观察下面三个内容

  • TCP_MEM_HIT
  • TCP_IMS_HIT
  • TCP_REFRESH_HIT

1198559749.083 0 60.4.218.18 TCP_REFRESH_HIT/200 271 GET http://msg.ppstream.com/msg/msg.dat - FIRST_UP_PARENT/d text/html
1198559813.186 1 218.106.61.11 TCP_IMS_HIT/304 233 GET http://msg.ppstream.com/test.html - NONE/- text/html
1198559829.358 0 218.106.61.11 TCP_IMS_HIT/304 224 GET http://msg.ppstream.com/msg/msg.dat - NONE/- text/html

TCP_IMS_HIT:NONE 客户端发送确认请求,Squid发现更近来的、新鲜的请求资源的拷贝。
Squid发送更新的内容到客户端,而不联系原始服务器。(这指明Squid对本次请求,不会与任何其他服务器(邻居或原始服务器)通信。)
TCP_MEM_HIT:NONE 类似 TCP_IMS_HIT:NONE, 从内存中响应
TCP_REFRESH_HIT:FIRST_UP_PARENT/d
Squid发现请求资源的貌似陈旧的拷贝,并发送确认请求到原始服务器。 Continue reading

squid中HTTP/1.1 501 Method Not Implemented的解决办法

刚安装的squid,但在用squidclient清除缓存的时候,提示错误:

freebsd# ./squidclient -m PURGE -p 80 http://www.testsquid.com/index.html
HTTP/1.1 501 Method Not Implemented
Date: Tue, 28 Jun 2011 23:03:22 GMT
Server: Apache/2.2.19 (FreeBSD) mod_ssl/2.2.19 OpenSSL/0.9.8k DAV/2
Allow: GET,HEAD,POST,OPTIONS,TRACE
Content-Length: 217
Connection: close
Content-Type: text/html; charset=iso-8859-1

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>501 Method Not Implemented</title>
</head><body>
<h1>Method Not Implemented</h1>
<p>PURGE to /index.html not supported.<br />
</p>
</body></html>

Continue reading

关于SQUID3.0的cache_peer说明介绍

http_port 8000 vhost # Squid 服务器监听本机 8000 端口,vhost 支持虚拟主机。

cache_peer 192.168.1.50 parent 81 0 no-query originserver weight=1 name=a
cache_peer 192.168.1.50 parent 82 0 no-query originserver weight=1 name=b
cache_peer 192.168.1.51 parent 80 0 no-query originserver weight=1 name=c

cache_peer_domain a www.serverA1.com
cache_peer_domain b www.serverA2.com
cache_peer_domain c www.serverB.com
#以上六行配置,让 Squid 服务器知道:


#从客户端过来的请求,如果是 www.serverA1.com,则 Squid 向 ServerA 192.168.1.50 的端口 81发送请求;
从客户端过来的请求,如果是 www.serverA2.com,则 Squid 向 ServerA 192.168.1.50 的端口 82发送请求;
从客户端过来的请求,如果是 www.serverB.com,则 Squid 向 ServerA 192.168.1.50 的端口 80发送请求;

cache_dir ufs /squid_cache 256 16 256 #指定 Squid 服务器存放数据的目录

acl all src 0.0.0.0/0.0.0.0
http_access allow all

cache_peer_access a allow all
cache_peer_access b allow all
cache_peer_access c allow all
#设置访问权限,允许所有外部客户端访问 a b c(我们定义的三个虚拟主机)

其它配置项默认即可。

扩展阅读:

常用 squid 配置及命令 :http://blog.haohtml.com/archives/10649

squid的安全设置:http://blog.haohtml.com/archives/10610

squid日志详解:http://blog.haohtml.com/archives/8081

 

[Squid] 分享squid缓存服务器配置

分享下自己测试squid缓存节点配置文件,如果有不足之处请大家多提意见。
测试的版本已经完全支持http/1.1

squid版本:
Squid Cache: Version 3.1.5

http_port 80 vhost                     #squid监听端口,vhost表示根据请求主机头来转发到后端WEB机器
http_port 8080 vhost vport             #vport 虚拟主机的支持
icp_port 0                             #提供从相邻的squid查询端口,如果不提供该服务,可一将端口改为0
unique_hostname host100                 #防止cache主机名冲突
dns_nameservers 192.168.1.100        #指定内部DNS服务器

cache_replacement_policy heap LFUDA  #控制了squid的磁盘cache的置换策略(例如响应时间,命中率,字节命中率等),一般分为三类,我们只用了LFUDA
memory_replacement_policy heap LFUDA #原理同上

cache_dir aufs /data/cache/cache1 40960 16 256 max-size=204800    指定cache在硬盘上存放的路径,最大存储40G,16个一级目录,256个二级目录,如果不缓存任何文件可以指定 Continue reading

常用 squid 配置及命令

squid默认拒绝所有访问客户机的请求。

acl格式:

 acl 列表名称 列表类型 -i 列表值

 

列表名称:给acl随意起得的名称。

列表类型:常用的

 src  源IP地址(客户机IP)
 dst  目的IP地址(服务器IP地址)
 srcdomain  源名称(客户机所属的域)
 dstdomain 目标名称(服务器所属域) 
 time 一天中的时刻和一周中的一天 
 url_regex URL规则表达式 
 urlpath_regex:  略去协议和主机名的URL规则表达式
 proxy_auth 通过外部程序进行用户认证 
 maxconn 单一IP的最大连接数 

 

-i:表示忽略列表值得大小写,否则squid是区分大小写的。 Continue reading

squid的安全设置

本文链接: http://www.php-oa.com/2008/01/15/squid-se.html

使用squid的网站

#curl -I www.php-oa.com
HTTP/1.0 200 OK
Date: Tue, 15 Jan 2008 03:45:29 GMT
Server: Apache
X-Pingback: http://www.php-oa.com/xmlrpc.php
Content-Type: text/html; charset=UTF-8
X-Cache: MISS from cnc.onezone.com
X-Cache-Lookup: MISS from cnc.onezone.com:80
Via: 1.0 cnc.onezone.com:80 (squid/2.6.STABLE6)
Connection: close

正常的没有使用squid的。 Continue reading

squid缓存php动态文件

acl QUERY urlpath_regex cgi-bin \?
no_cache deny QUERY

这段代码会不cache 所有带 cgi-bin 和 ? 的url path.表面看来,如果url 里面不带?还是可以被缓存的。可惜实际并非如此,squid 会根据header读取httpd的声明信息,例如生成时间等信息;实际上.php的页面不返回 last-modified 信息,因此很难被cache。

通过增加 php 的last-modified header强制 squid 的cache功能:

header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");

header要放在所有.php文件中去。换而言之,就是要
1. 在 include.php中,构造一个当前时间转换为最近那次5分钟/n分钟划分的时间函数
2. 把这个时间函数的结果返回到 header
3. 在所有页面中调用这个 include

以上方法本人已经测试通过.

分别是加last-modified前台的日志

============================

由于网站的访问量越来越大,用户播放视频,都要从web服务器拿文件,而且又是动态连接,要调用一个php-cgi进程,这样的话很浪费资源,所以要加缓存服务器。但是问题来了,squid 默认是不缓存动态页面的,google 了半天,发现很多人的文章没有一个说到正点上的。最后自己不停的做测试,看squid.conf.documented,把问题解决了,所以就记录下来,以便以后大家遇到同样的问题。好解决。 列子:

http://www.nginxs.com/nginx/Grec.php?id=eric&b.php?=aaa

首选用 curl 抓 head头。

nginx $> curl -I http://www.nginxs.com/nginx/Grec.php
HTTP/1.1 200 OK
Server: nginx
Date: Fri, 27 Aug 2010 06:49:43 GMT
Content-Type: text/html; charset=utf-8
Connection: keep-alive
Vary: Accept-Encoding
X-Powered-By: PHP/5.2.13
Set-Cookie: PHPSESSID=2d4523a7c6a5a54dbb20f64f3bc04be3; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Pragma: no-cache

看红字部分,然后在看 squid.conf.documented 对应的部分 Continue reading

squid+apache使web加速

一台web服务器,上面有好几个虚拟主机,近日装上Squid 2.6进行WEB加速,Squid 和Apache均在同一台服务器上面,效果非常明显

主机配置为: CPU: 至强2.8G  内存: 1GB RAM

下载:

wget  http://www.squid-cache.org/Versions/v2/2.6/squid-2.6.STABLE6.tar.bz2
tar jxvf squid-2.6.STABLE6.tar.bz2
./configure –prefix=/usr/local/squid --with-maxfd=65536

这个--with-maxfd参数是增大squid文件描述符到65536

安装完毕后开始配置/usr/local/squid/etc/squid.conf

CODE:

visible_hostname www.yoursite.com
http_port xx.xx.xx.xx:80 vhost vport

#xx.xx.xx.xx为这台服务器的IP地址 Continue reading

squid中日志文件详解

4.4 日志文件路径

我将在第13章讨论所有squid的日志细节。你现在你关注的唯一事情是,squid将它的日志放在何处。默认的日志目录是squid安装位置下的logs目录。例如,假如你在./configure时没有使用--prefix=选项,那么默认的日志文件路径是/usr/local/squid/var/logs.

你必须确认日志文件所存放的磁盘位置空间足够。在squid写日志时如果接受到错误,它会退出和重启。该行为的主要理由应引起你的注意。squid想确认你不会丢失任何重要的日志信息,特别是你的系统被滥用或者被攻击时。

squid有三个主要的日志文件:cache.log,access.log,store.log.第一个文件即cache.log,包含状态性的和调试性的消息。当你刚开始运行squid时,你应密切的关注该文件。假如squid拒绝运行,理由也许会出现在cache.log文件的结尾处。在正常条件下,该文件不会变得很大。也请注意,假如你以-s选项来运行squid,重要的cache.log消息也可被送到你的syslog进程。通过使用cache_log指令,你可以改变该日志文件的路径:

cache_log /squid/logs/cache.log

access.log文件包含了对squid发起的每个客户请求的单一行。每行平均约150个字节。也就是说,在接受一百万条客户请求后,它的体积约是150M。请使用cache_access_log指令来改变该日志文件的路径: Continue reading

[教程]FreeBSD下squid3.0安装教程

以下文章,虽然在FreeBSD下安装,linux下的安装方法类似.只是一些命令如fetch=>wget变更一下即可.

如何您是在FreeBSD下用ports来安装的话,前两步基本可以省略,默许的安装路径为/usr/local/sbin/squid,配置目录为/usr/local/etc/squid。

此版本好像有漏洞,安装时请使用最新的稳定版本: http://www.cnbeta.com/articles/121237.htm

一、编译安装

#fetch http://www.squid-cache.org/Versions/v3/3.0/squid-3.0.STABLE25.tar.gz
#tar zxvf squid-3.0.STABLE25.tar.gz //稳定版
#cd squid-3.0.STABLE25
#./configure --prefix=/usr/local/squid \
--enable-arp-acl \
--enable-linux-netfilter \
--enable-pthreads \
--enable-err-language="Simplify_Chinese" \
--enable-default-err-language="Simplify_Chinese" \
--enable-underscores \
--disable-internal-dns \
--enable-pf-transparent \
--enable-referer-log
#make
#make install

注:--enable-internal-dns 做多个网站反向代理时使用,允许使用内部dns,也可改/etc/hosts.

也可以通过ports来安装

# cd /usr/ports/www/squid
#make install clean

这此用户组名squid将自动产生,无需手动创建

====================================================

二、初始化

#Linux命令
#adduser squid
#addgroup squid

#//freebsd命令
#pw groupadd squid
#pw useradd squid -g squid -s

#mkdir /usr/local/squid/var/cache

#mkdir /usr/local/squid/var/logs

#chown -R squid:squid /usr/local/squid/var/cache //默认nobody运行

#chown -R squid:squid /usr/local/squid/var/logs

#squid -z //初始化cache目录 #squid -zX 可查看初始化过程

在/etc/hosts中:加入内部的DNS解析,比如:

192.168.1.65 www.testsquid.com

三、配置/usr/local/squid/etc/squid.conf

#vim /usr/local/squid/etc/squid.conf

(4700多行配置….. 大多是注释,不管它,光标移到最后加入以下配置)

特别说明:
如果你用的是squid2.X的版本,可能需要修改下面的两项:
1.这里要把默认配置上面的"http_access deny all"这一项注释掉. 
2.如果squid用的端口为非80端口(如81)的话,需要在默认配置环境上面的Safe_port区域添加上"acl Safe_ports port 81" 这一行.不然会提示"Access Denied"错误,我就因为此问题搞好一个多星期才知道.

#==============================

# 主机名(3.0加入配置),无此项无法启动
visible_hostname www.testsquid.com

# 管理员邮箱,会显示在错误信息页面上,方便发生错误时联系!
cache_mgr root@localhost.localdomain

# 实现透明代理(squid2.7以上),其中vhost是必须的,这里的端口为squid监听的端口,默认为3128
http_port 192.168.1.65:80 vhost vport

# 缓存设置
cache_mem 256 MB
maximum_object_size_in_memory 2 MB

# 替换机制(lru叫做“最近不常用的单元”unit一般就是常说object, 也就是当 cache 中的内容比内存或硬盘达到上限时就需要进行数据的换进和换出工作)
memory_replacement_policy lru

# #设置cache_dir 缓存目录512M,其中一级目录16个,二级256个(每个一级下16个二级),第一个数字参数不能小于cache_mem设置的大小,否则会出警告“WARNING cache_mem is larger than total disk cache space!”。设置完了需用 squid -z来使cache目录生效。
cache_dir ufs /usr/local/squid/var/cache 512 16 256
max_open_disk_fds 0

#缓存内容大小控制,当cache目录被占用到97%时,内容将被清空20%
cache_swap_low 80
cache_swap_high 97

# 错误信息目录
error_directory /usr/local/squid/share/errors/Simplify_Chinese

# 最大和最小缓存对象
minimum_object_size 0 KB
maximum_object_size 30 MB

# 日志格式
logformat combined %>a %ui %un [%tl] "%rm %ru HTTP/%rv" %Hs %h" "%{User-Agent}>h" %Ss:%Sh
#logformat combined %>a %ui %un [%tl] "%rm %ru HTTP/%rv" %Hs %<st "%{Referer}>h" "%{User-Agent}>h" %Ss:%Sh 

设置access_log中日志存储的格式,access_log为客户端请求的日志
access_log /usr/local/squid/var/logs/page_zs_access_log combined

设置PID
pid_filename /usr/local/squid/var/logs/squid.pid

为squid自身的运行日志
cache_log /usr/local/squid/var/logs/cache.log

# 不记录store.log
cache_store_log none

# 指定代理服务器IP,2.5版本以上都是以cache_peer指定
# 需要将apache端口改成81(包括其虚拟机端口<这里最后补充说明>)
cache_peer 192.168.1.65 parent 81 0 no-query no-digest originserver name=www

squid2.5以上都是用的cache_peer来指定所需要代理的服务器的IP 这一点很重要!如果有多个虚拟主机,多写几行cache_peer_domain即可,参考:http://blog.haohtml.com/archives/5914.
cache_peer_domain www www.testsquid.com
cache_peer_access www allow all

# 允许客户端所有请求(这里可以设置拦截url,格式如下面两行缓存设置)
http_access allow all

# 设置不缓存url类型(空格隔开)
acl QUERY urlpath_regex .php .jsp .asp .pl .cgi
cache deny QUERY

#设置运行squid用户,一般不能以root运行
cache_effective_user squid
cache_effective_group squid
#设置清除squid缓存文件
acl AdminBoxes src 127.0.0.1 172.16.0.1 192.168.0.1
acl Purge method PURGE
http_access allow AdminBoxes Purge
http_access deny Purge

不显示/具体版本号
httpd_suppress_version_string off 

#==============================
四、创建缓存目录并启用squid

创建缓存目录

#/usr/local/squid/sbin/squid –z

启动squid

#/usr/local/squid/sbin/squid

停止squid:

#/usr/local/squid/sbin/squid -k shutdown

测试配置是否正确

# /usr/local/squid/sbin/squid -k parse

出现ERROR:

WARNING: Cannot write log file: /usr/local/squid/var/logs/cache.log
/usr/local/squid/var/logs/cache.log: Permission denied
messages will be sent to 'stderr'.
2008/03/13 12:53:09| Creating Swap Directories
FATAL: Failed to make swap directory /usr/local/squid/var/cache: (13) Permission denied

很明显权限不对,修改后测试通过!

使用新配置启动:

#/usr/local/squid/sbin/squid -k reconfigure

通过crontab每天0点截断/轮循日志:

0 0 * * * (/usr/local/squid/sbin/squid -k rotate)

可以用以下命令寻找已经缓存的文件

#cd /usr/local/squid/var/cache www.haohtml.com

#find -type f |xargs ls –l

五、通过衬时查看squid日志来观察squid效果

可以通过日志来对squid缓存文件来进行监控

#tail -f /usr/local/squid/var/logs/access.log

这样每当访问的时候,可以从这里看出来访问日志及读取时有没有通过后端Server的.

六、清除squid缓存

squidclient简要介绍(-h host参数这里没有指定,host为监听squid的ip地址)
*取得squid运行状态信息: squidclient -p 80 mgr:info
*取得squid内存使用情况: squidclient -p 80 mgr:mem
*取得squid已经缓存的列表: squidclient -p 80 mgr:objects. use it carefully,it may crash
*取得squid的磁盘使用情况: squidclient -p 80 mgr:diskd
*强制更新某个url:squidclient -p 80 -m PURGE http://www.haohtml.com/static.php
*更多的请查看:squidclient-h 或者 squidclient -p 80 mgr:

要清除一个缓存,执行命令

#./squidclient -m PURGE -h 192.168.1.65 -p 80 http://bbs.abc.com/index.htm
HTTP/1.0 200 OK
Server: squid/3.0.STABLE25
Mime-Version: 1.0
Date: Fri, 22 Jul 2011 19:55:57 GMT
Content-Length: 0
X-Cache: MISS from cnc12.34.56.78
Via: 1.0 cnc12.34.56.78 (squid/3.0.STABLE25)
Connection: close

可以看到返回的是200值的,说明发现缓存并清除成功,如果返回的是404的话,则说明没有发现缓存信息.对于返回值只有200和404(HTTP/1.0 404 Not Found)两种.

注意执行squidclient的时候一定要指明-h参数,我测试的时候发现如果指定为127.0.0.1的话,则提示403,权限不够的问题.不是太清楚什么原因.不知道是否与cache_peer后面的ip有关系的.

补充说明

端口使用情况:

apache 81

squid 80

这样设置的原因是方便squid直接拦截客户端发来的http请求。如果不更改apache默认的80端口,squid设置其他可用端口时,例如3128,需要将80请求转发到3128,否则用户可能直接通过域名+端口的形式访问到,这里为了安全禁止此访问方式.命令如下:

#iptables -t nat -A PREROUTING -s 192.168.1.65 -p tcp --dport 80 -j REDIRECT 3128

注:此命令必须每次开机后运行,可以写成开机执行任务脚本.其实还有一种简单的方法就是让81商品只监听127.0.0.1这个ip地址也可以的.

所以,本人感觉修改apache端口比较简单,修改步骤:

#vim /usr/local/apache/conf/httpd.conf

修改:Listen 81

如有虚拟主机设置,则还需要修改虚拟主机配置:

#vim /usr/local/apache/conf/extra/httpd-vhosts.conf

修改:NameVirtualHost *:81

五.启动squid

/usr/local/squid/sbin/squid -Nd1
ps aux |grep squid 查看是否启动

Squid开机自动启动
1.ports安装方法

编辑/etc/rc.conf文件,添加如下行:

squid_enable = “YES”

2.手动安装方法(参考:http://www.qudong.com/OS/FreeBSD/2009/0728/43717.html

vi /usr/local/etc/rc.d/squid.sh

#!/bin/sh

# if ! PREFIX=$(expr $0 : "\(/.*\)/etc/rc\.d/$(basename $0)\$"); then
#   echo "$0: Cannot determine the PREFIX" >&2
#   exit 1
# fi

case "$1" in
  start)
  if [ -x /usr/local/squid/sbin/squid -a -f /usr/local/squid/etc/squid.conf ]; then
    (cd /usr/local/squid/var/logs; /usr/local/squid/sbin/squid >/dev/null 2>&1 &) ; echo -n ' squid Start OK!'
  fi
  ;;
stop)
  /usr/local/squid/sbin/squid -k shutdown 2>&1
  # Uncomment this if you'd like the system to (attempt to
  # wait for) squid to shut down cleanly
  #echo "Sleeping for 45 seconds to allow squid to shutdown.."
  #sleep 45
  ;;
*)
  echo "Usage: `basename $0` {start|stop}" >&2
  ;;
esac

exit 0

这样每次启动后,squid就会自动运行,相关命令如下(这里用的默认的3128测试,以方便大家理解)。

#chmod +x squid.sh
#/usr/local/etc/rc.d/squid.sh start 启动squid
#netstat -an | grep 3128
#/usr/local/etc/rc.d/squid.sh stop 停止squid
#netstat -an | grep 3128 

六.测试访问WEB站点
本机hosts 文件指向squid代理服务器
出现ERROR:
Access Denied.
访问拒绝
Access control configuration prevents your request from being allowed at this time. Please contact your service provider if you feel this is incorrect.

当前的存取控制设定禁止您的请求被接受,如果您觉得这是错误的,请与您网路服务的提供者联系。
本缓存服务器管理员:webmaster

配置文件设置不对:
acl all src 0.0.0.0/0.0.0.0
http_access allow all

重新测试:OK 一切正常~~~查看相应日志

现在大家肯定急着要打开浏览器访问你的网站看看效果吧,其实没啥变化,要等到有流量访问,squid把文件都装到内存后,效果才明显。可以用top命令观察squid的内存使用情况或者用

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

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

总体来说,squid 配置不是很麻烦,主要是配置文件里的每一项,对服务器的产生的影响非常的重要。细节决定成功~

七,其它

squid默认情况下是不缓存一些动态扩展名的文件的,如php,jsp,cgi之类的,如果要缓存php文件的话,在文件头加入以下一行即可.

header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");

对于前面为squid,后端是php动态的,就算用了rewrite重写了url,由于php输出的时候没有指定这个修改日期标记,同样为TCP_MISS的.

参考:http://blog.haohtml.com/archives/10591http://www.haohtml.com/server/unix/46603.html

对于squid的安全设置请参考:http://www.haohtml.com/server/services/45325.html

对于squid日志文件详细请参考:http://blog.haohtml.com/archives/5901 和 http://blog.haohtml.com/archives/8081