反向代理服务器介绍与squid架设

 

反向代理服务器介绍与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 是由美国政府大力资助的一项研究计划,其目的为解决网络带宽不足的问题,支持HTTPHTTPSFTP 等多种协议,是现在 Unix 系统上使用、最多功能也最完整的一套软体。下面将重点介绍 Squid 反向代理的实现原理和在提高网站性能方面的应用。

Varnish是一款高性能的开源HTTP加速器,挪威最大的在线报纸 Verdens Gang (http://www.vg.no) 使用3Varnish代替了原来的12squid,性能居然比以前更好。Verdens Gang网站采用的是php技术,因为不牵涉到登陆的问题,因此处理起来也比较容易方便。

Squid反向代理服务器位于本地 WEB 服务器和 Internet 之间 , 组织架构如图 2

 

2. 组织架构


客户端请求访问 WEB 服务时,DNS 将访问的域名解析为 Squid 反向代理服务器的 IP 地址,这样客户端的 URL 请求将被发送到反向代理服务器。如果 Squid 反向代理服务器中缓存了该请求的资源,则将该请求的资源直接返回给客户端,否则反向代理服务器将向后台的 WEB 服务器请求资源,然后将请求的应答返回给客户端,同时也将该应答缓存在本地,供下一个请求者使用。

Squid 反向代理一般只缓存可缓冲的数据(比如 html 网页和图片等),而一些 CGI 脚本程序或者 ASPJSP 之类的动态程序默认不缓存。它根据从 WEB 服务器返回的 HTTP 头标记来缓冲静态页面。有四个最重要 HTTP 头标记:

  • Last-Modified: 告诉反向代理页面什么时间被修改
  • Expires: 告诉反向代理页面什么时间应该从缓冲区中删除
  • Cache-Control: 告诉反向代理页面是否应该被缓冲
  • Pragma: 用来包含实现特定的指令,最常用的是 Pragma:no-cache

利用 Squid 反向代理加速网站实例

1、 更还文件描述符的大小

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

7cache_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)修改后端服务器apachehttp.conf,将外网服务器访问的日志记录仍显示为实际来源ip

         ++apachelog显示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-ModifiedDate头部之间是不同的。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,速度也快一些

 

 

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值