利用 squid 反向代理提高网站性能
2012-06-27 15:17
495 查看
此文章转自李明慧,中间有些东西是自己改动的,如有错误,敬请谅解
本文在介绍squid反向代理的工作原理的基础上,指出反向代理技术在提高网站访问速度,增强网站可用性、安全性方面有很好的用途。作者在具体的实验环境下,利用DNS轮询和Squid反向代理技术,实现了网站的负载均衡,从而提高了网站的可用性和可靠性。
现在有许多大型的门户网站如SINA都采用squid反向代理技术来加速网站的访问速度,可将不同的URL请求分发到后台不同的WEB服务器上,同时互联网用户只能看到反向代理服务器的地址,加强了网站的访问安全。
反向代理的概念
反向代理服务器又称为WEB加速服务器,它位于WEB服务器的前端,充当WEB服
务器的内容缓存器。其系统结构如图1
图1.系统结构
反向代理服务器是针对WEB服务器设置的,后台WEB服务器对互联网用户是透明的,用户只能看到反向代理服务器的地址,不清楚后台WEB服务器是如何组织架构的。当互联网用户请求WEB服务时,DNS将请求的域名解析为反向代理服务器的IP地址,这样URL请求将被发送到反向代理服务器,由反向代理服务器负责处理用户的请求与应答、与后台WEB服务器交互。利用反向代理服务器减轻了后台WEB服务器的负载,提高了访问速度,同时避免了因用户直接与WEB服务器通信带来的安全隐患。
回页首
Squid反向代理的实现原理
目前有许多反向代理软件,比较有名的有Nginx和Squid。Nginx是由IgorSysoev为俄罗斯访问量第二的Rambler.ru站点开发的,是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器。
图2.组织架构
客户端请求访问WEB服务时,DNS将访问的域名解析为Squid反向代理服务器的IP地址,这样客户端的URL请求将被发送到反向代理服务器。如果Squid反向代理服务器中缓存了该请求的资源,则将该请求的资源直接返回给客户端,否则反向代理服务器将向后台的WEB服务器请求资源,然后将请求的应答返回给客户端,同时也将该应答缓存在本地,供下一个请求者使用。
Squid反向代理一般只缓存可缓冲的数据(比如html网页和图片等),而一些CGI脚本程序或者ASP、JSP之类的动态程序默认不缓存。它根据从WEB服务器返回的HTTP头标记来缓冲静态页面。有四个最重要HTTP头标记:
Last-Modified:告诉反向代理页面什么时间被修改
Expires:告诉反向代理页面什么时间应该从缓冲区中删除
Cache-Control:告诉反向代理页面是否应该被缓冲
Pragma:用来包含实现特定的指令,最常用的是Pragma:no-c
回页首
利用Squid反向代理加速网站实例
本实例的域名是wenjin.cache.
图3.系统结构
配置的系统环境:
一台DNS服务器:操作系统Freebsd,软件BIND9.5,IP192.168.76.222;
三台Squid服务器:操作系统LinuxAS4,软件Squid3.0,相应的IP如下:
Squid1:192.168.76.223Squid2:192.168.76.224Squid3:192.168.76.225
三台WEB服务器:操作系统LinuxAS4,应用软件Tomcat5.0+Mysql,相应的IP地址如下:
webServer1:210.82.118.195webServer2:192.168.76.226webServer1:192.168.76.227
应用软件的安装和配置
配置DNS服务器
软件利用Freebsd自带的bind9.5。然后针对该系统配置bind,首先修改bind的配置文件/etc/namedb/named.conf,在文件中添加
zone"cache.ibm.com.cn"{typemaster;file"master/cache.ibm.com.cn";};
再在/etc/namedb/master目录下添加cache.ibm.com.cn文件,该文件的内容如下:
$TTL3600@INSOAsearch.ibm.com.cn.root.ibm.com.cn.(20080807;Serial3600;Refresh900;Retry3600000;Expire3600);MinimumINNSsearch.ibm.com.cn.1INPTRlocalhost.ibm.com.cn.wenjinINA192.168.76.223wenjinINA192.168.76.224wenjinINA192.168.76.225
这样当用户请求的时候,DNS通过轮询机制将wenjin.cache.ibm.com.cn的域名解析为192.168.76.223、192.168.76.224和192.168.76.225其中之一。
配置完成后,运行rndcstart启动bind服务。可在/etc/rc.conf中设置named_enable="YES"使得开机自启动。
用ps–A|grepnamed查看bind服务是否起来;
用nslookupwenjin.cache.ibm.com.cn测试bind服务是否正常运行。
配置Squid1服务器
1.先安装gccgcc-c++opensslopenssl-devel的工具
yum-yinstallgccgcc-c++opensslopenssl-devel
2.修改描述符参数值
文件描述符用来限制一个程序能同时打开的文件数目,默认是1024。也就是说,如果不修
改文件描述符,那么一个程序只能同时打开1024个文件,而Squid会同时打开成千上万个
文件,所以远远是不够的,为了保证最高的效率和响应速度,要更改文件描述符的大小.
两种情况:a.用户每次访问squid,squid会按照需要打开文件,然后读取文件内容再返回给用户。
b.squid预先打开访问频率高的文件,用户访问squid,squid直接把内容返回给用户。相对来
说,后面的方法可以对用户的请求进行更加快的反应。
首先修改以下两个文件。
/usr/include/bits/typesizes.h
/usr/include/linux/posix_types.h
用vi打开上面的文件查找
#define__FD_SETSIZE1024
把1024改为65536,然后保存,这是Linux能接受的最大数值。
刚才编辑的这两个文件是C/C++程序里面的头文件,编译squid的时候会被自动引用。除了
这两个文件以外,我们还需要对当前环境进行设置。也就是你用ssh登录到系统时的一些
设定。每个登录进程都可以进行单独的设置,当关闭目前登录回话,环境变量的设置就失效
了
ulimit用来设置当前环境的一些资源限制。这个命令是对环境进行设置,所以退出当前登录
进程后命令将会失效。
我们输入下面的命令
[root@serversoft]#ulimit-Hs65536
[root@serversoft]#ulimit-n65536
也可以永久修改这些限制,开机自动生效,配置如下:
vi/etc/security/limits.conf,添加以下内容
*softnofile65536
*hardnofile65536
H参数是硬性限制,s是堆栈上限,n是文件描述符上限。
重启一下机器
注释:
ulimit参数介绍:
-H设置硬件资源限制.
-S设置软件资源限制.
-a显示当前所有的资源限制.
-csize:设置core文件的最大值.单位:blocks
-dsize:设置数据段的最大值.单位:kbytes
-fsize:设置创建文件的最大值.单位:blocks
-lsize:设置在内存中锁定进程的最大值.单位:kbytes
-msize:设置可以使用的常驻内存的最大值.单位:kbytes
-nsize:设置内核可以同时打开的文件描述符的最大值.单位:n
-psize:设置管道缓冲区的最大值.单位:kbytes
-ssize:设置堆栈的最大值.单位:kbytes
-tsize:设置CPU使用时间的最大上限.单位:seconds
-vsize:设置虚拟内存的最大值.单位:kbytes
下载squid-3.0.STABLE8.tar.gz源码包,将其放在/home目录下
3.临时端口范围
临时端口是TCP/IP栈分配给出去连接的本地端口。换句话说,当squid发起一条连接到另一台服务器,内核给本地socket分配一个端口号。这些本地端口号有特定的范围限制。
例如,在FreeBSD上,默认的临时端口范围是1024-5000。
临时端口号的短缺对非常忙的代理服务器(例如每秒数百个连接)来说,会较大的影响性能。这是因为一些TCP连接在它们被关闭时进入TIME_WAIT状态。当连接进入TIME_WATI状态时,临时端口号不能被重用。
你能使用netstat命令来显示有多少个连接进入这个状态:
%netstat-n|grepTIME_WAIT
ProtoRecv-QSend-QLocalAddressForeignAddress(state)
tcp400192.43.244.42.19583212.67.202.80.80TIME_WAIT
tcp400192.43.244.42.19597202.158.66.190.80TIME_WAIT
tcp400192.43.244.42.19600207.99.19.230.80TIME_WAIT
tcp400192.43.244.42.19601216.131.72.121.80TIME_WAIT
tcp400192.43.244.42.19602209.61.183.115.80TIME_WAIT
tcp400192.43.244.42.3128128.109.131.47.25666TIME_WAIT
tcp400192.43.244.42.3128128.109.131.47.25795TIME_WAIT
tcp400192.43.244.42.3128128.182.72.190.1488TIME_WAIT
tcp400192.43.244.42.3128128.182.72.190.2194TIME_WAIT
注意这个例子中既有客户端连接又有服务器端的连接。客户端连接有3128作为临时端口号,服务器端连接有80作为远程主机的端口号。临时端口号出现在本地地址栏里。在该例子里,它们是19000秒。
如果你没有看到数千个临时端口在TIME_WAIT状态,那也许不必增加这个端口范围。
在Freebsd上,用如下命令增加临时端口范围:
#sysctl-wnet.inet.ip.portrange.last=30000
在Linux上,简单的写一对数字到下列指定文件:
#echo"102440000">;/proc/sys/net/ipv4/ip_local_port_range
不要忘记将这些命令加到你的系统启动脚本中,以使机器每一次重启后都生效。
解压缩
设置配置参数:
./configure--prefix=/usr/local/squid--enable-gnuregex--enable-arp-acl--enable-auth="basic"--enable-basic-auth-helpers="NCSA"--enable-async-io=80--enable-storeio=ufs--enable-icmp--enable-kill-parent-hack--enable-snmp--disable-ident-lookups--enable-cache-digests--enable-ssl--enable-delay-pools--enable-linux-netfilter--enable-underscore--enable-err-language="Simplify_Chinese"--enable-default-err-languages="Simplify_Chinese"--with-large-files-disable-mempools-disable-wccp-disable-wccpv2-enable-x-accelerator-var--enable-internal-dns
解释说明:
--prefix=/usr/local/squid//指定安装路径
--enable-arp-acl//这样可以在规则设置中直接通过客户端的MAC地址进行管理,防止客户使用IP欺骗
--enable-async-io=80//这个主要是设置async模式来运行squid,我的理解是设置用线程来运行squid,如果服务器配置很不错,有1G以上内存,cpu使用SMP的方式的话可以考虑设成160或者更高。如果服务器比较糟糕就根据实际情况设了。另外此项还另cache文件支持aufs
--enable-auth-modules//此编译选项启用认证模块,可以对访问代理用户进行授权。
--enable-cache-digests//使能缓存摘要,本来此项目的是为了在Squid集群服务之间迅速发现缓存对象,这里在本地使用,可以加快请求时,检索缓存内容的速度。
--enable-err-language="Simplify_Chinese"和--enable-default-err-languages="Simplify_Chinese"//指定出错是显示的错误页面为简体中文
--enable-delay-pools//此选项使能一个延时池,这样能对某些特定的请求限制额定带宽。
--enable-gnuregex//由于Squid大量使用字符串处理做各种判断,加此项能更好处理。
--enable-icmp//加入icmp支持
--disable-ident-lookups//防止系统使用RFC931规定的身份识别方法。
--enable-kill-parent-hack//关掉suqid的时候,要不要连同父进程一起关掉,这个当然要啦
--enable-linux-netfilter//允许使用Linux的透明代理功能。
--enable-snmp//此选项可以让MRTG使用SNMP协议对服务器的流量状态进行监测,因此必须选择此项,使Squid支持SNMP接口。
--enable-storeio=ufs,null//使用的文件系统通常是默认的ufs,不过如果想要做一个不缓存任何文件的代理服务器,就需要加上null文件系统。
--enable-underscore//允许解析的URL中出现下划先,因为默认squid会认为带下划线的URL地址是非法的,并拒绝访问该地址。
--with-large-files//让log支持大于2G,设置支持大文件,如果不设置,日志文件到了2G的时候squid就会报错
-disable-mempools//相当于2.7配置文件里面的memory_poolsoff,适合内存使用较大的情况,系统会调用free()来清除没用到的缓存内存
–with-maxfd=65535相当于ulimit-n65535,2.7配置文件里面的max_filedescriptors65535
--enable-internal-dns做多个网站反向代理时使用,允许使用内部dns,也可改/etc/hosts
--disable-wccp禁用WCCP协议
--disable-wccpv2禁用WCCP协议V2
编译安装:
安装完以后会在/usr/local目录下看见squid目录。
配置squid配置文件
编辑squid.conf文件,
#设置运行squid用户
cache_effective_usersquid
cache_effective_groupsquid
#########设定squid的主机名,如无此项squid将无法启动
visible_hostnamesquid1.nlc.gov.cn
#############配置squid为加速模式#################
http_port80accelvhostvport
icp_port3130
#####设置自己的hosts文件,当没有DNS的使用
hosts_file/etc/hosts
#####配置squid2、squid3为其邻居,当squid1在其缓存中没有找到请求的资源时,#通过ICP查询去其邻居中取得缓存
cache_peersquid2.ibm.com.cnsibling803130
cache_peersquid3.ibm.com.cnsibling803130
#####squid1的三个父节点,originserver参数指明是源服务器,round-robin参数指明#squid通过轮询方式将请求分发到其中一台父节点;squid同时会对这些父节点的健#康状态进行检查,如果父节点down了,那么squid会从剩余的origin服务器中抓
#取数据
cache_peer210.82.118.195parent80800no-queryoriginserverround-robinname=webServer1
cache_peer192.168.76.226parent80800no-queryoriginserverround-robinname=webServer2
cache_peer192.168.76.227parent80800no-queryoriginserverround-robinname=webServer3
####将wenjin.cache.ibm.com.cn域的请求通过RR轮询方式转发到三个父节点中的一#个
cache_peer_domainwebServer1webServer2webServer3wenjin.cache.ibm.com.cn
#keepalived
#因为现在的IE都是多线程,考虑到服务器带宽等网络资源消耗,所以长链接关闭
client_persistent_connectionsoff
#服务端长链接是用于在服务器端传递消息时使用已打开的socket链接以节省资源而
#设置的。
server_persistent_connectionson
#关闭此项将在访问某些论坛时显示的IP是代理服务器的IP,如果打开则显示是客户
#请求IP
forwarded_foron
log_icp_queriesoff#是否记录icp请求
request_header_max_size128KB#限制http请求header头得大小
####设置过期刷新时间
refresh_pattern^ftp:6020%10080
refresh_pattern^gopher:600%1440
refresh_pattern.020%1440
refresh_pattern-i\.css$36050%2880reload-into-ims
refresh_pattern-i\.js$144050%2880reload-into-ims
refresh_pattern-i\.html$72050%1440reload-into-ims
refresh_pattern-i\.jpg$144090%2880ignore-reload
refresh_pattern-i\.gif$144090%2880ignore-reload
refresh_pattern-i\.swf$144090%2880ignore-reload
refresh_pattern-i\.jpg$144050%2880ignore-reload
refresh_pattern-i\.png$144050%2880ignore-reload
refresh_pattern-i\.bmp$144050%2880ignore-reload
refresh_pattern-i\.doc$144050%2880ignore-reload
refresh_pattern-i\.ppt$144050%2880ignore-reload
refresh_pattern-i\.xls$144050%2880ignore-reload
refresh_pattern-i\.pdf$144050%2880ignore-reload
refresh_pattern-i\.rar$144050%2880ignore-reload
refresh_pattern-i\.zip$144050%2880ignore-reload
refresh_pattern-i\.txt$144050%2880ignore-reload
quick_abort_min20KB
quick_abort_max20KB
quick_abort_pct95
connect_timeout1minute
negative_ttl0minutes
read_timeout30seconds
pconn_timeout120seconds
shutdown_lifetime5seconds
strip_query_termsoff
####对端口的acl
aclSafe_portsport80#http
aclSafe_portsport21#ftp
aclSafe_portsport443563#https,snews
aclSafe_portsport70#gopher
aclSafe_portsport210#wais
aclSafe_portsport1025-65535#unregisteredports
aclSafe_portsport280#http-mgmt
aclSafe_portsport488#gss-http
aclSafe_portsport591#filemaker
aclSafe_portsport777#multilinghttp
http_accessdeny!Safe_ports
viaoff
httpd_suppress_version_stringoff#隐藏服务器信息
#log日志的轮换天数
logfile_rotat6
#####下面是一些访问控制、日志和缓存目录的设置
#设置不缓存url类型(空格隔开)
aclQUERYurlpath_regex.php.jsp.asp.pl.cgi
cachedenyQUERY
#-------------------------------------------------------------------------------------------
#设置最大连接数
#maxconnACL指来自客户IP地址的大量同时连接。某些squid管理员发现这是个有
#用的方法,用以阻止用户滥用代理或者消耗过多资源。maxconnACL在请求超过指#定的数量时,会匹配这个请求。因为这个理由,你应该仅仅在deny规则里使用#maxconn。下面的例子是:在该情况中,squid允许来自每个IP地址的同时连接数最
#大为10个。当某个客户发起第11个连接时,OverConnLimitACL被匹配,http_access#规则拒绝该请求。
#---------------------------------------------------------------------------------------------
aclOverConnLimitmaxconn10
http_accessdenyOverConnLimit
acllocalnetsrc192.168.76.223192.168.76.224192.168.76.225
#aclallsrc0.0.0.0/0.0.0.0不要在squid3.0里写这一行,因为squid3.0已经集成了all的定
#义,如果写了这一行会报0.0.0.0的错误
http_accessallowall
cache_peer_accesswebServer1allowall
cache_peer_accesswebServer2allowall
cache_peer_accesswebServer3allowall
icp_accessallowlocalnet
#日志格式,设置access_log中日志存储的格式
logformatsquid%ts.%03tu%6tr%>a%Ss/%03Hs%<st%rm%ru%un%Sh/%<A%mt
access_log/usr/local/squid/var/logs/access.logsquid
#设置PID
pid_filename/usr/local/squid/var/logs/squid.pid
cache_log/usr/local/squid/var/logs/cache.log
#不记录store.log
cache_store_lognone
###### #错误信息目录
error_directory/usr/local/squid/share/errors/Simplify_Chinese
######缓存目录
cache_dirufs/usr/local/squid/var/cache/100016256
max_open_disk_fds0
#缓存内容大小控制,当cache目录被占用到97%时,内容将被清空20%
cache_swap_low80
cache_swap_high97
#######对squid的一些优化###############
###最大和最小缓存对象
maximum_object_size20MB
minimum_object_size0KB
###内存中缓存的最大对象5M
maximum_object_size_in_memory5MB
###squid用于缓存的内存量一般内存的的1/3或1/2+100M,不可太多
cache_mem256MB
#MISCELLANEOUS
store_objects_per_bucket15
client_dboff
##############http-header###############################header安全配置
reply_header_accessViadenyall
reply_header_accessCache-Controldenyall
reply_header_accessServerdenyall
reply_header_accessX-Squid-Errordenyall
reply_header_accessX-Forwarded-Fordenyall
request_header_accessViadenyall
request_header_accessAgedenyall
request_header_accessX-Squid-Errordenyall
request_header_accessPragmadenyall
保存后:wq退出。
在/etc/hosts文件中添加
192.168.76.223squid1.ibm.com.cn
192.168.76.224squid2.ibm.com.cn
192.168.76.225squid3.ibm.com.cn
保存后:wq退出。
#addusersquid
#addgroupsquid
#mkdir/usr/local/squid/var/cache
#mkdir/usr/local/squid/var/logs
#chown-Rsquid:squid/usr/local/squid/var/cache//默认nobody运行
#chown-Rsquid:squid/usr/local/squid/var/logs
检查squid配置文件正确与否:
生成缓存目录
以后台方式启动
配置squid2和squid3服务器
squid2和squid3服务器的配置方法和配置参数和squid1一样,配置完成后,分别启动这两个服务器上的squid服务。
在squid的日志文件cache.log中,出现如下日志信息则说明三台squid之间成功配置为sibling,且配置了三个父代理。
2008/11/1710:08:47|ConfiguringSiblingsquid1.ibm.com.cn/80/31302008/11/1710:08:47|ConfiguringSiblingsquid3.ibm.com.cn/80/31302008/11/1710:08:47|ConfiguringParent210.82.118.195/8080/02008/11/1710:08:47|ConfiguringParent192.168.76.226/8080/02008/11/1710:08:47|ConfiguringParent192.168.76.227/8080/02008/11/1710:08:47|Readytoserverequests.
测试
测试之前,保证DNS服务、三台squid服务和三台web服务都正常起来。在客户端输入http://wenjin.cache.ibm.com.cn,则正确的显示该网页。服务器端的响应对客户端是透明的,客户端不知道请求是由哪台WEB服务器处理的;而且其中某台Squid服务器或WEB服务器发生故障,也不影响服务的正常运行。
回页首
总结
Squid是一个开源的软件,利用它的反向代理技术可以提高网站系统的访问速度。本文在真实的网络环境下,利用三台squid反向代理服务器加速了网站的性能,同时结合DNS轮询技术实现了网站的负载均衡。经过一段时间的测试和试运行,该网站的访问速度和可用性方面都有很大的提高,从未出现过网站服务中断情况。
squid常用命令详解:
1、初始化你在squid.conf里配置的cache目录
#squid/sbin/squid-z//第一次启动squid服务时必须输入此命令
如果有错误提示,请检查你的cache目录的权限。
2、对你的squid.conf排错,即验证squid.conf的语法和配置。
#squid/sbin/squid-kparse
如果squid.conf有语法或配置错误,这里会返回提示你,如果没有返回,恭喜,可以尝试启动squid.
3、在前台启动squid,并输出启动过程。
#squid/sbin/squid-N-d1
如果有到readytoserverreques,恭喜,启动成功。
然后ctrl+c,停止squid,并以后台运行的方式启动它。
4、启动squid在后台运行。
#squid/sbin/squid-s
这时候可以ps-A来查看系统进程,可以看到俩个squid进程。
5、停止squid
#squid/sbin/squid-kshutdown
假如因为某些理由,squid.pid文件丢失或不可读,squid-k命令会失败。在此情形下,你可以用#pkill-9squid来强制关闭
6、重引导修改过的squid.conf
#squid/sbin/squid-kreconfigure
这个估计用的时候比较多,当你发现你的配置有不尽你意的时候,可以随时修改squid.conf,然后别忘记对你的squid.conf排错,然后再执行此指令,即可让运行中squid重新按照你的squid.conf来运行。
7、把squid添加到系统启动项
编辑/etc/rc.d/rc.local
添加如下行:/usr/local/squid/sbin/squid-s
当然,并不是每个人都喜欢这种启动方式,你可以用你最习惯的方式;或者把它安装为服务。
8、滚动日志文件
除非你在squid.conf里禁止,squid会写大量的日志文件。你必须周期性的滚动日志文件,以阻止它们变得太大。squid将大量的重要信息写入日志,假如写不进去了,squid会发生错误并退出。为了合理控制磁盘空间消耗,在cron里使用如下命令:
%squid-krotate
例如,如下任务接口在每天的早上4点滚动日志:
04***/usr/local/squid/sbin/squid-krotate
该命令做两件事。首先,它关闭当前打开的日志文件。然后,通过在文件名后加数字扩展名,它重命名cache.log,store.log,和access.log。例如,cache.log变成cache.log.0,cache.log.0变成cache.log.1,如此继续,滚动到logfile_rotate选项指定的值。
squid仅仅保存每个日志文件的最后logfile_rotate版本。更老的版本在重命名过程中被删除。假如你想保存更多的拷贝,你需要增加logfile_rotate限制,或者编写脚本用于将日志文件移动到其他位置。
本文在介绍squid反向代理的工作原理的基础上,指出反向代理技术在提高网站访问速度,增强网站可用性、安全性方面有很好的用途。作者在具体的实验环境下,利用DNS轮询和Squid反向代理技术,实现了网站的负载均衡,从而提高了网站的可用性和可靠性。
现在有许多大型的门户网站如SINA都采用squid反向代理技术来加速网站的访问速度,可将不同的URL请求分发到后台不同的WEB服务器上,同时互联网用户只能看到反向代理服务器的地址,加强了网站的访问安全。
反向代理的概念
反向代理服务器又称为WEB加速服务器,它位于WEB服务器的前端,充当WEB服
务器的内容缓存器。其系统结构如图1
图1.系统结构
反向代理服务器是针对WEB服务器设置的,后台WEB服务器对互联网用户是透明的,用户只能看到反向代理服务器的地址,不清楚后台WEB服务器是如何组织架构的。当互联网用户请求WEB服务时,DNS将请求的域名解析为反向代理服务器的IP地址,这样URL请求将被发送到反向代理服务器,由反向代理服务器负责处理用户的请求与应答、与后台WEB服务器交互。利用反向代理服务器减轻了后台WEB服务器的负载,提高了访问速度,同时避免了因用户直接与WEB服务器通信带来的安全隐患。
Squid反向代理的实现原理
目前有许多反向代理软件,比较有名的有Nginx和Squid。Nginx是由IgorSysoev为俄罗斯访问量第二的Rambler.ru站点开发的,是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器。
Squid是由美国政府大力资助的一项研究计划,其目的为解决网络带宽不足的问题,支持
HTTP,HTTPS,FTP等多种协议,是现在Unix系统上使用、最多功能也最完整的一套软体。下面将重点介绍Squid反向代理的实现原理和在提高网站性能方面的应用。
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-c
ache
利用Squid反向代理加速网站实例
本实例的域名是wenjin.cache.
ibm.com.cn,通过
DNS的轮询技术,将客户端的请求分发给其中一台Squid反向代理服务器处理,如果这台Squid缓存了用户的请求资源,则将请求的资源直接返回给用户,否则这台Squid将没有缓存的请求根据配置的规则发送给邻居Squid和后台的WEB服务器处理,这样既减轻后台WEB服务器的负载,又提高整个网站的性能和安全性。该系统结构图3如下:
图3.系统结构
配置的系统环境:
一台DNS服务器:操作系统Freebsd,软件BIND9.5,IP192.168.76.222;
三台Squid服务器:操作系统LinuxAS4,软件Squid3.0,相应的IP如下:
Squid1:192.168.76.223Squid2:192.168.76.224Squid3:192.168.76.225
三台WEB服务器:操作系统LinuxAS4,应用软件Tomcat5.0+Mysql,相应的IP地址如下:
webServer1:210.82.118.195webServer2:192.168.76.226webServer1:192.168.76.227
应用软件的安装和配置
配置DNS服务器
软件利用Freebsd自带的bind9.5。然后针对该系统配置bind,首先修改bind的配置文件/etc/namedb/named.conf,在文件中添加
zone"cache.ibm.com.cn"{typemaster;file"master/cache.ibm.com.cn";};
再在/etc/namedb/master目录下添加cache.ibm.com.cn文件,该文件的内容如下:
$TTL3600@INSOAsearch.ibm.com.cn.root.ibm.com.cn.(20080807;Serial3600;Refresh900;Retry3600000;Expire3600);MinimumINNSsearch.ibm.com.cn.1INPTRlocalhost.ibm.com.cn.wenjinINA192.168.76.223wenjinINA192.168.76.224wenjinINA192.168.76.225
这样当用户请求的时候,DNS通过轮询机制将wenjin.cache.ibm.com.cn的域名解析为192.168.76.223、192.168.76.224和192.168.76.225其中之一。
配置完成后,运行rndcstart启动bind服务。可在/etc/rc.conf中设置named_enable="YES"使得开机自启动。
用ps–A|grepnamed查看bind服务是否起来;
用nslookupwenjin.cache.ibm.com.cn测试bind服务是否正常运行。
配置Squid1服务器
1.先安装gccgcc-c++opensslopenssl-devel的工具
yum-yinstallgccgcc-c++opensslopenssl-devel
2.修改描述符参数值
文件描述符用来限制一个程序能同时打开的文件数目,默认是1024。也就是说,如果不修
改文件描述符,那么一个程序只能同时打开1024个文件,而Squid会同时打开成千上万个
文件,所以远远是不够的,为了保证最高的效率和响应速度,要更改文件描述符的大小.
两种情况:a.用户每次访问squid,squid会按照需要打开文件,然后读取文件内容再返回给用户。
b.squid预先打开访问频率高的文件,用户访问squid,squid直接把内容返回给用户。相对来
说,后面的方法可以对用户的请求进行更加快的反应。
首先修改以下两个文件。
/usr/include/bits/typesizes.h
/usr/include/linux/posix_types.h
用vi打开上面的文件查找
#define__FD_SETSIZE1024
把1024改为65536,然后保存,这是Linux能接受的最大数值。
刚才编辑的这两个文件是C/C++程序里面的头文件,编译squid的时候会被自动引用。除了
这两个文件以外,我们还需要对当前环境进行设置。也就是你用ssh登录到系统时的一些
设定。每个登录进程都可以进行单独的设置,当关闭目前登录回话,环境变量的设置就失效
了
ulimit用来设置当前环境的一些资源限制。这个命令是对环境进行设置,所以退出当前登录
进程后命令将会失效。
我们输入下面的命令
[root@serversoft]#ulimit-Hs65536
[root@serversoft]#ulimit-n65536
也可以永久修改这些限制,开机自动生效,配置如下:
vi/etc/security/limits.conf,添加以下内容
*softnofile65536
*hardnofile65536
H参数是硬性限制,s是堆栈上限,n是文件描述符上限。
重启一下机器
注释:
ulimit参数介绍:
-H设置硬件资源限制.
-S设置软件资源限制.
-a显示当前所有的资源限制.
-csize:设置core文件的最大值.单位:blocks
-dsize:设置数据段的最大值.单位:kbytes
-fsize:设置创建文件的最大值.单位:blocks
-lsize:设置在内存中锁定进程的最大值.单位:kbytes
-msize:设置可以使用的常驻内存的最大值.单位:kbytes
-nsize:设置内核可以同时打开的文件描述符的最大值.单位:n
-psize:设置管道缓冲区的最大值.单位:kbytes
-ssize:设置堆栈的最大值.单位:kbytes
-tsize:设置CPU使用时间的最大上限.单位:seconds
-vsize:设置虚拟内存的最大值.单位:kbytes
下载squid-3.0.STABLE8.tar.gz源码包,将其放在/home目录下
3.临时端口范围
临时端口是TCP/IP栈分配给出去连接的本地端口。换句话说,当squid发起一条连接到另一台服务器,内核给本地socket分配一个端口号。这些本地端口号有特定的范围限制。
例如,在FreeBSD上,默认的临时端口范围是1024-5000。
临时端口号的短缺对非常忙的代理服务器(例如每秒数百个连接)来说,会较大的影响性能。这是因为一些TCP连接在它们被关闭时进入TIME_WAIT状态。当连接进入TIME_WATI状态时,临时端口号不能被重用。
你能使用netstat命令来显示有多少个连接进入这个状态:
%netstat-n|grepTIME_WAIT
ProtoRecv-QSend-QLocalAddressForeignAddress(state)
tcp400192.43.244.42.19583212.67.202.80.80TIME_WAIT
tcp400192.43.244.42.19597202.158.66.190.80TIME_WAIT
tcp400192.43.244.42.19600207.99.19.230.80TIME_WAIT
tcp400192.43.244.42.19601216.131.72.121.80TIME_WAIT
tcp400192.43.244.42.19602209.61.183.115.80TIME_WAIT
tcp400192.43.244.42.3128128.109.131.47.25666TIME_WAIT
tcp400192.43.244.42.3128128.109.131.47.25795TIME_WAIT
tcp400192.43.244.42.3128128.182.72.190.1488TIME_WAIT
tcp400192.43.244.42.3128128.182.72.190.2194TIME_WAIT
注意这个例子中既有客户端连接又有服务器端的连接。客户端连接有3128作为临时端口号,服务器端连接有80作为远程主机的端口号。临时端口号出现在本地地址栏里。在该例子里,它们是19000秒。
如果你没有看到数千个临时端口在TIME_WAIT状态,那也许不必增加这个端口范围。
在Freebsd上,用如下命令增加临时端口范围:
#sysctl-wnet.inet.ip.portrange.last=30000
在Linux上,简单的写一对数字到下列指定文件:
#echo"102440000">;/proc/sys/net/ipv4/ip_local_port_range
不要忘记将这些命令加到你的系统启动脚本中,以使机器每一次重启后都生效。
解压缩
tar–zxvfsquid-3.0.STABLE8.tar.gz
设置配置参数:
cdsquid-3.0.STABLE10
./configure--prefix=/usr/local/squid--enable-gnuregex--enable-arp-acl--enable-auth="basic"--enable-basic-auth-helpers="NCSA"--enable-async-io=80--enable-storeio=ufs--enable-icmp--enable-kill-parent-hack--enable-snmp--disable-ident-lookups--enable-cache-digests--enable-ssl--enable-delay-pools--enable-linux-netfilter--enable-underscore--enable-err-language="Simplify_Chinese"--enable-default-err-languages="Simplify_Chinese"--with-large-files-disable-mempools-disable-wccp-disable-wccpv2-enable-x-accelerator-var--enable-internal-dns
解释说明:
--prefix=/usr/local/squid//指定安装路径
--enable-arp-acl//这样可以在规则设置中直接通过客户端的MAC地址进行管理,防止客户使用IP欺骗
--enable-async-io=80//这个主要是设置async模式来运行squid,我的理解是设置用线程来运行squid,如果服务器配置很不错,有1G以上内存,cpu使用SMP的方式的话可以考虑设成160或者更高。如果服务器比较糟糕就根据实际情况设了。另外此项还另cache文件支持aufs
--enable-auth-modules//此编译选项启用认证模块,可以对访问代理用户进行授权。
--enable-cache-digests//使能缓存摘要,本来此项目的是为了在Squid集群服务之间迅速发现缓存对象,这里在本地使用,可以加快请求时,检索缓存内容的速度。
--enable-err-language="Simplify_Chinese"和--enable-default-err-languages="Simplify_Chinese"//指定出错是显示的错误页面为简体中文
--enable-delay-pools//此选项使能一个延时池,这样能对某些特定的请求限制额定带宽。
--enable-gnuregex//由于Squid大量使用字符串处理做各种判断,加此项能更好处理。
--enable-icmp//加入icmp支持
--disable-ident-lookups//防止系统使用RFC931规定的身份识别方法。
--enable-kill-parent-hack//关掉suqid的时候,要不要连同父进程一起关掉,这个当然要啦
--enable-linux-netfilter//允许使用Linux的透明代理功能。
--enable-snmp//此选项可以让MRTG使用SNMP协议对服务器的流量状态进行监测,因此必须选择此项,使Squid支持SNMP接口。
--enable-storeio=ufs,null//使用的文件系统通常是默认的ufs,不过如果想要做一个不缓存任何文件的代理服务器,就需要加上null文件系统。
--enable-underscore//允许解析的URL中出现下划先,因为默认squid会认为带下划线的URL地址是非法的,并拒绝访问该地址。
--with-large-files//让log支持大于2G,设置支持大文件,如果不设置,日志文件到了2G的时候squid就会报错
-disable-mempools//相当于2.7配置文件里面的memory_poolsoff,适合内存使用较大的情况,系统会调用free()来清除没用到的缓存内存
–with-maxfd=65535相当于ulimit-n65535,2.7配置文件里面的max_filedescriptors65535
--enable-internal-dns做多个网站反向代理时使用,允许使用内部dns,也可改/etc/hosts
--disable-wccp禁用WCCP协议
--disable-wccpv2禁用WCCP协议V2
编译安装:
make&makeinstall
假如你通过使用--enable-icmp选项,激活了squid的ICMP衡量功能,那么必须安装pinger程序。pinger程序必须以超级用户权限安装,因为仅仅允许root来发送和接受ICMP消息。
下列命令以相应的许可来安装pinger程序:
#makeinstall-pinger
安装完以后会在/usr/local目录下看见squid目录。
配置squid配置文件
编辑squid.conf文件,
vi/usr/local/squid/etc/squid.conf
#设置运行squid用户
cache_effective_usersquid
cache_effective_groupsquid
#########设定squid的主机名,如无此项squid将无法启动
visible_hostnamesquid1.nlc.gov.cn
#############配置squid为加速模式#################
http_port80accelvhostvport
icp_port3130
#####设置自己的hosts文件,当没有DNS的使用
hosts_file/etc/hosts
#####配置squid2、squid3为其邻居,当squid1在其缓存中没有找到请求的资源时,#通过ICP查询去其邻居中取得缓存
cache_peersquid2.ibm.com.cnsibling803130
cache_peersquid3.ibm.com.cnsibling803130
#####squid1的三个父节点,originserver参数指明是源服务器,round-robin参数指明#squid通过轮询方式将请求分发到其中一台父节点;squid同时会对这些父节点的健#康状态进行检查,如果父节点down了,那么squid会从剩余的origin服务器中抓
#取数据
cache_peer210.82.118.195parent80800no-queryoriginserverround-robinname=webServer1
cache_peer192.168.76.226parent80800no-queryoriginserverround-robinname=webServer2
cache_peer192.168.76.227parent80800no-queryoriginserverround-robinname=webServer3
####将wenjin.cache.ibm.com.cn域的请求通过RR轮询方式转发到三个父节点中的一#个
cache_peer_domainwebServer1webServer2webServer3wenjin.cache.ibm.com.cn
#keepalived
#因为现在的IE都是多线程,考虑到服务器带宽等网络资源消耗,所以长链接关闭
client_persistent_connectionsoff
#服务端长链接是用于在服务器端传递消息时使用已打开的socket链接以节省资源而
#设置的。
server_persistent_connectionson
#关闭此项将在访问某些论坛时显示的IP是代理服务器的IP,如果打开则显示是客户
#请求IP
forwarded_foron
log_icp_queriesoff#是否记录icp请求
request_header_max_size128KB#限制http请求header头得大小
####设置过期刷新时间
refresh_pattern^ftp:6020%10080
refresh_pattern^gopher:600%1440
refresh_pattern.020%1440
refresh_pattern-i\.css$36050%2880reload-into-ims
refresh_pattern-i\.js$144050%2880reload-into-ims
refresh_pattern-i\.html$72050%1440reload-into-ims
refresh_pattern-i\.jpg$144090%2880ignore-reload
refresh_pattern-i\.gif$144090%2880ignore-reload
refresh_pattern-i\.swf$144090%2880ignore-reload
refresh_pattern-i\.jpg$144050%2880ignore-reload
refresh_pattern-i\.png$144050%2880ignore-reload
refresh_pattern-i\.bmp$144050%2880ignore-reload
refresh_pattern-i\.doc$144050%2880ignore-reload
refresh_pattern-i\.ppt$144050%2880ignore-reload
refresh_pattern-i\.xls$144050%2880ignore-reload
refresh_pattern-i\.pdf$144050%2880ignore-reload
refresh_pattern-i\.rar$144050%2880ignore-reload
refresh_pattern-i\.zip$144050%2880ignore-reload
refresh_pattern-i\.txt$144050%2880ignore-reload
quick_abort_min20KB
quick_abort_max20KB
quick_abort_pct95
connect_timeout1minute
negative_ttl0minutes
read_timeout30seconds
pconn_timeout120seconds
shutdown_lifetime5seconds
strip_query_termsoff
####对端口的acl
aclSafe_portsport80#http
aclSafe_portsport21#ftp
aclSafe_portsport443563#https,snews
aclSafe_portsport70#gopher
aclSafe_portsport210#wais
aclSafe_portsport1025-65535#unregisteredports
aclSafe_portsport280#http-mgmt
aclSafe_portsport488#gss-http
aclSafe_portsport591#filemaker
aclSafe_portsport777#multilinghttp
http_accessdeny!Safe_ports
viaoff
httpd_suppress_version_stringoff#隐藏服务器信息
#log日志的轮换天数
logfile_rotat6
#####下面是一些访问控制、日志和缓存目录的设置
#设置不缓存url类型(空格隔开)
aclQUERYurlpath_regex.php.jsp.asp.pl.cgi
cachedenyQUERY
#-------------------------------------------------------------------------------------------
#设置最大连接数
#maxconnACL指来自客户IP地址的大量同时连接。某些squid管理员发现这是个有
#用的方法,用以阻止用户滥用代理或者消耗过多资源。maxconnACL在请求超过指#定的数量时,会匹配这个请求。因为这个理由,你应该仅仅在deny规则里使用#maxconn。下面的例子是:在该情况中,squid允许来自每个IP地址的同时连接数最
#大为10个。当某个客户发起第11个连接时,OverConnLimitACL被匹配,http_access#规则拒绝该请求。
#---------------------------------------------------------------------------------------------
aclOverConnLimitmaxconn10
http_accessdenyOverConnLimit
acllocalnetsrc192.168.76.223192.168.76.224192.168.76.225
#aclallsrc0.0.0.0/0.0.0.0不要在squid3.0里写这一行,因为squid3.0已经集成了all的定
#义,如果写了这一行会报0.0.0.0的错误
http_accessallowall
cache_peer_accesswebServer1allowall
cache_peer_accesswebServer2allowall
cache_peer_accesswebServer3allowall
icp_accessallowlocalnet
#日志格式,设置access_log中日志存储的格式
logformatsquid%ts.%03tu%6tr%>a%Ss/%03Hs%<st%rm%ru%un%Sh/%<A%mt
access_log/usr/local/squid/var/logs/access.logsquid
#设置PID
pid_filename/usr/local/squid/var/logs/squid.pid
cache_log/usr/local/squid/var/logs/cache.log
#不记录store.log
cache_store_lognone
###### #错误信息目录
error_directory/usr/local/squid/share/errors/Simplify_Chinese
######缓存目录
cache_dirufs/usr/local/squid/var/cache/100016256
max_open_disk_fds0
#缓存内容大小控制,当cache目录被占用到97%时,内容将被清空20%
cache_swap_low80
cache_swap_high97
#######对squid的一些优化###############
###最大和最小缓存对象
maximum_object_size20MB
minimum_object_size0KB
###内存中缓存的最大对象5M
maximum_object_size_in_memory5MB
###squid用于缓存的内存量一般内存的的1/3或1/2+100M,不可太多
cache_mem256MB
#MISCELLANEOUS
store_objects_per_bucket15
client_dboff
##############http-header###############################header安全配置
reply_header_accessViadenyall
reply_header_accessCache-Controldenyall
reply_header_accessServerdenyall
reply_header_accessX-Squid-Errordenyall
reply_header_accessX-Forwarded-Fordenyall
request_header_accessViadenyall
request_header_accessAgedenyall
request_header_accessX-Squid-Errordenyall
request_header_accessPragmadenyall
保存后:wq退出。
在/etc/hosts文件中添加
192.168.76.223squid1.ibm.com.cn
192.168.76.224squid2.ibm.com.cn
192.168.76.225squid3.ibm.com.cn
保存后:wq退出。
#addusersquid
#addgroupsquid
#mkdir/usr/local/squid/var/cache
#mkdir/usr/local/squid/var/logs
#chown-Rsquid:squid/usr/local/squid/var/cache//默认nobody运行
#chown-Rsquid:squid/usr/local/squid/var/logs
检查squid配置文件正确与否:
/usr/local/squid/bin/squid–kparse
生成缓存目录
/usr/local/squid/bin/squid–z
以后台方式启动
squid:/usr/local/squid/bin/squid-s
配置squid2和squid3服务器
squid2和squid3服务器的配置方法和配置参数和squid1一样,配置完成后,分别启动这两个服务器上的squid服务。
在squid的日志文件cache.log中,出现如下日志信息则说明三台squid之间成功配置为sibling,且配置了三个父代理。
2008/11/1710:08:47|ConfiguringSiblingsquid1.ibm.com.cn/80/31302008/11/1710:08:47|ConfiguringSiblingsquid3.ibm.com.cn/80/31302008/11/1710:08:47|ConfiguringParent210.82.118.195/8080/02008/11/1710:08:47|ConfiguringParent192.168.76.226/8080/02008/11/1710:08:47|ConfiguringParent192.168.76.227/8080/02008/11/1710:08:47|Readytoserverequests.
测试
测试之前,保证DNS服务、三台squid服务和三台web服务都正常起来。在客户端输入
总结
Squid是一个开源的软件,利用它的反向代理技术可以提高网站系统的访问速度。本文在真实的网络环境下,利用三台squid反向代理服务器加速了网站的性能,同时结合DNS轮询技术实现了网站的负载均衡。经过一段时间的测试和试运行,该网站的访问速度和可用性方面都有很大的提高,从未出现过网站服务中断情况。
squid常用命令详解:
1、初始化你在squid.conf里配置的cache目录
#squid/sbin/squid-z//第一次启动squid服务时必须输入此命令
如果有错误提示,请检查你的cache目录的权限。
2、对你的squid.conf排错,即验证squid.conf的语法和配置。
#squid/sbin/squid-kparse
如果squid.conf有语法或配置错误,这里会返回提示你,如果没有返回,恭喜,可以尝试启动squid.
3、在前台启动squid,并输出启动过程。
#squid/sbin/squid-N-d1
如果有到readytoserverreques,恭喜,启动成功。
然后ctrl+c,停止squid,并以后台运行的方式启动它。
4、启动squid在后台运行。
#squid/sbin/squid-s
这时候可以ps-A来查看系统进程,可以看到俩个squid进程。
5、停止squid
#squid/sbin/squid-kshutdown
假如因为某些理由,squid.pid文件丢失或不可读,squid-k命令会失败。在此情形下,你可以用#pkill-9squid来强制关闭
6、重引导修改过的squid.conf
#squid/sbin/squid-kreconfigure
这个估计用的时候比较多,当你发现你的配置有不尽你意的时候,可以随时修改squid.conf,然后别忘记对你的squid.conf排错,然后再执行此指令,即可让运行中squid重新按照你的squid.conf来运行。
7、把squid添加到系统启动项
编辑/etc/rc.d/rc.local
添加如下行:/usr/local/squid/sbin/squid-s
当然,并不是每个人都喜欢这种启动方式,你可以用你最习惯的方式;或者把它安装为服务。
8、滚动日志文件
除非你在squid.conf里禁止,squid会写大量的日志文件。你必须周期性的滚动日志文件,以阻止它们变得太大。squid将大量的重要信息写入日志,假如写不进去了,squid会发生错误并退出。为了合理控制磁盘空间消耗,在cron里使用如下命令:
%squid-krotate
例如,如下任务接口在每天的早上4点滚动日志:
04***/usr/local/squid/sbin/squid-krotate
该命令做两件事。首先,它关闭当前打开的日志文件。然后,通过在文件名后加数字扩展名,它重命名cache.log,store.log,和access.log。例如,cache.log变成cache.log.0,cache.log.0变成cache.log.1,如此继续,滚动到logfile_rotate选项指定的值。
squid仅仅保存每个日志文件的最后logfile_rotate版本。更老的版本在重命名过程中被删除。假如你想保存更多的拷贝,你需要增加logfile_rotate限制,或者编写脚本用于将日志文件移动到其他位置。
相关文章推荐
- 利用 squid 反向代理提高网站性能(转)
- 利用 squid 反向代理提高网站性能
- 利用 squid 反向代理提高网站性能
- 利用 squid 反向代理提高网站性能原理总结
- 利用 squid 反向代理提高网站性能
- 利用squid 反向代理提高网站性能
- 利用 squid 反向代理提高网站性能
- 利用 squid 反向代理提高网站性能
- 利用 squid 反向代理提高网站性能
- 利用 squid 反向代理提高网站性能
- 利用 squid 反向代理提高网站性能
- 利用 squid 反向代理提高网站性能(转载)
- 利用 squid 反向代理提高网站性能
- 利用 squid 反向代理提高网站性能
- 利用 squid 反向代理提高网站性能
- 利用 squid 反向代理提高网站性能
- 利用 squid 反向代理提高网站性能
- 利用 squid 反向代理提高网站性能
- 利用 squid 反向代理提高网站性能
- 利用 squid 反向代理提高网站性能