web版清除squid缓存V1.0[原创]

一直以来蚊子就想解放自己,让想更新图片的人自己去刷新squid,然后看到图片的更新情况,现在终于实现了,我的第一版web方式刷新squid缓存的小应用诞生了,特别说明的是,这个版本的功能还非常的有限,每次只能清除一台squid上的一个url,不过蚊子坚信,之后我会逐渐完善这个小应用。

先来说说这个程序的实现原理吧。squid是用purge来清除缓存,purge是squid专有的一个http的header,默认情况下squid是禁止使用purge的,需要在squid.conf文件中进行配置才可以,配置方法如下

acl localhost src 127.0.0.1/32
acl purge method PURGE
http_access allow purge localhost
http_access deny purge

这样配置完之后就可以使用squidclient在squid本机进行清除缓存操作

squidclient –p port –m purge http_url

其实知道了清除squid缓存用的是purge header,那就可以通过telnet模仿squidclient命令了,方法如下

telnet 127.0.0.1 80
Trying 127.0.0.1…
Connected to localhost.localdomain (127.0.0.1).
Escape character is ‘^]’.
输入:
purge http://10.192.14.160/tupian/IMG_0303.JPG HTTP/1.0\r\n

回车后如果返回200 ok说明被刷新了,如果返回的是404 Not Found说明一开始就没缓存

蚊子的这个小应用基本就是遵照上面的这个原理实现的,程序的使用方法很容易,只需要lamp的环境就行,同时,需要授予运行purge_cache程序的机器有执行purge的权限,squid的配置方式和上面的基本相同

acl purge method PURGE
acl purge_host src ip/mask
acl localhost src 127.0.0.1/32
http_access allow purge localhost
http_access allow purge purge_host
http_access deny purge

其中purge_host是允许Purge Cache程序的机器的ip地址

下载了我的那个程序后,需要修改purge_cache.php文件中的

# 定义squid信息
define(“SQUID_HOST”        , “192.168.122.2”);  将这里的ip改成你实际的squid的ip地址
define(“SQUID_PORT”        , “80”);

上张截图吧:

程序可以到下载:http://ishare.iask.sina.com.cn/f/9517901.html

在使用的过程中如果大家有啥好的想法和建议,千万别不好意思说出来。

squid反向代理apache认证网站[技术]

今天蚊子在配置apache的authbasic认证,如果直接访问apache就始终可以验证通过,但只要通过squid访问就始终重复的让我输入用户名密码,后来google了一下,还真找到了解决办法,不过网上那个人用的是squid2.6,我用的squid3.0,不过经过蚊子测试,完全可以正常使用

解决方法就是:

在cache_peer的最后加上login=PASS参数,然后重启就行了。

squid3.0隐藏hearder设置[技术]

squid2.6可以使用header_access来控制显示与隐藏http的header信息,但是在squid3.0版本中这个参数是用不了的,所以如果要在3.0中隐藏http的header信息的话,就需要使用另外一个参数:reply_header_access

此参数的使用和header_access的类似,比如要隐藏VIA头信息,设置如下

reply_header_access Via deny all

如果需要隐藏其他的信息,可以参考上面的例子,把对应的header更改了就行,http的header信息如下

Accept                          HTTP_ACCEPT
Accept-Charset                          HTTP_ACCEPT-CHARSET
Accept-Encoding                         HTTP_ACCEPT-ENCODING
Accept-Language                         HTTP_ACCEPT-LANGUAGE
Accept-Ranges                           HTTP_ACCEPT-RANGES
Age                             HTTP_AGE
Allow                           HTTP_ALLOW
Authorization                           HTTP_AUTHORIZATION
Cache-Control                           HTTP_CACHE-CONTROL
Connection                              HTTP_CONNECTION
Content-Base                            HTTP_CONTENT-BASE
Content-Disposition                             HTTP_CONTENT-DISPOSITION
Content-Encoding                                HTTP_CONTENT-ENCODING
Content-Language                                HTTP_CONTENT-LANGUAGE
Content-Length                          HTTP_CONTENT-LENGTH
Content-Location                                HTTP_CONTENT-LOCATION
Content-MD5                             HTTP_CONTENT-MD5
Content-Range                           HTTP_CONTENT-RANGE
Content-Type                            HTTP_CONTENT-TYPE
Cookie                          HTTP_COOKIE
Date                            HTTP_DATE
ETag                            HTTP_ETAG
Expires                         HTTP_EXPIRES
From                            HTTP_FROM
Host                            HTTP_HOST
If-Match                        HTTP_IF-MATCH
If-Modified-Since               HTTP_IF-MODIFIED-SINCE
If-None-Match                   HTTP_IF-NONE-MATCH
If-Range                        HTTP_IF-RANGE
Last-Modified                   HTTP_LAST-MODIFIED
Link                            HTTP_LINK
Location                        HTTP_LOCATION
Max-Forwards                    HTTP_MAX-FORWARDS
Mime-Version                    HTTP_MIME-VERSION
Pragma                          HTTP_PRAGMA
Proxy-Authenticate              HTTP_PROXY-AUTHENTICATE
Proxy-Authentication-Info       HTTP_PROXY-AUTHENTICATION-INFO
Proxy-Authorization               HTTP_PROXY-AUTHORIZATION
Proxy-Connection                  HTTP_PROXY-CONNECTION
Public                                   HTTP_PUBLIC
Range                                  HTTP_RANGE
Referer                                 HTTP_REFERER
Request-Range                     HTTP_REQUEST-RANGE
Retry-After                           HTTP_RETRY-AFTER
Server                                  HTTP_SERVER
Set-Cookie                           HTTP_SET-COOKIE
Title                                    HTTP_TITLE
Transfer-Encoding               HTTP_TRANSFER-ENCODING
Upgrade                             HTTP_UPGRADE
User-Agent                       HTTP_USER-AGENT
Vary                                HTTP_VARY
Via                                 HTTP_VIA
Warning                         HTTP_WARNING
WWW-Authenticate                HTTP_WWW-AUTHENTICATE
Authentication-Info             HTTP_AUTHENTICATION-INFO
X-Cache                         HTTP_X-CACHE
X-Cache-Lookup                  HTTP_X-CACHE-LOOKUP
X-Forwarded-For                 HTTP_X-FORWARDED-FOR
X-Request-URI                   HTTP_X-REQUEST-URI
X-Squid-Error                   HTTP_X-SQUID-ERROR
Negotiate                       HTTP_NEGOTIATE
X-Accelerator-Vary              HTTP_X-ACCELERATOR-VARY
Other:                          HTTP_OTHER:

用php代码清空squid缓存下的指定文件[转]

PURGE 是一个特殊的HTTP请求方法。它是 Squid 的专有方法,没有在任何RFC 里定义。它让管理员能强制删除缓存对象。既然该方法有些危险,squid 默认拒绝PURGE 请求,除非你定义了ACL 引用了该方法。否则,任何能访问cache 者也许能够删除任意缓存对象。我推荐仅仅允许来自localhost 的PURGE:
acl Purge method PURGE
acl Localhost src 127.0.0.1
http_access allow Purge Localhost
http_access deny Purge (squid.conf摘要)

以下是使用purge删除指定文件的两个函数:

这样只需要在代码里使用 purgeFile(’/xxx.gif’);即可将上述两个服务器中指定的路径文件缓存删除。

原帖:http://hi.baidu.com/farmerluo/blog/item/65194710ca8780f4c2ce794b.html

关于动态内容前是否加载squid服务器的想法[原创]

今天在回家的路上想了这样的一个问题,这个问题也是我曾经面试的时候,那个公司的技术总监问我的问题,但当时我不知道如何作答。问题是:在动态内容前是否还有必要加squid服务器。

squid在静态文件的缓存加速方面还是很强大的,但如果应用都是动态的内容,有没有squid就两可了,很多人都是这样认为的。我是这样想的,web服务比如apahce带有keepalive参数,当这个参数打开的时候,apache出来完客户端的请求,是不会马上关闭这次的tcp连接的,当超过了设置的keepalive超时时间的时候,这次的tcp连接才会断开,这样做的好处就是可以在一次的tcp会话中完成多次请求。当apache直接对外提供服务的时候,apache面对的是所有的client,假如有10个不同ip的客户端发起请求,apache就会建立起10个tcp的连接提供服务,当这个10个客户端的这次访问完毕之后,这10个tcp连接并不会断开,而是继续保持状态,假如这10个客户端在超时时间内都没有再提交请求,那这10个tcp连接的资源就是浪费并成为了负担。
如果在apache前端加上了squid,这样apache看到的客户端始终就是一个,那就是squid,这样apache和squid建立连接后,不会因为真实客户端ip的变化而导致apache上tcp连接的浪费,这样无形当中提高了tcp的复用率,提高了性能。当然有人会说,在squid层面上的压力会增大,tcp的利用率会降低。我认为,squid自从2.6的发展以来,性能的提升还是很可观的,加入了很多实用的元素,比如负载均衡,使用效率更高的epoll,而且squid使用文件描述符,对于单台squid来说,跑到占用了6w文件描述符基本没什么问题。
当然以上只是apache前加squid的做法,你仍然可以使用负载均衡设备替代squid达到同样的效果,我想法的目的,就是充分的利用apache的keepalive参数,提高tcp复用率。

以上只是本人的一些想法,欢迎各位高手拍砖,想的不对的地方还望指出,谢谢

lvs+HA+squid搭建稳定上网服务[原创]

今天有人在群里喊谁做过lvs+squid,正好以前做过一个,我就把过程整理下来,供大家参考。首先看看拓扑图如下
说下我写这篇文章所用的测试环境,vmvare6.0,模拟两个linux,用的是centos5.1
squid-1(192.168.211.128)
squid-2(192.168.211.130)
Vip(192.168.211.135)
实现方式lvs-dr
1,lvs配置部分
安装lvs所需要的软件

yum -y install heartbeat

yum y install heartbeatldirectord

yum -y install heartbeat-devel

yum y install ipvsadm

配置Ldirector
vi /etc/ha.d/ldirectord.cf设置如下内容,两台机器文件内容相同

# Global Directives

checktimeout=3

checkinterval=1

autoreload=yes

logfile=“/var/log/ldirectord.log”

logfile=“local0”

#emailalert=“admin@x.y.z”

#emailalertfreq=3600

#emailalertstatus=all

quiescent=yes

# Sample for an http virtual service

virtual=192.168.211.135:3128

real=192.168.211.128:3128 gate

real=192.168.211.130:3128 gate

scheduler=rr

#persistent=600

#netmask=255.255.255.255

protocol=tcp

checktype=negotiate

checkport=3128

配置heartbeat

vi /etc/ha.d/ha.cf

debugfile /var/log/ha-debug

logfile /var/log/ha-log

logfacility local0

keepalive 2

deadtime 30

warntime 10

initdead 120

udpport 694

ucast eth0 192.168.211.130 #另外一台这里要设置成另外的ip

auto_failback on

node contos5-1-1 #通过uanme -n得到

node contos5-1-2

ping_group group1 192.168.211.128 192.168.211.130

respawn hacluster /usr/lib/heartbeat/ipfail

这里之所以使用ucast而不用bcast是因为,如果同网段你还有另外的一套lvs的话,bcast广播也会发到这套lvs里,虽说应用上不会给另外一套lvs带来影响,但日志里会出现很多错误

cp /usr/share/doc/heartbeat-2.1.3/authkeys /etc/ha.d/

vi /etc/ha.d/authkeys,将如下两行的注释去掉

# crc adds no security , except from packet corruption.

# Use only on physically secure networks.

#

auth 1

1 crc

#2 sha1

#3 md5

chomd 600 /etc/ha.d/authkeys

vi /etc/ha.d/haresources文件,加入

contos5-1-1 closelo 192.168.211.135 ldirectord::ldirectord.cf startlo

在/etc/ha.d/resource.d下建立closelo脚本,内容如下

#!/bin/sh

VIP=192.168.211.135

case “$1” in

start)

# close lo:0 interface

echo $“Close lo:0 interface”

/sbin/route del -host $VIP dev lo:0

/sbin/ifconfig lo:0 down

echo “0” > /proc/sys/net/ipv4/conf/all/arp_announce

echo “0” > /proc/sys/net/ipv4/conf/all/arp_ignore

echo “0” > /proc/sys/net/ipv4/conf/lo/arp_announce

echo “0” > /proc/sys/net/ipv4/conf/lo/arp_ignore

;;

stop)

# start lo:0 interface

echo $“Start lo:0 interface”

/sbin/ifconfig lo:0 $VIP/32 broadcast $VIP up

/sbin/route add -host $VIP dev lo:0

echo “2” > /proc/sys/net/ipv4/conf/all/arp_announce

echo “1” > /proc/sys/net/ipv4/conf/all/arp_ignore

echo “2” > /proc/sys/net/ipv4/conf/lo/arp_announce

echo “1” > /proc/sys/net/ipv4/conf/lo/arp_ignore

;;

*)

echo $“Usage: $0 (start|stop)”

exit 1

;;

esac

/etc/ha.d/resource.d下建立startlo脚本

# ! /bin/sh

VIP=192.168.211.135

case “$1” in

stop)

# close lo:0 interface

echo $“Close lo:0 interface”

/sbin/route del host $VIP dev lo:0

/sbin/ifconfig lo:0 down

echo “0” > /proc/sys/net/ipv4/conf/all/arp_announce

echo “0” > /proc/sys/net/ipv4/conf/all/arp_ignore

echo “0” > /proc/sys/net/ipv4/conf/lo/arp_announce

echo “0” > /proc/sys/net/ipv4/conf/lo/arp_ignore

; ;

start)

# start lo:0 interface

echo $“Start lo:0 interface”

/sbin/ifconfig lo:0 $VIP/32 broadcast $VIP up

/sbin/route add host $VIP dev lo:0

echo “2” > /proc/sys/net/ipv4/conf/all/arp_announce

echo “1” > /proc/sys/net/ipv4/conf/all/arp_ignore

echo “2” > /proc/sys/net/ipv4/conf/lo/arp_announce

echo “1” > /proc/sys/net/ipv4/conf/lo/arp_ignore

; ;

* )

echo $“Usage: $0 (start|stop)”

exit 1

; ;

esac

到此,lvs部分就全部完成了,接下来说squid的设置,具体配置我就不写了,网上这方面的文章很多,我仅仅完成一个可以做正向代理的出来

squid我使用的是3.0stable8
./configure –prefix=/usr/local/squid
make && make install
完成安装后,配置文件内容如下

visible_hostname 2

acl manager proto cache_object

acl localhost src 127.0.0.1/32

acl to_localhost dst 127.0.0.0/8

acl localnet src 10.0.0.0/8 # RFC1918 possible internal network

acl localnet src 172.16.0.0/12 # RFC1918 possible internal network

acl localnet src 192.168.0.0/16 # RFC1918 possible internal network

acl SSL_ports port 443

acl Safe_ports port 80 # http

acl Safe_ports port 21 # ftp

acl Safe_ports port 443 # https

acl Safe_ports port 70 # gopher

acl Safe_ports port 210 # wais

acl Safe_ports port 1025-65535 # unregistered ports

acl Safe_ports port 280 # http-mgmt

acl Safe_ports port 488 # gss-http

acl Safe_ports port 591 # filemaker

acl Safe_ports port 777 # multiling http

acl CONNECT method CONNECT

acl purge method PURGE

http_access allow manager localhost

http_access deny manager

http_access deny !Safe_ports

http_access deny CONNECT !SSL_ports

http_access allow purge localhost

http_access allow localnet

http_access deny all

icp_access allow localnet

icp_access deny all

htcp_access allow localnet

htcp_access deny all

#always_direct allow all

#http_port 80 accel vhost vport

http_port 3128

hierarchy_stoplist cgi-bin ?

access_log /usr/local/squid/var/logs/access.log squid

cache_dir ufs /usr/local/squid/cache 10 2 4

refresh_pattern ^ftp: 1440 20% 10080

refresh_pattern ^gopher: 1440 0% 1440

refresh_pattern (cgi-bin|?) 0 0% 0

refresh_pattern . 0 20% 4320

cache_effective_user squid

cache_effective_group squid

然后启动squid,接下来就可以测试了,到此一个可用的而且强健的双机squid就完成了(除非两台机器同时挂掉)

注:每次启动heartbeat前,请先执行 /etc/ha.d/resource.d/closelo脚本,使得lo:o网卡启动,不然这套配置将不起作用了,我目前还没有找到更好的解决办法

如对以上配置有何不明了的还请提出共同讨论

squid3.0泛域名的实现[原创]

squid的安装配置我就不详细介绍了,网上相关的文章很多,我主要来说说我是如何实现用squid3.0实现泛域名的,我使用的是squid 3.0stable9版本
安装配置好squid后在squid的中添加如下几行

http_port 80 transparent或者http_port 80 accel vhost vport

cache_peer 192.168.0.10 parent 80 0 no-query originserver name=web
cache_peer_domain web .abc.com

然后保存退出

之后重启squid,接下来就可以用ie进行测试了

squid中cache_peer的sibling用法[原创]

提高squid命中率和使用效率是每个系统管理员都希望的一件事,毕竟在现有资源中榨干每一份的资源是必须滴,使用nginx的按url做定向投递,自然能提高squid的命中和效率,但毕竟公司目前没有这个条件,这个自然没法子实施,我就想到了另外的一个方法,就是今天的主角,cache_peer中的sibling。

先说说我的思路

如果有5台squid,每台的缓存空间是10G,估计每台能缓存静态文件110W个,如果前端放置f5或其他负载均衡设备,把所有请求的url都采用轮询的方式投递给squid,那最终每台squid上缓存住的静态文件几乎都是相同的,对于一个中小型的网站来说110W量的静态文件已经几乎是所有的静态文件了,但对于以在线漫画,或者图片为服务的网站来讲,静态文件将远远不止这个数量。

如果能让每台squid上缓存的都是独立的静态文件,那这组服务器所能缓存的文件将是原来能力的5倍,当然,前面提到了nginx的按url做定向投递可以解决这个问题,但这不是我要说的重点,其实用squid自己的堆叠就可以实现了,即cache_peer里的sibling

sibling是通过icq向同伴squid发送请求,一旦在同伴squid中发现了缓存命中,则由这个缓存命中返回给客户端,如果没有发现则到parent的squid去拿或者到realserver去拿

有了这个概念那就是说如果http://www.aaa.ccc/a.jpg发送过来了,如果a上没有,就会到b上找,如果有就反给客户端,如果没有会再去c上找如果最后都没有由a到后端parent或者realserver上取

下面看一个例子,我用vmware模拟了两个linux,上面分别跑了一个squid,

a上的配置,a的ip:192.168.220.128

icp_port 3130

icp_access allow all

cache_peer 61.152.242.1 parent 80 0 no -query originserver name=www2
cache_peer_domain www2 www.tgbus.com

b上的配置,b的ip:192.168.220.130

icp_port 3130

icp_access allow all

cache_peer 192.168.220.128 sibling 80 3130 proxy -only name=cache
cache_peer 61.152.242.1 parent 80 0 no -query originserver name=www2
cache_peer_domain cache www.tgbus.com
cache_peer_domain www2 www.tgbus.com

测试

修改本机本机hosts,先把www.tgbus.com指向到192.168.220.128上访问一遍,让220.128上有一份静态的缓存
然后把www.tgbus.com指向到192.168.220.130上,然后访问,可以看下两台机器上的日志
a的

1233463229.874 0 192.168.220.130 UDP_MISS/000 42 ICP_QUERY http: / /www.tgbus.com/ - NONE / - -
1233463231.555 0 192.168.220.130 UDP_HIT/000 51 ICP_QUERY http: / /www.tgbus.com/style.css - NONE / - -
1233463231.557 0 192.168.220.130 TCP_IMS_HIT/304 210 GET http: / /www.tgbus.com/style.css - NONE / - text /css
1233463231.596 0 192.168.220.130 UDP_MISS/000 67 ICP_QUERY http: / /www.tgbus.com/index/domain/Images/3.jpg - NONE / - -
1233463231.602 0 192.168.220.130 UDP_HIT/000 59 ICP_QUERY http: / /www.tgbus.com/images/v3/lqs.jpg - NONE / - -
1233463231.603 0 192.168.220.130 UDP_MISS/000 67 ICP_QUERY http: / /www.tgbus.com/index/domain/Images/4.jpg - NONE / - -
1233463231.605 0 192.168.220.130 TCP_IMS_HIT/304 212 GET http: / /www.tgbus.com/images/v3/lqs.jpg - NONE / - image/jpeg
1233463231.609 0 192.168.220.130 UDP_HIT/000 67 ICP_QUERY http: / /www.tgbus.com/index/tvgame/images/1.jpg - NONE / - -
1233463231.612 0 192.168.220.130 TCP_IMS_HIT/304 212 GET http: / /www.tgbus.com/index/tvgame/images/1.jpg - NONE / - image/jpeg
1233463231.615 0 192.168.220.130 UDP_HIT/000 67 ICP_QUERY http: / /www.tgbus.com/index/tvgame/images/2.jpg - NONE / - -
1233463231.618 0 192.168.220.130 TCP_IMS_HIT/304 212 GET http: / /www.tgbus.com/index/tvgame/images/2.jpg - NONE / - image/jpeg
1233463231.619 0 192.168.220.130 UDP_HIT/000 67 ICP_QUERY http: / /www.tgbus.com/index/tvgame/images/4.jpg - NONE / - -
1233463231.619 0 192.168.220.130 UDP_HIT/000 58 ICP_QUERY http: / /www.tgbus.com/images/v3/mc.jpg - NONE / - -
1233463231.623 1 192.168.220.130 TCP_IMS_HIT/304 212 GET http: / /www.tgbus.com/index/tvgame/images/4.jpg - NONE / - image/jpeg
1233463231.623 1 192.168.220.130 TCP_IMS_HIT/304 212 GET http: / /www.tgbus.com/images/v3/mc.jpg - NONE / - image/jpeg

b的

1233490583.540 269 192.168.220.1 TCP_MISS/200 57811 GET http: / /www.tgbus.com/ - FIRST_UP_PARENT/www2 text /html
1233490585.753 3 192.168.220.1 TCP_MISS/304 271 GET http: / /www.tgbus.com/style.css - SIBLING_HIT/cache text /css
1233490585.845 5 192.168.220.1 TCP_MISS/304 273 GET http: / /www.tgbus.com/images/v3/lqs.jpg - SIBLING_HIT/cache image/jpeg
1233490585.857 5 192.168.220.1 TCP_MISS/304 273 GET http: / /www.tgbus.com/index/tvgame/images/1.jpg - SIBLING_HIT/cache image/jpeg
1233490585.862 4 192.168.220.1 TCP_MISS/304 273 GET http: / /www.tgbus.com/index/tvgame/images/2.jpg - SIBLING_HIT/cache image/jpeg
1233490585.868 5 192.168.220.1 TCP_MISS/304 273 GET http: / /www.tgbus.com/index/tvgame/images/4.jpg - SIBLING_HIT/cache image/jpeg
1233490585.868 5 192.168.220.1 TCP_MISS/304 273 GET http: / /www.tgbus.com/images/v3/mc.jpg - SIBLING_HIT/cache image/jpeg
1233490585.871 4 192.168.220.1 TCP_MISS/304 273 GET http: / /www.tgbus.com/index/tvgame/images/3.jpg - SIBLING_HIT/cache image/jpeg
1233490585.873 3 192.168.220.1 TCP_MISS/304 273 GET http: / /www.tgbus.com/index/tvgame/images/5.jpg - SIBLING_HIT/cache image/jpeg
1233490585.885 4 192.168.220.1 TCP_MISS/304 272 GET http: / /www.tgbus.com/Images/v3/hot.gif - SIBLING_HIT/cache image/gif
1233490585.907 3 192.168.220.1 TCP_MISS/304 272 GET http: / /www.tgbus.com/Images/v3/tvgame.gif - SIBLING_HIT/cache image/gif
1233490585.943 3 192.168.220.1 TCP_MISS/304 272 GET http: / /www.tgbus.com/Images/v3/league.gif - SIBLING_HIT/cache image/gif
1233490586.382 555 192.168.220.1 TCP_MISS/304 292 GET http: / /www.tgbus.com/index/domain/Images/3.jpg - FIRST_UP_PARENT/www2 -
1233490586.477 11 192.168.220.1 TCP_MISS/304 273 GET http: / /www.tgbus.com/index/comic/images/manhua01.jpg - SIBLING_HIT/cache image/jpeg
1233490586.479 11 192.168.220.1 TCP_MISS/304 273 GET http: / /www.tgbus.com/index/comic/images/manhua02.jpg - SIBLING_HIT/cache image/jpeg
1233490586.479 11 192.168.220.1 TCP_MISS/304 273 GET http: / /www.tgbus.com/index/comic/images/manhua03.jpg - SIBLING_HIT/cache image/jpeg

由上面可以看到,在b上tcp_miss的大部分在a上都是sibling_hit的,这样说来,我的想法还是成立的,可以达到提高squid命中与效率,增大缓存容量的作用

使用nginx的url_hash提高squid的使用率[原创]

上次我说了使用squid自己的堆叠机制实现提高squid使用率的方法,这次再来说说和nginx搭配使用提高多台squid的使用率,目标当然是使用有限的squid服务器,缓存住更多的静态文件。

首先进到nginx的目录
执行patch -p0 < /path/to/upstream/hash/directory/nginx.patch

然后在安装的时候加上
–add-module=path/to/upstream/hash/directory

我的测试环境vmvare 模拟3个linux
ip分别:nginx 192.168.211.130
squid01 192.168.211.128
squid02 192.168.211.129
测试网站我反向代理www.tgbus.com

这样nginx上编译完成需要配置,内容如下

http {

upstream www.tgbus.com {
server 192.168.211.128;
server 192.168.211.129;
hash $request_uri;
}
server {
listen 80;
server_name www.tgbus.com;
location / {
proxy_pass http: / /bbs.tgbus.com;
}
}
}

然后启动nginx

两个squid就配置成标准的反向代理就可以了,主要配置如下

cache_peer 61.152.242.1 parent 80 0 no -digest no -query originserver name=www
cache_peer_domain www www.tgbus.com

然后启动squid

修改自己电脑的hosts,把www.tgbus.com的ip指向到nginx那台虚拟机的ip上,接下来就可以测试了
打开两台squid的日志,用tail -f的方式,然后访问www.tgbus.com,可以看到两边的日志的内容是不一样的,从其中一台squid的日志中找一条静态文件的url,通过ie 打开,可以发现,这个url的访问只投到同一台squid上,如此实现了,squid缓存的内容不同,从而增加了squid的缓存容量
当然,如果中间只使用一台nginx,自然这台会成为单点而造成隐患,所以可是使用heartbeat做成双机,增加系统的可靠性。

(更新版)通过脚本人为有选择性的更新squid的cache

squid 缓存文件的格式是DBase 3 data file,使用cat命令虽然也是可以看到里面的内容的,但格式混乱,如果想取出我们需要的东西,相对来说比较的麻烦,linux下有个stings命令,这条命令可以显示可打印的文本,这样,对cache文件进行stings的话,就可以把文本的部分显示出来了,而且每条记录是一行,这样一来,让我想到了以前我在张宴那个脚本基础上进行修改后的脚本就又可以进行第二次的改良了,下面我就把改良的内容写出如下
 
先看下原始cache文件的内容
再看看用stings转换后的内容

脚本文件名:clear_squid_cache.sh

注意:请赋予clear_squid_cache.sh可执行权限(命令:chmod +x ./clear_squid_cache.sh)。请确保脚本所在目录可写。

设置:
  squidcache_path= 表示squid缓存目录的路径
  squidclient_path= 表示squidclient程序所在的路径,默认为squid安装目录下的bin/squidclient
用法:
  1、清除所有Flash缓存(扩展名.swf):
  ./clear_squid_cache.sh swf

  2、清除URL中包含sina.com.cn的所有缓存:
  ./clear_squid_cache.sh sina.com.cn

  3、清除文件名为/images/的所有缓存:
  ./clear_squid_cache.sh /images/

如果对于频繁更新的gif或者什么,可以在crontab中添加对应的命令行
0 * * * * /usr/local/bin/clear_squid_cache.sh gif &
这样就会每隔一个小时进行一次刷新操作了,很是方便
如果需要让图片更新人员自行刷新的话,就可以找相应的人员开发web页面,进行对脚本的调用就可以了
 

注:以上cache内容摘取自squid3.0,2.x版本是否可以使用还请各位验证,总之3.0使用这个脚本后,准确率已经基本能达到100%了,对于以前有了很大程度的提高

原始脚本请参考张宴blog