反向代理服务器介绍与squid架设
本文在介绍 squid 反向代理的工作原理的基础上,指出反向代理技术在提高网站访问速度,增强网站可用性、安全性方面有很好的用途。作者在具体的实验环境下, Squid 反向代理技术,(同时可以通过squid的轮叫实现实现了网站的负载均衡,但是因为我们网站需要登陆,因此这里就不做相关的测试了)从而提高了网站的可用性和可靠性。
现在有许多大型的门户网站如 SINA 都采用 squid 反向代理技术来加速网站的访问速度,可将不同的 URL 请求分发到后台不同的 WEB 服务器上,同时互联网用户只能看到反向代理服务器的地址,加强了网站的访问安全。
反向代理服务器又称为 WEB 加速服务器,它位于 WEB 服务器的前端,充当 WEB 服
务器的内容缓存器。其系统结构如图 1
图 1. 系统结构
反向代理服务器是针对 WEB 服务器设置的,后台 WEB 服务器对互联网用户是透明的,用户只能看到反向代理服务器的地址,不清楚后台 WEB 服务器是如何组织架构的。当互联网用户请求 WEB 服务时,DNS 将请求的域名解析为反向代理服务器的 IP 地址,这样 URL 请求将被发送到反向代理服务器,由反向代理服务器负责处理用户的请求与应答、与后台 WEB 服务器交互。利用反向代理服务器减轻了后台 WEB 服务器的负载,提高了访问速度,同时避免了因用户直接与 WEB 服务器通信带来的安全隐患。
目前有许多反向代理软件,比较有名的有 Nginx 、 Squid 、varnish 。 Nginx 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。
Squid 是由美国政府大力资助的一项研究计划,其目的为解决网络带宽不足的问题,支持HTTP,HTTPS,FTP 等多种协议,是现在 Unix 系统上使用、最多功能也最完整的一套软体。下面将重点介绍 Squid 反向代理的实现原理和在提高网站性能方面的应用。
Varnish是一款高性能的开源HTTP加速器,挪威最大的在线报纸 Verdens Gang (http://www.vg.no) 使用3台Varnish代替了原来的12台squid,性能居然比以前更好。Verdens Gang网站采用的是php技术,因为不牵涉到登陆的问题,因此处理起来也比较容易方便。
Squid反向代理服务器位于本地 WEB 服务器和 Internet 之间 , 组织架构如图 2:
图 2. 组织架构
客户端请求访问 WEB 服务时,DNS 将访问的域名解析为 Squid 反向代理服务器的 IP 地址,这样客户端的 URL 请求将被发送到反向代理服务器。如果 Squid 反向代理服务器中缓存了该请求的资源,则将该请求的资源直接返回给客户端,否则反向代理服务器将向后台的 WEB 服务器请求资源,然后将请求的应答返回给客户端,同时也将该应答缓存在本地,供下一个请求者使用。
Squid 反向代理一般只缓存可缓冲的数据(比如 html 网页和图片等),而一些 CGI 脚本程序或者 ASP、JSP 之类的动态程序默认不缓存。它根据从 WEB 服务器返回的 HTTP 头标记来缓冲静态页面。有四个最重要 HTTP 头标记:
- Last-Modified: 告诉反向代理页面什么时间被修改
- Expires: 告诉反向代理页面什么时间应该从缓冲区中删除
- Cache-Control: 告诉反向代理页面是否应该被缓冲
- Pragma: 用来包含实现特定的指令,最常用的是 Pragma:no-cache
利用 Squid 反向代理加速网站实例
ulinmit –HSn 65536
在/etc/rc.local中添加开机启动,避免重启机器后文件描述符发生改变
或者是永久性的修改
在文件/etc/security/limits.conf中添加行:
* hard nofile 65536
这样在下次进入系统是就不用再设置了
这里的作用主要是加大文件描述符,以免出现请求过多的时候文件描述符溢出,在咱们的正向代理服务器上曾出现过问价描述符不足的问题。
2、 下面开始安装squid:
tar –zxvf squid2.6.tar.gz
cd squid2.6
./configure --prefix=/usr/local/squid --enable-arp-acl --enable-cache-digests --enable-err-language="Simplify_Chinese" --enable-default-err-languages="Simplify_Chinese" --enable-delay-pools --enable-gnuregex --enable-icmp --enable-kill-parent-hack --enable-linux-netfilter --enable-epoll --enable-snmp --enable-async-io=80 --enable-underscore --with-filedescriptors=65536
Make&&make install
make install-pinger
3、 在安装squid完成之后就可以开始配置squid:
打开/usr/local/squid/etc/squid.conf修改里面的配置文件:
(1)找到# Squid normally listens to port 3128部分添加:
# Squid normally listens to port 3128
http_port 80 accel vhost vport
(2)添加:
cache_peer 192.168.1.221 parent 80 0 no-query originserver weight=1 name=a
cache_peer 192.168.1.221 parent 80 0 no-query originserver weight=1 name=b
cache_peer 192.168.1.221 parent 80 0 no-query originserver weight=1 name=c
cache_peer 192.168.1.221 parent 80 0 no-query originserver weight=1 name=d
cache_peer 192.168.1.221 parent 80 0 no-query originserver weight=1 name=e
cache_peer 192.168.1.221 parent 80 0 no-query originserver weight=1 name=f
cache_peer_domain a www.xxt.cn
cache_peer_domain b jxlx.xxt.cn
cache_peer_domain c jxlx2.xxt.cn
cache_peer_domain d blog.xxt.cn
cache_peer_domain e 192.168.5.101
cache_peer_domain f jzh.xxt.cn
cache_peer_access a allow all
cache_peer_access b allow all
cache_peer_access c allow all
cache_peer_access d allow all
cache_peer_access e allow all
cache_peer_access f allow all
这里主要是配置反向代理的后端的请求的服务器和机器,192.168.1.221是我们后端的服务器,同 时各个域名是访问的域名转发的情况
(3)设置cache_mem 的大小:
cache_mem 256 MB
这里我们设置256M,可根据自己的情况适当的调大些
(4)设置maximum_object_size_in_memory 的大小
maximum_object_size_in_memory 500 KB
这里我们设置能在内存中能缓存的文件最大是500 KB
(5)设置cache_dir ufs /usr/local/squid/var/cache 缓存目录
cache_dir ufs /usr/local/squid/var/cache 1024 32 256
可根据实际的情况适量调整
(6)设置在硬盘中缓存maximum_object_size的大小
maximum_object_size 5120 KB
(7)cache_swap_low 90
cache_swap_high 95
这两项可以进行适当的调整
(8)设置日志文件记录的所在目录和格式
access_log /usr/local/squid/var/logs/access.log combined
这里采用combined格式,主要为了我们做流量分析方便,注意的是需要将:logformat combined 前面的#号去掉
(9)设置不能缓存的格式:
Acl QUERY urlpath_regex cgi-bin .cgi .avi .wmv .rm .ram .mpg .mpeg .zip .exe
cache deny QUERY
(10)添加squid的管理用户和组
cache_effective_user squid
cache_effective_group squid
(11)设置visible_hostname
可根据自己的情况填写:
visible_hostname squidproxy
(12)修改logfile_rotate的值
logfile_rotate 60
这里是保存了两个月的日志或者是在crontab中添加滚动脚本,完成日志的转储
这里主要是因为log超过了ext3文件系统最大支持容量2G
(13)修改后端服务器apache的http.conf,将外网服务器访问的日志记录仍显示为实际来源ip
++apache的log显示ip来源都是127.0.0.1,修改配置文件使其可以正常记录来访IP
将CustomLog的%h改为%{X-Forwarded-For}i,其它不变.
这里修改的目的主要是让awstats软件分析流量使用,或者你也可以直接修改squid的访问日志,定制awstats分析所需要的格式:
#squid.conf
logformat combined %>a %ui %un [%tl] “%rm %ru HTTP/%rv” %Hs %<st “%{Referer}>h” “%{User-Agent}>h” %Ss:%Sh %{host}>h
access_log /var/log/squid/access.log combined
#/etc/awstats/awstats.blog.zhangjianfeng.com.conf
LogFormat = “%host %other %logname %time1 %methodurl %code %bytesd %refererquot %uaquot %other %virtualname”
LogFile=”/var/log/squid/access.log”
正式的运行之前需要注意的就是:更改squid的目录的权限为squid所有,另外就是cache目录更改权限为squid所有。还有什么错误的话,可以在/var/log/messages查看,然后更改。
注意:
(1)在正式的运行之前用指令:squid -k parse 看看输出什么,然后将错误更改,如果是没有输出,说明配置没有问题
(2)初始化cache目录.即建立缓存目录的存储格式
只需在第一次启动squid服务之前执行(在初次运行squid之前,或者无论何时你增加了新的cache_dir,你必须初始化cache目录。)
# squid -z
cache目录初始化可能花费一些时间,依赖于cache目录的大小和数量,以及磁盘驱动器的速度。假如你想观察这个过程,请使用-X选项:
# squid –zX
(3)启动squid服务
# service squid start
假定squid安装在/usr/local/squid目录下,也可以
# /usr/local/squid/sbin/squid -sD
(4)停止squid
最安全的停止squid的方法是使用squid -k shutdown命令:
# squid -k shutdown
(5)重配置运行中的squid进程
在你了解了更多关于squid的知识后,你会发现对squid.conf文件做了许多改动。为了让新设置生效,你可以关闭和重启squid,或者在squid运行时,重配置它。
重配置运行中的squid最好的方法是使用squid -k reconfigure命令:
# squid -k reconfigure
(6) 在反向代理服务器上需要增加到realserver的路由信息,不然在使用外部的网址时会无法找到路径
route add –net 192.168.0.0 gw 192.168.5.1 netmask 255.255.0.0
总结
Squid 是一个开源的软件,利用它的反向代理技术可以提高网站系统的访问速度。本文在真实的网络环境下,利用一台 squid 反向代理服务器加速了网站的性能,但是具体的压力测试等还需要做进一步的测试。
附squid缓存参数refresh_pattern设置文档:
refresh_pattern的作用:
用于确定一个页面进入cache后,它在cache中停留的时间。refresh_pattern规则仅仅应用到没有明确过时期限的响应。原始服务器能使用Expires头部,或者Cache-Control:max-age指令来指定过时期限。
语法:refresh_pattern [-i] regexp min percent max [options]
min参数是分钟数量。它是过时响应的最低时间限制。如果某个响应驻留在cache里的时间没有超过这个最低限制,那么它不会过期。类似的,max参数是存活响应的最高时间限制。如果某个响应驻留在cache里的时间高于这个最高限制,那么它必须被刷新。
在最低和最高时间限制之间的响应,会面对squid的最后修改系数LM-factor算法LM-factor=(response age)/(resource age)。对这样的响应,squid计算响应的年龄和最后修改系数,然后将它作为百分比值进行比较。响应年龄简单的就是从原始服务器产生,或最后一次验证响应后,经历的时间数量。源年龄在Last-Modified和Date头部之间是不同的。LM-factor是响应年龄与源年龄的比率。
常用的几个参数的意思
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)
举个例子,这里只考虑percent, 不考虑min 和max
例如:refresh_pattern 20%
假设源服务器上www.aaa.com/index.htm -----lastmodified 是 2007-04-10 02:00:00
squid上 proxy.aaa.com/index.htm index.htm进入cache的时间 2007-04-10 03:00:00
1)如果当前时间 2007-04-10 03:00:00
resource age =3点-2点=60分钟
response age =0分钟
index.htm还可以在cache停留的时间(resource age)*20%=12分钟
也就是说,index.htm进入cache后,可以停留12分钟,才被重新确认。
2)如果当前时间 2007-04-10 03:05:00
resource age =3点-2点=60分钟
response age =5分钟
index.htm还可以在cache停留的时间(resource age)*20%=12分钟-5=7
LM-factor=5/60=8.3%<20%
一直到2007-04-10 03:12:00 LM-factor=12/60=20% 之后,cache中的页面index.htm终于stale。
如果这时没有index.htm的请求,index.htm会一直在缓存中,如果有index.htm请求,squid收到该请求后,由于已经过期, squid会向源服务器发一个index.htm是否有改变的请求,源服务器收到后,如果index.htm没有更新,squid就不用更新缓存,直接把缓存的内容放回给客户端,同时,重置对象进入cache的时间为与源服务器确认的时间,比如2007-04-10 03:13:00,如果正好在这个后重新确认了页面。重置后,resource age变长,相应在cache中存活的时间也变长。
如果有改变则把最新的index.htm返回给squid,squid收到会更新缓存,然后把新的index.htm返回给客户端,同时根据新页面中的Last_Modified和取页面的时间,重新计算resource age,进一步计算出存活时间。
实际上,一个页面进入cache后,他的存活时间就确定了,即 (resource age) * 百分比,一直到被重新确认。
reload_into_ims on
将这个参数开启后会忽略掉强制刷新的请求,每次强制刷新会到原始资源服务器上验证请求头,入过发生变化则图片进行更新,如果没有变化则只会验证请求头。
最好还编辑/etc/hosts 文件
添加以下内容
xx.xx.xx.xx aaa.com www.aaa.com bbb.com www.bbb.com
这样免去查询DNS,速度也快一些