一、squid及web缓存介绍
Squid是一种用来缓冲Internet数据的软件。它是这样实现其功能的,接受来自人们需要下载的目标(object的请求并适当地处理这些请求。也就是说,如果一个人想下载一web页面,他请求Squid为他取得这个页面。Squid随之连接到远程服务器(比如:http://squid.nlanr.net/)并向这个页面发出请求。然后,Squid将web端得到的数据转发给客户端机器,而且同时复制一份,当下一次有人需要同一页面时,Squid可以简单地从磁盘中读到它,那样数据迅即就会传输到客户机上。当前的Squid可以处理HTTP,FTP,GOPHER,SSL和WAIS等协议。但它不能处理如POP,NNTP,RealAudio以及其它类型的东西。
cache命中在squid每次从它的缓存里满足HTTP请求时发生。cache命中率,是所有HTTP请求中命中的比例。Web缓存典型的cache命中率在30%到60%之间。另一个相似的度量单位叫做字节命中率,描绘了cache提供服务的数据容量(字节数)。
cache丢失在squid不能从它的缓存里满足HTTP请求时发生。cache丢失的理由有很多种。最明显的,当squid第一次接受到对特殊资源的请求时,就是一个cache丢失。类似的情况是,squid会清除缓存以释放空间给新对象。另外的可能是资源不可到达。原始服务器会指示cache怎样处理响应。例如,它会提示数据不能被缓存,或在有限的时间内才被重复使用,等等。
cache确认保证squid不对用户返回过时数据。在重复使用缓存对象时,squid经常从原始服务器确认它。假如服务器指示squid的拷贝仍然有效,数据就发送出去。否则,squid升级它的缓存拷贝,并且转发给客户。
二、系统环境
两台web缓存服务器安装CentOS 5.8+squid+memcached,分别命名为squid_cache1和squid_cache2。Squid对于后端的web服务器没有要求,可以是IIS,也可以是apache或是其他的。缓存前端可以有一层负载均衡,如果是LVS的话,那么两台缓存服务器都需要绑定VIP。
Squid_cache1:
Ip:192.168.0.149
子网掩码:255.255.255.0
默认网关:192.168.0.1
Squid_cache2:
Ip:192.168.0.150
子网掩码:255.255.255.0
默认网关:192.168.0.1
三、安装前的准备工作
1、关闭SELinux
查看SELinux的状态
getenforce
如果是开启状态,则
vi /etc/selinux/config
1.SELINUX=disabled #修改 2.#SELINUXTYPE=targeted #注释掉 重启系统
reboot
2.优化内核参数
vi /etc/sysctl.conf # 编辑sysctl.conf文件添加以下内容
1.net.ipv4.tcp_rmem = 4096 87380 4194304 2.net.ipv4.tcp_wmem = 4096 65536 4194304 3.net.core.wmem_default = 8388608 4.net.core.rmem_default = 8388608 5.net.core.rmem_max = 16777216 6.net.core.wmem_max = 16777216 7.net.core.netdev_max_backlog = 262144 8.net.core.somaxconn = 262144 9.net.ipv4.tcp_max_orphans = 3276800 10.net.ipv4.tcp_max_syn_backlog = 8192 11.net.ipv4.tcp_max_tw_buckets = 5000 12.net.ipv4.tcp_timestamps = 0 13.net.ipv4.tcp_synack_retries = 1 14.net.ipv4.tcp_syn_retries = 1 15.net.ipv4.tcp_tw_recycle = 1 16.net.ipv4.tcp_tw_reuse = 1 17.net.ipv4.tcp_mem = 786432 1048576 1572864 18.net.ipv4.tcp_fin_timeout = 30 19.net.ipv4.tcp_keepalive_time = 1200 20.net.ipv4.ip_local_port_range = 1024 65000 以上配置说明:
net.ipv4.tcp_rmem = 4096 87380 4194304:TCP读buffer,可参考的优化值: 32768 436600 873200
net.ipv4.tcp_wmem = 4096 65536 4194304:TCP写buffer,可参考的优化值: 8192 436600 873200
net.core.wmem_default:表示发送套接字缓冲区大小的缺省值(以字节为单位)
net.core.rmem_default:表示接收套接字缓冲区大小的缺省值(以字节为单位)
net.core.rmem_max :表示接收套接字缓冲区大小的最大值(以字节为单位)
net.core.wmem_max:表示发送套接字缓冲区大小的最大值(以字节为单位)
net.core.netdev_max_backlog = 262144:每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目。
net.core.somaxconn = 262144:web应用中listen函数的backlog默认会给我们内核参数的net.core.somaxconn限制到128,而nginx定义的NGX_LISTEN_BACKLOG默认为511,所以有必要调整这个值。
net.ipv4.tcp_max_orphans = 3276800:系统中最多有多少个TCP套接字不被关联到任何一个用户文件句柄上。
net.ipv4.tcp_max_syn_backlog = 8192:表示SYN队列的长度,默认为1024,加大队列长度为8192,可以容纳更多等待连接的网络连接数。
net.ipv4.tcp_max_tw_buckets = 5000:表示系统同时保持TIME_WAIT套接字的最大数量,如果超过这个数字,TIME_WAIT套接字将立刻被清除并打印警告信息。减少它的最大数量,避免Squid服务器被大量的TIME_WAIT套接字拖死。
net.ipv4.tcp_timestamps = 0:时间戳可以避免序列号的卷绕。一个1Gbps的链路肯定会遇到以前用过的序列号,时间戳能够让内核接受这种“异常”的数据包,这里需要将其关掉。
net.ipv4.tcp_tw_recycle = 1:表示开启TCP连接中TIME-WAIT sockets的快速回收。
net.ipv4.tcp_tw_reuse = 1:表示开启重用,允许将TIME-WAIT sockets重新用于新的TCP连接。
net.ipv4.tcp_mem = 786432 1048576 1572864:同样有3个值,net.ipv4.tcp_mem[0]:低于此值,TCP没有内存压力;net.ipv4.tcp_mem[1]:在此值下,进入内存压力阶段;net.ipv4.tcp_mem[2]:高于此值,TCP拒绝分配socket。可根据物理内存大小进行调整,如果内存足够大的话,可适当往上调。建议94500000 915000000 927000000。
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。
使配置立即生效:
/sbin/sysctl -p
3.关闭系统无关的服务
接下来关掉一些不必要的系统服务
chkconfig bluetooth off
chkconfig firstboot off
chkconfig cups off
chkconfig ip6tables off
chkconfig isdn off
chkconfig kudzu off
chkconfig sendmail off
chkconfig smartd off
chkconfig autofs off
停止apache服务
service httpd stop
建议卸载掉apache
4.修改文件描述符限制
(1)修改用户级限制
ulimit -n #查看当前用户的文件描述符的限制数目
ulimit -HSn 4096 #修改当前shell环境文件描述符的限制数目
永久修改用户的文件描述符的限制
vi /etc/security/limits.conf #编辑limits.conf文件,添加以下两行
1.* hard nofile 4096 2.* soft nofile 4096 (2)修改系统级限制
vi /usr/include/bits/typesizes.h #编辑typesizes.h文件找到以下行将1024改为4096
1.#define __FD_SETSIZE 4096 vi /usr/include/linux/posix_types.h #编辑posix_types.h文件找到以下行将1024改为4096
1.#define __FD_SETSIZE 4096 注:刚才编辑的这两个文件是C/C++程序里面的头文件,编译squid的时候会被自动引用。只需要修改其数值,前面的#号不要去掉。
cat /proc/sys/fs/file-max #查看系统级的文件描述符的限制数目
如果小于4096,则执行下面语句,大于4096则跳过此步骤
echo 4096 > /proc/sys/fs/file-max
5.优化TCP/IP栈分配给出去连接的本地端口范围
netstat -n | grep TIME_WAIT #查看当前有多少个出去的连接
cat /proc/sys/net/ipv4/ip_local_port_range #查看分配的本地端口范围
echo "1024 65000" > /proc/sys/net/ipv4/ip_local_port_range #修改端口范围
vi /etc/rc.d/rc.local #编辑rc.local文件使其开机生效
1.echo "1024 65000" > /proc/sys/net/ipv4/ip_local_port_range 注:以上端口范围可根据自己网站的实际情况进行更改
6.配置时间同步
yum install ntp
crontab –e
在最后添加
1.1 5 * * * /usr/sbin/ntpdate time.nist.gov 7.开启防火墙80端口
vi /etc/sysconfig/iptables #添加一条规则
1.-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT service iptables restart #重启防火墙使配置生效
8.下载软件
cd /usr/local/src
wget http://cloud.github.com/downloads/libevent/libevent/libevent-2.0.19-stable.tar.gz
wget http://memcached.googlecode.com/files/memcached-1.4.13.tar.gz
wget http://www.squid-cache.org/Versions/v3/3.1/squid-3.1.20-20120610-r10455.tar.gz
9.安装编译工具
yum -y install gcc gcc-c++
四、安装配置memcached
1.安装libevent
tar -zxvf libevent-2.0.19-stable.tar.gz
cd libevent-2.0.19-stable
./configure --prefix=/usr/
make && make install
注:如果 libevent 不是安装在/usr目录下,那么需要把libevent-1.2a.so.1拷贝或链接到/usr/lib中,否则memcached无法正常加载。
2.安装memcached
tar -zxvf memcached-1.4.13.tar.gz
cd memcached-1.4.13
./configure --prefix=/usr/local/memcached --with-libevent=/usr/
make && make install
3.启动memcached
/usr/local/memcached/bin/memcached -l 192.168.0.149 -d -p 11211 -u nobody -m 128
4.配置memcached开机启动
vi /etc/rc.d/rc.local
在最后添加
1./usr/local/memcached/bin/memcached -l 192.168.0.149 -d -p 11211 -u nobody -m 128 五、安装配置squid
1.安装squid
tar -zxvf squid-3.1.20-20120610-r10455.tar.gz
cd squid-3.1.20-20120610-r10455
./configure --prefix=/usr/local/squid --enable-async-io=100 --disable-delay-pools --disable-mem-gen-trace --disable-useragent-log --enable-kill-parent-hack --disable-arp-acl --enable-epoll --disable-ident-lookups --enable-snmp --enable-large-cache-files --with-large-files
make && make install
2.创建squid相关目录
groupadd squid #创建squid用户组
useradd -g squid -s /sbin/nologin squid #创建squid用户,并加入到squid组里,不允许登录系统
chown -R squid /usr/local/squid/ #修改squid的安装目录所属用户为squid用户
mkdir -p /var/cache #创建squid的第一个缓存目录
mkdir -p /var/squid #创建squid的第二个缓存目录
chown squid.squid -R /var/cache /var/squid #设置目录所有者
chmod -R 777 /var/cache /var/squid #设置目录权限
3.配置squid
将squid的初始配置文件备份,我们要重新创建配置文件
mv /usr/local/squid/etc/squid.conf /usr/local/squid/etc/squid.conf.bak
vi /usr/local/squid/etc/squid.conf
1.cache_effective_user squid
#运行squid的用户
2.cache_effective_group squid
#运行squid的用户所在的组
3.visible_hostname squid
1.cache.cn #设定squid的主机名,如无此项squid将无法启动
4.http_port 80 accel vhost vport #代理端口
5.icp_port 3130 #icp端口
6.# 配置其他缓存服务器,当squid1在其缓存中没有找到请求的资源时,通过ICP查询去其邻居中取得缓存
7.cache_peer 192.168.0.150 sibling 80 3130
8.# 后端web服务器配置,round-robin表示通过轮询方式将请求分发到其中一台web节点
9.cache_peer 192.168.0.108 parent 80 0 no-query originserver round-robin name=webServer1
10.cache_peer 192.168.0.109 parent 80 0 no-query originserver round-robin name=webServer2
11.cache_peer 192.168.1.115 parent 80 0 no-query originserver round-robin name=webServer3
12.cache_peer_domain webServer1 webServer2 webServer3 .xuad.com #根据通配域名xuad.com来进行转发
13.# 下面三行是配置访问控制的
14.acl localnet src 192.168.0.149 192.168.0.150 #配置同级代理服务器IP段
15.http_access allow all #允许以上所有规则通过
16.icp_access allow localnet #允许localnet规则通过
17.# URL中包含cgi-bin和以https:\\开头的都不缓存,asp、cgi、php、jsp等动态页面也不缓存
18.hierarchy_stoplist cgi-bin ?
19.hierarchy_stoplist -i ^https:\\ ?
20.acl QueryString urlpath_regex -i cgi-bin \? \.asp \.php \.jsp \.cgi
21.acl denyssl urlpath_regex -i ^https:\\
22.no_cache deny QueryString
23.no_cache deny denyssl
24.# 日志和缓存目录的设置
25.cache_log /usr/local/squid/var/logs/cache.log #cache.log日志文件存放目录
26.access_log /usr/local/squid/var/logs/access.log squid #access.log日志文件存放目录
27.cache_dir aufs /var/cache 1024 16 256 #设定缓存目录cache,目录容量最大1024M,16*256级子目录
28.cache_dir aufs /var/squid 3072 16 256 #设定缓存目录squid,目录容量最大3072M,16*256级子目录
29.cache_mem 128 MB #squid用于缓存的内存容量
30.# 当缓存目录空间使用达到95%以上时,新的内容将取代旧的内容,直到空间又下降到90%才停止这一活动
31.cache_swap_low 90
32.cache_swap_high 95
33.# 设置存储策略
34.maximum_object_size 4096 KB #能缓存的最大对象为4M
35.maximum_object_size_in_memory 80 KB #内存中缓存的最大对象80K 36.ipcache_size 1024 #缓存DNS解析得到的IP,最大单个对象为1024K
37.ipcache_low 90
38.ipcache_high 95
39.cache_replacement_policy lru #缓存替换策略
40.memory_replacement_policy lru #内存替换策略
41.memory_pools on #开启内存池
42.memory_pools_limit 32 MB #限制内存池大小为32MB
43. 44.forwarded_for on #开启转发
45.log_icp_queries off #关闭icp查询日志
46. 47.forward_timeout 20 seconds #允许转发超时20秒
48.connect_timeout 30 seconds #连接到其他机器的最大尝试时间
49.read_timeout 3 minutes #允许读取超时3分钟
50.request_timeout 1 minutes #允许返回超时1分钟
51.persistent_request_timeout 30 seconds #允许持续连接超时30秒
52.client_lifetime 15 minutes #客户端会话保持
53.shutdown_lifetime 5 seconds
54.negative_ttl 30 seconds #设置错误信息的生存时间
55.# 允许一个IP最大并发数为50
56.acl OverConnLimit maxconn 50
57.http_access deny OverConnLimit
58. 59.client_persistent_connections off #对客户端长连接KeepAlive这个参数的支持
60.server_persistent_connections on # 开启服务端的KeepAlive,web端要开启KeepAlive,不然这里打开是没用的
61.tcp_recv_bufsize 65535 bytes #TCP套接字接收缓冲区大小
62.half_closed_clients off #当客户与squid的连接处于半关闭状态时,允许squid立即关闭连接
63. 64.via on #开启转发循环的检测 65.request_header_access via deny all #避免由于两台squid的主机名一样而返回403错误
66.httpd_suppress_version_string off #错误页面不显示squid的版本信息
67.ie_refresh off #是否允许对旧版本的IE浏览器强制刷新页面 注:shutdown_lifetime 5 seconds说明:当收到SIGTERM 或者 SIGHUP 信号后,squid将进入一种shutdown pending的模式,等待所有活动的套接字关闭。在过了shutdown_lifetime所定义的时间后,所有活动的用户都将收到一个超时信息。缺省值为30秒。
4.启动squid
检查 squid 配置文件正确与否
/usr/local/squid/sbin/squid -Nk parse
生成缓存目录
/usr/local/squid/sbin/squid -N –z
测试squid
/usr/local/squid/sbin/squid -N -d1
启动squid
/usr/local/squid/sbin/squid
ps -ef |grep squid #检查squid是否正常启动
配置squid开机启动
vi /etc/rc.d/rc.local
在最后添加
1./usr/local/squid/sbin/squid
5.滚动日志文件
squid将大量的重要信息写入日志,假如写不进去了,squid会发生错误并退出。为了合理控制磁盘空间消耗,必须周期性的滚动日志文件。
/usr/local/squid/sbin/squid -k rotate
ls -alh /usr/local/squid/var/logs/
通过上图,可以看到日志已经被分割了,将此命令加入到crontab里,让它在每天的凌晨4点运行。
crontab -e
在最后添加
1.0 4 * * * /usr/local/squid/sbin/squid -k rotate 附1:安全停止squid
/usr/local/squid/sbin/squid -k shutdown
附2:立即停止squid
/usr/local/squid/sbin/squid -k interrupt
附3:在squid运行中,对squid.conf做了修改,使修改后的配置生效
/usr/local/squid/sbin/squid -k reconfigure
注:在使用reconfigure选项时你须谨慎,因为所做的改变可能会导致致命错误,必须确保所做的修改是正确的。
附4:前端用LVS做负载均衡的话,请做以下修改
vi /root/Desktop/lvs_vip.sh #编写VIP的绑定脚本
1.#!/bin/bash 2.# description: Config realserver 3.SNS_VIP=192.168.0.56 4./etc/rc.d/init.d/functions 5.case "$1" in 6.start) 7. /sbin/ifconfig lo:0 $SNS_VIP netmask 255.255.255.255 broadcast $SNS_VIP 8. /sbin/route add -host $SNS_VIP dev lo:0 9. echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore 10. echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce 11. echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore 12. echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce 13. sysctl -p >/dev/null 2>&1 14. echo "RealServer Start OK" 15. ;; 16.stop) 17. /sbin/ifconfig lo:0 down 18. /sbin/route del $SNS_VIP >/dev/null 2>&1 19. echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore 20. echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce 21. echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore 22. echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce 23. echo "RealServer Stoped" 24. ;; 25.*) 26. echo "Usage: $0 {start|stop}" 27. exit 1 28.esac 29.exit 0 chmod +x /root/Desktop/lvs_vip.sh #赋予lvs_vip.sh脚本执行权限
/root/Desktop/lvs_vip.sh start #启动lvs_vip.sh
echo "/root/Desktop/lvs_vip.sh start" >> /etc/rc.d/rc.local #设置lvs_vip.sh开机启动
ip add #查看VIP是否已绑定
vi /usr/local/squid/etc/squid.conf #修改squid的配置文件
1.cache_effective_user squid 2.cache_effective_group squid 3.visible_hostname squid1.cache.cn 4.http_port 0.0.0.0:80 vhost vport 5.icp_port 3130 6.cache_peer 192.168.0.150 sibling 80 3130 7.cache_peer 192.168.0.108 parent 80 0 no-query originserver 8.cache_peer 192.168.0.109 parent 80 0 no-query originserver 9.cache_peer 192.168.1.115 parent 80 0 no-query originserver 10.acl localnet src 192.168.0.149 11.http_access allow all 12.icp_access allow localnet 13.hierarchy_stoplist cgi-bin ? 14.hierarchy_stoplist -i ^https:\\ ? 15.acl QueryString urlpath_regex -i cgi-bin \? \.asp \.php \.jsp \.cgi 16.acl denyssl urlpath_regex -i ^https:\\ 17.no_cache deny QueryString 18.no_cache deny denyssl 19.cache_log /usr/local/squid/var/logs/cache.log 20.access_log /usr/local/squid/var/logs/access.log squid 21.cache_dir aufs /var/cache 1024 16 256 22.cache_dir aufs /var/squid 3072 16 256 23.cache_mem 128 MB 24.cache_swap_low 90 25.cache_swap_high 95 26.maximum_object_size 4096 KB 27.maximum_object_size_in_memory 80 KB 28.ipcache_size 1024 29.ipcache_low 90 30.ipcache_high 95 31.cache_replacement_policy lru 32.memory_replacement_policy lru 33.memory_pools on 34.memory_pools_limit 32 MB 35.forwarded_for on 36.log_icp_queries off 37.forward_timeout 20 seconds 38.connect_timeout 30 seconds 39.read_timeout 3 minutes 40.request_timeout 1 minutes 41.persistent_request_timeout 30 seconds 42.client_lifetime 15 minutes 43.shutdown_lifetime 5 seconds 44.negative_ttl 30 seconds 45.acl OverConnLimit maxconn 50 46.http_access deny OverConnLimit 47.client_persistent_connections off 48.server_persistent_connections on 49.tcp_recv_bufsize 65535 bytes 50.half_closed_clients off 51.via on 52.request_header_access via deny all 53.httpd_suppress_version_string off 54.ie_refresh off /usr/local/squid/sbin/squid -k reconfigure #使用修改后的配置生效
六、测试
找一台windows的机器用来测试,修改hosts文件,hosts文件在C:\WINDOWS\system32\drivers\etc目录下,添加如下内容
1.192.168.0.149 www.xuad.com 2.192.168.0.149 aaa.xuad.com 3.192.168.0.149 bbb.xuad.com 打开浏览器,在地址栏里输入:http://www.xuad.com,确保网站可正常访问。
ls -alh /var/squid/00/00/
通过上图可看到缓存文件已经生成,然后关闭一台web服务器,看网站可否正常访问。
对于另一台的测试,也请按此方法来进行测试。
如果缓存服务器前面还有一层负载均衡,hosts文件需要配置成负载机���的IP地址,然后可尝试在两台缓存都开启的情况下进行测试。
(责任编辑:IT) |