squid高性能代理缓存服务器

--


squid   

http://www.squid-cache.org/


squid软件主要有两大应用:1,代理上网(正向代理,透明代理)
 		     2,网站静态页面缓存加速(反向代理)



三种代理类型

正向代理	代理内部主机上网,共享上网,缓存,控制内网用户上网行为等功能(客户端需要设置代理服务器的IP和代理端口)	
透明代理	和正向代理的功能完全一致(客户端不需要设置代理服务器的IP和代理端口,对用户是透明的)


			外网
			 |
			modem
			 |
			路由器(dhcp,snat共享上网,上网行为控制,限速等)
			 |
			 |
		 squid正向代理(共享上网,静态页面缓存加速,内网用户四七层上网行为控制,限速等)
			 |
			 |	
		|----------------------|
	     上网用户一		    上网用户二



反向代理	从外部网络访问内部服务器,与正向方向相反,主要用于网站架构的缓存加速或CDN


			client
			  |
			  |
			反向代理 (缓存加速,七层切分,负载均衡,会话保持等)
			  |
			  |	
			  web



===================================================================


正向代理实验


			公网
			 |
			 |	
			br0	172.16.13.250
			squid 服务器 
			virbr1	192.168.100.1		   
			 |
			 |
			 |	
			内网用户VM1          	   	
			eth0(virbr1)			
			192.168.100.128			 



准备这个拓扑图要注意的地方
1,宿主机(squid服务器)需要能上外网,在这里就是指向公司的路由器
2,192.168.100.0网络,我这里使用kvm的virbr1网段来模拟
3,内网用户只要与squid服务器能ping通就行,不用指网关和DNS
4,内网用户需要安装图形界面,并安装firefox浏览器
5,squid服务器能上外网,但内网用户不能上外网,我们的目地就是让squid代理内网用户上外网




第一步:在squid服务器上安装squid


# yum install squid -y

扩展:安装完后,会有一份官方文件在下面的路径下
/usr/share/doc/squid-3.5.20/squid.conf.documented


第二步:修改配置文件


# vim /etc/squid/squid.conf

 http_access allow all				--把deny all改成allow all
 cache_dir ufs /var/spool/squid 100 16 256	--把缓存目录这一句打开注释 100代表可缓存空间(单位:M) 
后两个数字含义:squid会创建2级目录树在缓存目录,16指第一层,256指第二层各是多少目录数,真正缓存目录放在二级目录下,并且数据存放是按次序的。



如果要简单优化,则可以加上cache_mem参数,你多余的内存大小都可以指定给cache_mem
比如
cache_mem   5000M
cache_dir ufs /var/spool/squid 5000 16 256	



			内存---》磁盘
		    cache_mem     /var/spool/squid
	


---------------------------------------------------------



第三步:
启动服务
# systemctl start squid


# lsof -i:3128	--查看3128端口
COMMAND  PID  USER   FD   TYPE DEVICE SIZE NODE NAME
squid   4937 squid   12u  IPv4  36871       TCP *:squid (LISTEN)


第四步:
客户端的测试 

不用设置网关和DNS指向


主要是修改浏览器

--filefox配置
firefox浏览器右上角open menu--preferences--advanced--network--settings--  手动填写代理服务器的IP和代理端口


--IE配置
右键IE图标--连接--局域网设置--为LAN使用代理服务器前打勾并填上代理服务器的内网IP及其代理端口



测试:
	访问已经访问过的页面是否能感觉到页面加快
	再次查看 du -s /var/spool/squid 发现增大,因为缓存了对象
	查看相关日志 /var/log/squid/access.log

--此日志可以看到所有被代理的内网用户访问的网址和时间等信息
# date -d "@1500620984" +'%F %T'


================================================================


透明(transparent)代理:


准备工作:先把上面的正向代理客户端的浏览器设置去掉


第一步:
在squid服务器上打开路由转发功能


# vim /etc/sysctl.conf 
net.ipv4.ip_forward = 1		

# sysctl -p


第二步:修改配置文件
# vim /etc/squid/squid.conf	

http_port 3128 intercept

# systemctl restart squid





第三步:配置iptables

client		       	squid			        公司路由器
		    virbr1        br0				
192.168.100.128	 192.168.100.1	172.16.13.250-->     172.16.13.254   公网IP
			  |					
			  |				
			  |				
client网关指向192.168.100.1-- 				
clientDNS指向114.114.114.114  ---------------------------------->外网DNS



由上面的分析,需要在squid服务器上写上一句snat,让DNS能正常访问外网
# iptables -F
# iptables -F -t nat
# iptables -F -t mangle
# iptables -t nat -A POSTROUTING -p udp --dport 53 -o br0 -j SNAT --to-source 172.16.13.250


这样的话,内网客户端的DNS OK了,但是http的80端口的访问如果也做一个SNAT的话,如下的规则:
# iptables -t nat -A POSTROUTING -p tcp --dport 80 -o br0 -j SNAT --to-source 172.16.13.250
那么这就做的是完全的通过iptables来上外网;与squid无关

所以应该换成下面一句规则,把80端口的访问都重定向到3128端口
# iptables -t nat -A PREROUTING -p tcp --dport 80 -i virbr1 -j REDIRECT --to-port 3128

还有443的端口问题,这里如果也重定向到3128,会出现访问https网站报ssl错误。我们这里把443用iptables直接SNAT转发出去(也就是说443与squid无关)
# iptables -t nat -A POSTROUTING -p tcp --dport 443 -o br0 -j SNAT --to-source 172.16.13.250


=========================================================================================================



squid的acl(access control list)访问控制

acl denyip src  192.168.100.128/32 	--拒绝内网的192.168.100.128/32上网
http_access deny denyip



acl denyip src 192.168.100.128-192.168.100.132/255.255.255.255
http_access deny denyip


acl vip  arp  00:0C:29:79:0C:1A 
http_access allow  vip 


acl  baddsturl2  dst   220.11.22.33  --不能访问这个外网IP的网站
http_access deny baddsturl2


acl  baddsturl  dstdomain -i  www.163.com  --不能访问www.163.com和WWW.163.COM;-i参数定义大小写都匹配;  但是可以访问war.163.com或sports.163.com
http_access deny baddsturl


acl  baddsturl  dstdom_regex -i  163	--这是把163以下的所有域名都禁止  ,但直接使用IP仍然是可以访问的
http_access deny   baddsturl


acl  baddsturl  dstdom_regex "/etc/squid/baddsturl"  --如果网址太多,可以写成一个文件,然后在这个文件里一行一个网站写上你要禁止的
http_access deny baddsturl



acl baddsturl3  url_regex  -i  baidu   --拒绝访问url里有baidu这个关键字的网站
http_access deny baddsturl3



acl badfile  urlpath_regex -i \.mp3$ \.rmvb$ \.exe$ \.zip$ \.mp4$ \.avi$  \.rar$
http_access deny badfile	--禁止下载带有定义后缀名的文件



acl badipclient2  src 192.168.100.0/255.255.255.0
acl worktime time  MTWHF 9:00-17:00
http_access deny badipclient2 worktime  --拒绝192.168.100.0网段工作时间不能上网



acl badipclient3  src 192.168.100.128
acl conn5  maxconn  5
http_access deny badipclient3 conn5	--最大连接数为5



实现如下要求:
	1,允许周一到周五12:00-14:00和17:30-21:00和双休能上网,别的时间不能上网
	2,禁止下载.exe  .rar  .mp3  .avi   .rmvb .mp4后缀的文件
	3,禁止访问qq.com,mop.com,sina.com,163.com,youku.com
	4,禁止访问网址中包含某些关键字的网站:比如 sex  news  movie sport game stock
	5, vip没有任何限制

acl lunchtime  time MTWHF 12:00-14:00
acl dinnertime time MTWHF 17:30-21:00
acl weekend  time SA 00:00-24:00
acl badfile urlpath_regex -i \.mp3$ \.rmvb$ \.exe$ \.zip$ \.mp4$ \.avi$  \.rar$
acl badweb  dstdom_regex "/etc/squid/denywebsite"
acl badword  url_regex  -i sex news movie sport game stock
acl vip arp 00:0C:29:79:0C:1A 

vim /etc/squid/denywebsite
qq
sina
mop
163
youku


--把上面五点情况做成两种需求:
1,上课时间不能上任何网站,休息时间可以上网,但受限, vip没有任何限制

http_access   允许  vip
http_access   拒绝  限制
http_access   允许  休息时间
http_access   deny   all

实验需求一:
http_access  allow vip
http_access  deny  badfile
http_access  deny  badweb
http_access  deny  badword
http_access  allow lunchtime
http_access  allow dinnertime
http_access  allow weekend
http_access  deny  all


2,上课时间可以上网,但受限,休息时间可以无限制上网, vip没有任何限制


http_access   允许  vip
http_access   允许  休息时间
http_access   拒绝  限制
http_access   allow   all

实验需求一:
http_access  allow  vip
http_access  allow  lunchtime
http_access  allow  dinnertime
http_access  allow  weekend
http_access  deny   badfile
http_access  deny   badweb
http_access  deny   badword
http_access  allow  all



=========================================================================================================



			client					国外客户
			  |					  |	
			反向代理					海外仓储	
			  |					  | 
			 web					国内公司




			client
			  |
			  |
			正向代理(静态加速)
			  |
			因特网
			  |
			  |
		   1个或多个反向代理(较近地理位置增强响应时间,静态缓存加速,网站数据切分)   cdn
			  |	
			  前端web
			   |
			 中间件
			  |
			 数据库
			  |
			 存储



			client 172.16.25.2	        要租房或买房的客户
			 |	
			 |	
			br0	172.16.25.1
			squid 服务器 			房产中介
			virbr1	192.168.100.1		   
			 |
			 |
			 |	
			内网web服务器VM1          	   	
			eth0(virbr1)			要出租或卖房的业主	
			192.168.100.128	



--注意:
192.168.100.1为squid的一个内网IP
172.16.25.1为squid的外网IP(也就是说在这个架构里squid在最前端)
172.16.25.2 为外网客户端


第一步:
在内网web服务器上安装httpd,并做一个主页用于测试
# yum install httpd* -y
# echo "内网web" > /var/www/html/index.html
# systemctl restart httpd



第二步:
在squid服务器上安装,并进行配置
# yum install squid -y

用一个新的配置文件;如果是在上面的透明代理基础上再做反向代理,先注释掉前面所有的配置

# vim /etc/squid/squid.conf

http_access allow all		--ACL我这里直接允许所有(这一句前面的ACL配置我这里全删除了)

http_port 80 accel vhost vport
			--accel 反向代理加速模式
			--vhost 支持域名或主机名来表示代理节点
			--vport 支持IP和端口来表示代理节点

cache_peer 192.168.100.128 parent 80 0 no-query originserver name=web

		--192.168.100.128  内网web服务器的IP
		--parent 上下关系,非平级关系
		--80 代理内部web服务器的80端口
		--0 没有使用icp,表示就一台squid服务器
		--no-query 不去查询邻居,与上面的0结合使用
		--originserver 表示源实际服务器
		--name=web 定义一个名字,让后面的参数引用

cache_peer_domain web web.cluster.com   --对web.cluster.com的请求会给web这台服务器(也就是上面定义的192.168.100.128);如果有多台web的话,可以多台web绑定同一个域名,还可以实现RR轮循调度
cache_peer_domain web 172.16.25.1	--光写上面一条,客户端只能通过web.cluster.com访问,再加上这条,客户端就可以使用172.16.25.1来访问




cache_dir ufs /var/spool/squid 256 16 256


# systemctl restart squid


--测试:

所以这里客户端的DNS解析web.cluster.com应该得到172.16.25.1的结果


所以这里不做DNS的话,就直接在/etc/hosts里写上

172.16.25.1  web.cluster.com


再使用http://web.cluster.com 就可以访问到内部的web服务器了

可以使用curl -I http://web.cluster.com去查有没有命中缓存


===================================================================================================


问题一:
squid如何代理多个web?

http_port 80 accel vhost vport

cache_peer 192.168.100.128 parent 80 0 no-query originserver round-robin name=web1
cache_peer 192.168.100.129 parent 80 0 no-query originserver round-robin name=web2
cache_peer 192.168.100.130 parent 80 0 no-query originserver round-robin name=web3
cache_peer 192.168.100.131 parent 80 0 no-query originserver round-robin name=web4

cache_peer_domain web1 web2 www.aaa.com
cache_peer_domain web3 web4 www.bbb.com






问题二:
如何配置下面的squid集群?

参考
http://www.ibm.com/developerworks/cn/linux/l-cn-squid




			172.16.25.X
			client	

			www.abc.com
		通过dns技术(dns轮循或智能dns);通过负载均衡软件(nginx,haproxy,lvs)
			


	   172.16.25.1		    172.16.25.2	
		squid1			squid2
	   192.168.100.1	   192.168.100.2


		web1			web2
	   192.168.100.128	  192.168.100.129 



配置过程
第一步:
两个web上安装httpd,并建立两个不同主面方便测试(注意这里所有的机器的时间一定要同步,特别是web1和web2;如果web1和web2的时间隔得太久,可能会造成客户端访问时,不先访问缓存而是访问后台web,也就是缓存失效了)


过程省略

第二步:
安装并配置squid1
# yum install squid -y
# vim /etc/squid/squid.conf
http_access allow all
cache_dir ufs /var/spool/squid 256 16 256
http_port 80 accel vhost vport

icp_port 3130
icp_access allow all
cache_peer 192.168.100.2 sibling 80 3130
cache_peer 192.168.100.128 parent 80 0 no-query originserver round-robin name=web1
cache_peer 192.168.100.129 parent 80 0 no-query originserver round-robin name=web2
cache_peer_domain web1 web2 www.abc.com

# /etc/init.d/squid start

第三步:
安装并配置squid2
把squid1的配置文件拷过来,只需要修改一个地方(就是sibling的IP)
# yum install squid -y
# vim /etc/squid/squid.conf
cache_peer 192.168.100.1 sibling 80 3130	 --把这个IP换成对方的IP

然后也启动服务
# /etc/init.d/squid start


第四步:
在客户端测试
vim /etc/hosts		--绑定IP地址与域名来模拟DNS(注意这里不能实现DNS轮循,所以手动绑定其中指定解析为squid1或squid2)
172.16.25.1	www.abc.com

vim /etc/hosts
172.16.25.2	www.abc.com



====================================================================================================











  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值