学习Squid(三)
Squid 缓存服务
1、缓存服务器结束
缓存服务器(cache server),即用来存储(介质为内存及硬盘)用户访问的网页、图片、文件等等信息的专用服务器,这种服务器不仅可以使用户可以最快的得到他们想要的信息,而且可以大大减少服务端网络传输的数据量,缓存服务器往往也是代理服务器,对于网站的用户来说,缓存服务器和代理是不可见的,即在用户看来所有的网站信息都是来自其正在访问的网站,而实际上可能是缓存服务器在提供访问数据
目前国内互联网公司常用的缓存服务器有:squid、varnish、nginx、ats。
第一次用户访问网站,先到squiq,但是squid没有数据,所以sqquid代理用户去服务端访问,之后数据也会保留在squid,所以下次用户访问的时候,可以直接从squid中获得,而不必再到服务器中取得数据。
官网:http://www.squid-cache.org/
2、web缓存的相关概念
a、cache命中
cache命中是在cache server每次从它的缓存里满足客户端http请求发送。cache命中率,是所有客户端HTTP请求中的命中比例,web缓存典型的cache命中率在30%到60%之间,另一个相似的度量单位叫做字节命中率,描述了cache提供服务的数据容量。
提供cache命中率的方法:
1、nginx/apache expries,cache-control缓存头
2、动静分离,静态化,对静态走CDN
3、设置数据库的cache等,如设置mysql 的cache,让缓存靠前
4、4XX/5XX之类的错误页面,死链无法缓存。
5、动态不走缓存
b、cache丢失
cache丢失在cache server不能从它的缓存里面满足客户端HTTP请求时发生,cache丢失的原因有很多种:
1、当cache server第一次接受到对第一个新资源的请求时,就会产生一个cache丢失,如何解决第一次命中?
先预热或者预取
a、内部先请求访问,可以通过脚本实现(但是这个思想不太靠谱)。
b、后端生成数据之后,统一推到前端cache server,即预取、预热
2、存储空间慢,或者对象自身过期,cache server会清除这些缓存对象,以释放空间给新对象
如果解决问题2:
a、增大内存或者磁盘。
b、增大对象缓存时间
c、参数设置,缓存参数设置打一下,最大缓存对象2M(想办法多缓存热门的数据)
d、分资源缓存,如1M/10M/100M不同大小的分开缓存。(分拆服务器,acl正则匹配抛给不同的pools)
3、还有可能是客户访问的资源不可到达,原始服务器指示cache server怎样处理用户响应,如:他会提示数据不能被缓存,或在有限的时间内才被重复使用等等。
a、
c、cache确认
cache确认保证cache server不对访问的用户返回过期的数据,在重复使用缓存对象时,cache server需要经常从原始服务器确认它,假如服务器指示squid的拷贝仍旧有效,数据就发送出去,否则,squid更新它的存储拷贝,并且转发给客户
当用户更新了数据到数据库或者存储服务器的时候,可以从业务角度主动调用接口清楚该对象缓存的指令。
对应缓存来讲,数据的一致性是一个特别头疼的问题,特别是memcached。
CDN删除数据一般需要5-15分钟才能删除完成。
图片放到CDN一般是不要更新了,图片修改算更新,这种业务就要推送。
删除图片再上传,这种不算修改,而是一个新的资源。老是数据,CDN会有相应的算法,在一定的时间内自动删除。
网站改版:在CDN上推送js、css(改名推送)等程序。
3、squid服务介绍
squid是一个高性能的代理和缓存服务器,squid支持FTP/gopher和HTTP协议,和一般的代理缓存软件不同,squid用一个单独的,非模块化的、I/O驱动的进程来处理所有的客户端请求。(gopher是internet上一个非常有名的信息查询系统,它将Internet上的文件组织成某种索引,很方便地将用户从Internet的一处带到另外一处,在WWW出现之前,GopherSHI Internet上主要的信息检索工具)
Squid将数据元缓存到内存或硬盘中,同时也缓存DNS查询结果,Squid只是SSL,支持访问控制,由于使用ICP(轻量Internet缓存协议),Squid能够实现层叠的代理阵列,从而最大限度的节约带宽
Squid Cache简称Squid,是一个流行的代理服务器和WEB缓存服务器软件,Squid服务有相当多的用途。
1、用于放置在WEB服务器的前面,缓存网站WEB服务器的相关数据。这样用户请求缓存服务器就可以直接返回数据给用户了,从而提升了用户的访问网站体验,从另外一方面也减轻了web服务器、数据服务器、图片文件存储服务器等业务服务器的压力。这种应用被称之为反向代理服务
2、用于放置在企业内部关键的出网位置或者某些共享的网络前端,缓存内部上网用户的数据,域名系统和其他网络搜索数据等,这样用户上网请求的数据,就可以有缓存服务器放回给内部用户,而不需要上网了,从而使得内部用户上网更快,更安全,也会大大节约公司的带宽,这种应用被称之为正向代理服务(分为普通代理或者透明代理)。(现在很少用,5年前,带宽很小的时候用得挺多)
3、通过放在网络的关键位置过滤网络流量和访问数据,提升整个网络安全,例如:可以监控及限制内部企业员工的上网行为,可以和iptables配合作为办公网的网关。
4、用作局域网通过代理上网
只要说是一台就可以上网的机器就可以,位置随便,让所有的用户的浏览器设置这个服务器代理上网即可。
Squid代理服务器主要用于类UNIX系统中运行,其发展历史相对悠久,功能也相对完善,除了对HTTP支持很好外,对于FTP和HTTPS的支持也很好,在3.0测试版中也支持了IPV6,Squid的主页在http://www.squid-cache.org/。目前业界主流的CDN都基本是Squid进行二次开发作为cache缓存服务器的
4、三种代理服务器的原理
普通代理(传统代理)
传统的代理服务器就是通过浏览器设置代理的方法。
用户访问网站,先到squid代理服务器,如果squid代理服务器有数据,那么squid就直接从缓存中放回给用户,如果squid缓存中没有,那么squid就代替用户去访问网站,把数据返回的给用户的同时留一份到缓存中,一遍下次用户(或者其他用户)访问的时候,直接从缓存中返回给用户
透明代理:
所谓的透明代理,是相对于普通代理服务而言,客户端不需要做任何和代理服务器相关的设置,对用户而言,感觉不到代理服务器的存在,所以称之为透明代理,即把代理服务器部署在核心的上网出口,当用户上网浏览页面时,会交给代理服务器向外请求,如果结合iptables可以实现代理+网关+内容过滤+流量安全控制等完整的上网解决方案。
透明代理流程说明:
用户A发送一个访问请求到防火墙,由防火墙将该用户的访问请求转发给Squid,squid再先检查自身缓存中有无该用户请求的访问内容,如果没有,则请求远端目的的服务器,获取该用户的访问内容,再放回给用户的同时,在自身缓存保留一份记录以备下次调用,当用户B发送一个和用户A相同的请求到防火墙时,有防火墙转发该用户请求到squid,squid检查到自身缓存发现有相同的内容,直接将该内容放回给用户B。而无需再次去访问请求的服务器。
普通代理和透明代理的区别就是,普通代理需要在客户端浏览器设置指定代理服务器,而透明代理不需要。
反向代理服务原理:
普通代理方式是代理内部网络用户请求internet上服务器的连接请求,客户端必须指定代理服务器,并将本来要直接发送到internet上的服务器的连接请求发送给代理服务器处理,
反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从内部服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外表现为一个服务器。
反向代理流程说明:
squid做反向代理服务器,通常工作在一个服务器集群的前端,在用户看来,squid服务器就是他所要访问的服务器,而实际意义上,squid只是接受用户的请求,同时将用户请求转发给内部真正的WEB服务器,如果squid本身有用户要访问的内容,则squid直接将数据返回给用户,起到了缓存数据的作用,减少了后端服务器的压力
三种代理的区别:
5、什么时候需要用squid(CDN)
a、想节省带宽及服务器成本
b、想提高访问速度,提升用户体验
c、源站扛不住了
6、haproxy和squid代理的区别
有了haproxy,后面还需要squid代理吗?
squid缓存及代理功能,一般用squid是用来作为缓存服务器
haproxy做动态及静态的代理,及负载均衡
squid分拆动态和静态进行缓存。
常见架构:
动态数据======>静态化=====>CDN
很多CDN现在逐渐开始支持动态加速业务。
7、如何选择squid服务的版本
squid2.5:有点老,不支持epoll,内存管理也不完善,例如可能常常会引起重新
squid2.6-2.7:建议使用,性能不错,2.7很建议使用,以为基本有了3.0的所以特性
squid3.0:不建议使用,因为使用C++全部重写,现在性能不如2.6和2.7,以后观察
8、部署squid需要的硬件环境
a、第一重要资源:内存
squid对硬件的要求最主要就是内存资源,内存资源短缺会严重影响性能,因为所有的对象都会尽可能的被缓存到内存中,这样才能更快提升用户的响应及返回数据
b、第二资源:磁盘
磁盘空间也是另外一个squid能够高效运行的重要因素,更多的磁盘空间意外着更多的缓存目标和更高的命中率,快速的磁盘介质也是很有必要的,例如用ssd,sas替代sata磁盘,除了使用raid外,可以指定多个磁盘路径缓存
9、squid的编译和安装
部署前环境准备
环境 :
###记得一定要做时间同步
##开始编译安装Squid
在10.0.0.3操作
#制作软连接
到这来安装squid完毕:
squid 目录结构介绍:
squid.conf 语法介绍
上面中以default为后缀的都是对于配置文件的备份
#看去掉注销和空行之后的配置文件
#创建加用户
#调整配置文件
#添加组
Squid日志文件
squid默认的日志你是是squid安装位置下的logs目录,例如,假如你在./configure中没有使用--prefix=选项,那么默认的日志文件路径是/usr/local/squid/var/logs,必须确认日志文件所存在的磁盘位置空间足够多,在squid写日志如果接受到错误,它会退出和重启。该行为的主要理由应引起你的注意,squid想确认你不会丢失任何重要的日志信息,特别你的系统被滥用或者被攻击时。
squid有三个主要的日志文件:cache.log access.log store.log
cache.log日志文件
cache.log 包含多种消息,例如Squid的配置信息,性能警告,以及严重错误,如下是cache.log的输出样本,主要的错误和异常条件最可能报告在cache.log里。
刚开始运行squid时,需要密切关注该文件,加入squid拒绝运行,原因也行会出现在cache.log文件的结尾处,在正常条件下,该文件不会变化很大,加入你以-s选型来运行squid,重要的cache.log消息也会被发送到你的syslog进程,通过使用cache_log指令,你可以修改配置文件squid.conf来改变该日志文件路径。
转发cache.log消息到系统日志
为了让squid发送到cache.log消息的拷贝到系统日志,请使用-s命令选型,仅仅在debug级别0和1的消息被转发,级别0的消息以syslog级别LOG_WARGING记录,级别为1的消息以syslog级别为LOG_NOTICE记录,所有消息使用LOCAL4的syslog设备,如下配置syslogd的一个方法,以便这些消息能保存下来
在维护多个squid主机时,使用syslog来记录cache.log特别方便,可以配置每个本机syslog进程,转发这些消息到中央日志主机,这样就可以在一个地方统一浏览所有cache日志,例如。可以在/etc/sysconfigd.conf 里使用如下接口
access.log日志文件
Squid把关于HTTP事务的关键信息存在access.log里,该文件是基于行,也就说每行对应一个客户端请求,squid记录客户端IP(或主机名)、请求URL、响应size、和其他信息
Squid 在access.log 里记录所有HTTP访问,除了那些在还没有发送数据前就断开的连接,squid也记录所有ICP事务,除非你使用log_icp_querise指令关闭了这个功能,
store.log日志文件
store.log记录Squid关于存储或删除cache目标的决定,对每个存在cache里的目标,每个不可cache的目标,已经每个被轮换策略删除的目标,Squid都会创建相关的日志条目,该日志文件内容包含了内存cache,又包含了磁盘cache。
squid的日志文件增加没有限制,为了保证日志文件大小合理,应创建计划规律的重命名和打包日志,squid有内建的日志回滚功能,也可以避免单个日志过滤。
squid的访问控制
理解squid如何搜索ACL元素去匹配是很重要的,当ACL元素有多个值时,任何单个值都能导致匹配,换句话说,squid在检查ACL元素值时使用OR逻辑,当squid找到第一个值匹配时,他停止搜索,这意味着把最可能匹配的值放在列表的开头出,能减少延时。
重点强调:
a、squid在搜索ACL元素时使用或逻辑,在acl里的任何单值都可以导致匹配。
b、而应用访问规则恰好相反,对http_access和其他规则设置,squid使用与逻辑。
squid默认的配置文件拒绝每一个客户请求,在任何人能使用代理之前,你必须在squid.conf文件里加入附加的访问控制规则,最简单的一个方式,就是定义一个针对客户IP地址的ACL和一个访问规则,告诉Squid运行来自这些地址的HTTP请求,squid有许多不同的ACL类型,src类型匹配客户端IP,squid会针对客户HTTP请求检查http_access规则。
如:
这两行需要放在正确的位置,http_access的顺序非常重要,但是ACL行的顺序不必介意,squid默认的配置文件包含了一些重要的访问控制,最好不要改变她或者删除它们,除非你完全理解它们的意思。
##访问日志,保存默认,修改为如下
#打开缓存log
#####修改缓存目录,也可以配置多个
##编辑可见主机名,如果不配置,可能无法启动squid
##配置配置管理员联系信息cache_mgr配置这个,在网站出问题的时候,客户可以找到我
对比修改哪些内容:
修改后的配置文件
##启动squid
简单命令说明:
#检查配置文件语法
###设置环境变量
###初始化squid
###启动squid
###不能停止另外一个窗口,查看是否启动
====
#上面的是普通代理
用法:
打开IE浏览器>工具>连接>局域网设置>为LAN使用代理服务器
把squid服务器ip和3128端口填上去即可
之后重新打开IE,浏览网页。
一边看日志,一般通过IE浏览,会看到访问日志不停滚动
tailf /application/squid/var/logs/access.log
看服务器日志
设置启动脚本
##设置日志轮询
到这来一个完整的squid代理服务器就安装完成了
###配置管理页面
1.squid有一个cachemgr.cgi 的程序,可以用web来显示内容,这个对调整squid的参数很方便,平时我们安装完squid后,其实就有这个程序了,只有我们在apache下做相应的配置即可
实战
配置ACL
提示:注意放置的位置:
这个时候你就无法访问51cto的网站,百度网站,以及淘宝的网站了。
部署完成
普通代理分为两种:
一种是普通代理服务器:
作为代理服务器,这是Squid的最基本的功能;通过在squid.conf配置文件添加一系列的访问及控制规则,用户在客户端设置服务器地址和端口,即可通过squid访问internet,在下面的规则里,squid实现局域网用户和高速缓存功能:
即通过浏览器设置代理服务器地址共享上网,这种方式不需要代理服务器在网络的出入口的位置,只需要代理服务器能够上网即可,其他的客户端就可以通过IE等客户端设置代理服务器的地址及端口进行上网。上一篇文件就是这样的一个例子。这个技术以及落后了。
另外一种就是透明代理,所谓的透明代理,是相对于代理服务器而已,客户端不需要做任何和代理服务器相关的设置和操作,对用户而言,感觉不到代理服务器的存在,所以称之为透明代理。即把代理服务器部署在核心的上网出口,当用户上网浏览页面时,会交给代理服务器向外请求,如果结合iptables可以实现代理+网关+内容过滤+浏览安全控制等完整的上网解决方案
透明代理流程说明:
用户A发送一个访问请求到防火墙,有防火墙将该用户的访问请求转发给SQUID,SQUID在先检查自身缓存中有无该用户请求的访问的内容,如果没有,则请求远端目的服务器,获取该用户的访问内容,在返回给用户的同事,自身也缓存保留一份记录,以备下次调用,当用户B发送一个和用户A刚才访问的相同请求时,由防火墙将转发该用户请求到SQUID,squid检查自身缓存,发现有同样的内容后,直接将该内容返回给用户,而无需再去向源站点请求。
注意:在实际使用中,通常将squid和防火墙放在同一台服务器上。
透明代理的好处:
上网行为控制
节约网站带宽成本
提升员工上网速度
squid可以为局域网中的客户端做代理,用来加速用户的网页访问,第一次访问的时候,squid会把数据缓存到服务器上,当客户端第二次访问的时候,squid会对比文件的新旧,如果文件没有发送变化,则squid直接返回给用户数据,不需要在互联网上重新下载一份。
squid有没代理物理拓扑说明
作为透明代理服务器,一般和公司的上网网关放在一起,即所以的客户机的网关都设置为代理服务器的IP,具体需求如下
a、至少有两块网卡,一块连接路由器,一块连接内部网络
b、所以的上网请求都不行经过代理服务器(即把代理服务器设置为网关)
下面我部署的透明代理如下:
需要两块网卡
如果要实现透明代理,在编译安装squid的时候需要添加下面编译参数
##部署方法
#在squid.conf 中的http——port 3128 后面加transparent参数。这个是核心参数,有这个参数就可以了。
#增加几个参数,这些是调优参数,不是必须的
##防火墙设置
#开启转发功能
####这样就设置成功了
我们在用一台服务器,设置只有内网网卡,网段在172.16.1.0/24 网段。把网关设置为172.16.1.1.用它访问外网。这样就可以了,
一边访问web,一般查看squid的日志
##TCP_MISS 代表没有缓冲
普通代理方式是代理内部网络用户访问Internet上服务器的连接请求,客户端必须指定代理服务器,并将本来要直接发送到internet上服务器的连接请求发送给代理服务器处理。
反向代理方式是指以代理服务器来接受Internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外表现问一台服务器。
1、反向代理流程说明:
squid做为反向代理服务器,通常工作在一个服务器集群的前端,在用户端看来,squid服务器就是他所要访问的服务器,而实际意义上squid只是接受用户的请求,同时将用户请求转发给内网真正的web服务器,如果squid本身有用户要访问的内容,则squid直接将内容返回给用户,而无需再去后端的服务器中请求
2、squid反向代理生产案例
很多大型门户网站,经常使用squid作为服务器的反向cache,提高了服务器的访问性能,这些cache服务器组有效减轻了后端web服务器的负载,并且提高了访问速度,在某种程度上保护了后端的web服务器。
3、squid反向代理的优点:
1.节约带宽(对CDN),自己在机房部署squid反向代理,不能节约带宽
2.提升用户体验
3.减轻服务器压力,减少WEB,存储,数据库的压力
公司购买CDN了,企业还需要在机房搭建squid反向代理
答:需求不大,有CDN了,静态业务命中到百分之90左右了,所以需求不大
在穿透CDN请求比较多的时候,超过web服务及其他存储,数据库的压力时候,需要部署squid
4、squid 反向代理如何获取数据更新
squid反向代理一般只缓存可缓存的数据(比如html页面,js,css和图片等静态数据),而一些CGI脚本程序或ASP、JSP、PHP之类的动态程序默认不缓存,它根据从WEB服务器返回的HTTP头标记来缓冲静态页面,有四个重要的HTTP头标记。
Last-Modified:告诉反向代理页面什么时间被修改;
Expries:告诉反向代理页面什么时间应该从缓冲区中删除
Cache-Control:告诉方向代理页面是否应该被缓存;
Pragma:用来包含实现特定的指令,最常见的是Pragma:no-Cache
优先级对比(no-cache,expries,max-age)参考
经验:在squid中Cache-Control:no-cache>expries>refresh_pattern>Last-Modified.考前面的最重要,前面的失效了,后面的基本也就失效了。
另外安装一台web服务器,作为源站。也就是RS
web 服务器ip是 10.0.0.4 端口为80
在客户端打开检查看看是否正确
上传3张图片到web站点,后缀为jpg的图片
在squid服务器(IP:10.0.0.3),设置squid.conf
###################
squid缓存设置--控制页面的缓存时间
refresh_pattern的作用: 用于确定一个页面进入cache后,它在cache中停留的时间。
refresh_pattern 只对后端没设置Expires过期时间的页面起作用,比如论坛页面;而对类似apache mod_expires 设置过的页面不起作用。
语法:
#指定hosts 文件
###在hosts中添加相应的解析
##只有缓存完了,不管你在不在线,都会有。哪怕你把客户端端IE删除缓存,把后端的http服务关闭,也一样可以看到数据
##定义日志格式
###可以配置多个缓存目录
完整的配置文件如下:
###检查语法
#检查命中转态
一边用windows浏览器访问下面地址,看能不能正确访问到10.0.0.4后端RS的内容。一边看10.0.0.3squid的日志文件。观察squid的代理情况