Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3050159
  • 博文数量: 535
  • 博客积分: 15788
  • 博客等级: 上将
  • 技术积分: 6507
  • 用 户 组: 普通用户
  • 注册时间: 2007-03-07 09:11
文章分类

全部博文(535)

文章存档

2016年(1)

2015年(1)

2014年(10)

2013年(26)

2012年(43)

2011年(86)

2010年(76)

2009年(136)

2008年(97)

2007年(59)

分类: 系统运维

2009-03-17 14:19:55

首先:
什么样的页面能够比较好的被缓存服务器缓存呢?如果返回内容的HTTP HEADER中有"Last-Modified"和"Expires"相关声明,比如:
Last-Modified: Wed, 14 May 2003 13:06:17 GMT
Expires: Fri, 16 Jun 2003 13:06:17 GMT
前端缓存服务器在期间会将生成的页面缓存在本地:硬盘或者内存中,直至上述页面过期。
因此,一个可缓存的页面:
页面必须包含Last-Modified 标记
一般纯静态页面本身都会有Last-Modified信息,动态页面需要通过函数强制加上,比如在PHP中:
// always modified now
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");


必须有Expires或Cache-Control: max-age标记设置页面的过期时间:
对于静态页面,通过apache的mod_expires根据页面的MIME类型设置缓存周期:比如图片缺省是1个月,HTML页面缺省是2天等。
    ExpiresActive on
    ExpiresByType image/gif "access plus 1 month"
    ExpiresByType text/css "now plus 2 day"
    ExpiresDefault "now plus 1 day"

对于动态页面,则可以直接通过写入HTTP返回的头信息,比如对于新闻首页index.php可以是20分钟,而对于具体的一条新闻页面可能是1天后过期。比如:在php中加入了1个月后过期:
// Expires one month later
header("Expires: " .gmdate ("D, d M Y H:i:s", time() + 3600 * 24 * 30). " GMT");

查看头文件,wget --save-headers 然后查看下载的文件的文件


1.编译前,调整文件描述符
vi /etc/profile
ulimit -u  unlimited
ulimit -n 65535

2.调整端口限制
临时端口是TCP/IP栈分配给出去连接的本地端口。换句话说,当squid发起一条连接到另一台服务器,内核给本地socket分配一个端口号。临时端口号的短缺对非常忙的代理服务器(例如每秒数百个连接)来说,会较大的影响性能。这是因为一些TCP连接在它们被关闭时进入TIME_WAIT状态。当连接进入TIME_WATI状态时,临时端口号不能被重用。如果你没有看到数千个临时端口在TIME_WAIT状态,那也许不必增加这个端口范围
/etc/sysctl.conf
net.ipv4.ip_local_port_range=10000 60000

sysctl -p 生效

3 configure

./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 \
--with-filedescriptors=65536 \
--disable-ident-lookups \
--enable-snmp \
--enable-large-cache-files \
--with-large-files \
--enable-dlmalloc \
--enable-removal-policies='heap,lru' \
--enable-delay-pools \
--enable-auth=basic \
--enable-underscore \
--enable-cahce-digests



--enable-async-io=180       //1G内存,并且是双核的选180,否则选100以下

打开snmp,这样可以从cacti之类的snmp软件中获取相关squid的参数进行监控
打开大文件支持.允许日志文件超过2G

--enable-async-io[=N_THREADS]
异步I/O是squid技术之一,用以提升存储性能。aufs模块使用大量的线程来执行磁盘I/O操作。=N_THREADS参数改变squid使用的线程数量。 请注意--enable-async-io是打开其他三个./configure选项的快捷方式,它等同于:
--with-aufs-threads=N_THREADS     
--with-pthreads   
--enable-storeio=ufs,aufs  

该选项导致编译过程链接到你系统中的P线程库。aufs存储模块是squid中唯一需要使用线程的部分。通常来说,如果你使用--enable-saync-io选项,那么不必再单独指定该选项,因为它被自动激活了。

make
make install


4、配置
(此处的配置为配置反向代理,正向代理见下面另一段配置)

cache_effective_user nobody
cache_effective_group nobody

visible_hostname 192.168.7.192
http_port 192.168.7.192:80 accel vhost vport #xx.xx.xx.xx为这台服务器的IP地址,单ip地址可以直接写80

cache_mem 80 MB #额外使用内存量,一般为实际内存的1/3
cache_swap_low 90
cache_swap_high 95

cache_dir ufs //cache1 10000 16 256 #10G的缓存。

#定义一个源服务器,将节点设为no-query以及originserver说明这些节点是实际服务器
cache_peer bbs.cloudfront.net parent 80 0 no-query originserver name=bbs
cache_peer oa.cloudfront.net parent 80 0 no-query originserver name=oa
#设定不同域名转发到不同的cache_peer上,如果没有这项.不同域名的域名可能被分发到同一台服务器上
cache_peer_domain bbs bbs.web.com
cache_peer_domain oa oa.web.com

http_access allow all

emulate_httpd_log on #仿照apache日志格式
logformat combined %>a %ui %un [%tl] "%rm %ru HTTP/%rv" %Hs %<st"%{Referer}>h" "%{User-Agent}>h" %Ss:%Sh
pid_filename /usr/local/squid/var/logs/squid.pid
cache_log /usr/local/squid/var/logs/cache.log
access_log /usr/local/squid/var/logs/access.log combined

#不对符合QueryString1的ACL内容进行缓冲
acl QueryString1 url_regex \.php?
no_cache deny QueryString1

maximum_object_size 320010 KB
maximum_object_size_in_memory 4096 KB #调大到4MB,让其可以缓存更大的文件,而不是默认的8KB

dns_nameservers 127.0.0.1 202.106.0.20

shutdown_lifetime 3 seconds #定义squid关闭前处理外面请求的时间

cache_mgr xiajc@wamo.com

httpd_suppress_version_string off #关闭版本信息




正向代理的配置

cache_effective_user nobody
cache_effective_group nobody

visible_hostname 192.168.7.192
http_port 192.168.7.192:80  vhost vport #xx.xx.xx.xx为这台服务器的IP地址,单ip地址可以直接写80

cache_mem 80 MB #额外使用内存量,一般为实际内存的1/3
cache_swap_low 90
cache_swap_high 95

cache_dir ufs //cache1 10000 16 256 #10G的缓存。

http_access allow all

always_direct allow  all

emulate_httpd_log on #仿照apache日志格式
logformat combined %>a %ui %un [%tl] "%rm %ru HTTP/%rv" %Hs %<st"%{Referer}>h" "%{User-Agent}>h" %Ss:%Sh
pid_filename /usr/local/squid/var/logs/squid.pid
cache_log /usr/local/squid/var/logs/cache.log
access_log /usr/local/squid/var/logs/access.log combined

#不对符合QueryString1的ACL内容进行缓冲
acl QueryString1 url_regex \.php?
no_cache deny QueryString1

maximum_object_size 320010 KB
maximum_object_size_in_memory 4096 KB #调大到4MB,让其可以缓存更大的文件,而不是默认的8KB

dns_nameservers 127.0.0.1 202.106.0.20

shutdown_lifetime 3 seconds #定义squid关闭前处理外面请求的时间

cache_mgr xiajc@wamo.com

httpd_suppress_version_string off #关闭版本信息



squid配置完成!

5、建立缓存和日志目录,并改变权限使squid能写入
mkdir /cache1
mkdir /var/log/squid
chown -R nobody:nobody /cache1
chmod 766 /cache1
chown -R nobody:nobody /var/log/squid

touch /usr/local/squid/var/logs/store.log
chown nobody.nobody store.log 
可以通过在squid.conf中添加cache_store_log none关闭该log


6、初始化
/usr/local/squid/sbin/squid -z -d 1   #-d 1 debug 1级别

关于
2009/03/17 10:07:43| WARNING: '0.0.0.0/0.0.0.0' is a subnetwork of '0.0.0.0/0.0.0.0'
2009/03/17 10:07:43| WARNING: because of this '0.0.0.0/0.0.0.0' is ignored to keep splay tree searching predictable
2009/03/17 10:07:43| WARNING: You should probably remove '0.0.0.0/0.0.0.0' from the ACL named 'all'
是否在squid里添加了acl all src 0.0.0.0/0.0.0.0

这个在3.0以上版本是不需要了
默认3.0中就已经把all定义了,所以只需要后面使用就行了


7、查看运行状态
拷贝/usr/local/squid/libexec/cachemgr.cgi到apache下,通过web访问

或者,使用命令行工具
[root@real2 squid]# ./bin/squidclient -h 192.168.7.192 -p 80 mgr:info
使用下面的命令查看更多参数:
[root@real2 squid]# ./bin/squidclient -h 192.168.7.192 -p 80 mgr:menu


8、最安全的停止squid的方法是使用squid -k shutdown命令

%squid -k shutdown

该命令发送TERM信号到运行中的squid进程。在接受到TERM信号后,squid关闭进来的套接字以拒收新请求。然后它等待一段时间,用以完成外出请求。默认时间是30秒,你可以在shutdown_lifetime指令里更改它。

9、关于store.log里的RELEASE
RELEASE在Squid从cache里删除目标,或首先就决定响应不会存储。
这可能是因为某个object在之前已经被cache了,再次访问时不会在cache,可以查看access.log查看是否命中

access.log里常见的:
TCP_IMS_HIT:NONE

TCP_IMS_HIT
客户端发送确认请求,Squid发现更近来的、貌似新鲜的请求资源的拷贝。Squid发送更新的内容到客户端,而不联系原始服务器。
NONE
这指明Squid对本次请求,不会与任何其他服务器(邻居或原始服务器)通信。它通常与cache命中、拒绝请求、cache管理请求、错误、和所有的ICP查询这些类型联合出现。





阅读(1874) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~