一、概念
1、Varnish 是什么
Varnish是高性能开源的反向代理服务器和HTTP缓存服务器
Varnish的功能与Squid服务器相似,都可以用来做HTTP缓存
Squid是从硬盘读取缓存的数据,而Varnish把数据存放在内存中,直接从读取内存,避免了频繁在内存、磁盘中交换文件,
优点:Varnish要相对更高效,
缺点:内存中的缓存在服务器重启后会丢失
2、Varnish 如何工作
1)初始化过程
Varnish 的master进程负责启动工作,master进程读取配置文件,根据指定的空间大小(例如管理员分配了2G内存)来创建存储空间,创建并管理child进程
child进程来处理后续任务,它会分配一些线程来执行不同的工作,例如
接受http请求
为缓存对象分配存储空间
清除过期缓存对象
释放空间 碎片整理
2)http请求处理过程
有一个专门负责接收http请求的线程,一直监听请求端口,当有请求过来时,负责唤起一个工作线程来处理请求
工作线程会分析http请求的uri,知道了这个请求想要什么,就到缓存中查找是否有这个对象
如果有,就把缓存对象直接返回给用户
如果没有,会把请求转给后端服务器处理,并等待结果,工作线程从后端得到结果内容后,先把内容作为一个缓存对象保存到缓存空间(以备下次请求这个对象时快速响应),然后再把内容返回给用户
3)分配缓存过程
有一个对象需要缓存时,根据这个对象的大小,到空闲缓存区中查找大小最适合的空闲块,找到后就把这个对象放进去
如果这个对象没有填满这个空闲块,就把剩余的空间做为一个新的空闲块
如果空闲缓存区中没地方了,就要先删除一部分缓存来腾出地方,删除是根据最近最少使用原则
4)释放缓存过程
有一个线程来负责缓存的释放工作,他定期检查缓存中所有对象的生存周期,如果某个对象在指定的时间段内没有被访问,就把这个对象删除,释放其占用的缓存空间
释放空间后,检查一下临近的内存空间是否是空闲的,如果是,就整合为一个更大的空闲块,实现空间碎片的整理
二、配置
1、配置varnish
server1 server2 server3
varnish代理服务 阿帕奇服务 阿帕奇服务
172.25.47.1 172.25.47.2 172.25.47.3
1)server1(代理)上
yum install openssh-clients -y
cd varnish/
yum install varnish-3.0.5-1.el6.x86_64.rpm varnish-libs-3.0.5-1.el6.x86_64.rpm -y
rpm -qc varnish-3.0.5-1.el6.x86_64 ##查看配置文件
对varnish进行修改
vim /etc/sysconfig/varnish
8 NFILES=131072 ##打开文件最大数
12 MEMLOCK=82000 ##需要内存
15 NPROCS="unlimited" ##进程数
66 VARNISH_LISTEN_PORT=80 ##改端口为80,因为服务器端口号是80
vim /etc/varnish/default.vcl
8 .host = "172.25.47.2"; ##修改代理地址
9 .port = "80";
vim /etc/security/limits.conf
51 varnish - nofile 131072 ##在最后添加
52 varnish - memlock 82000
53 varnish - nproc unlimited
/etc/init.d/varnish restart ##重启,第一次重启可能会出错,再次重启就好了
netstat -antlp |grep 80 ##查看端口是否开启
2)server2(服务器)上
yum install httpd -y
cd /var/www/html/
vim index.html
写一个发布页
/etc/init.d/httpd restart
测试: 在真机curl 172.25.47.1,可以通过server1代理到server2
2、查看是否命中缓存
server1
vim /etc/varnish/default.vcl
sub vcl_deliver {
if (obj.hits>0){
set resp.http.X-Cache = "HIT from westos cache"; ##命中
}
else {
set resp.http.X-Cache = "MISS from westos cache"; ##没命中
}
return (deliver);
}
/etc/init.d/varnish reload ##此处用reload刷新,如果restart,缓存就会清掉
vim /etc/sysconfig/varnish
82 VARNISH_THREAD_TIMEOUT=120 ##缓存保留时间是120s
varnishadm ban.url .*$ ##清除缓存。访问路径后面的所有都清空
varnishadm ban.url /index.html ##清除缓存,清楚访问路径后面的所有都清空
测试:
真机curl -I 172.25.47.1
MISS ##表示没命中
再次curl -I 172.25.47.1
HIT ##表示命中
3、定义不同域名的ip,访问到不同的后端主机(是在七层协议中的应用层做的)
server1:
vim /etc/varnish/default.vcl
backend web1 {
.host = "172.25.47.2";
.port = "80";
}
backend web2 {
.host = "172.25.47.3";
.port = "80";
}
sub vcl_recv {
if(req.http.host ~"^(www.)?westos.org"){ ##访问以www.westos.org或者westos.com 访问到web1
set req.http.host = "www.westos.org"; ##访问
set req.backend = web1; ##访问web1
}elsif (req.http.host ~"^bbs.westos.org"){
set req.backend = web2; ##访问到web2
}else {
error 404 "error"; ##如果是没有的服务,返回error
}
}
/etc/init.d/varnish restart
在server2
vim index.html
server2:www.westos.org
/etc/init.d/httpd restart
在server3
yum install httpd -y
cd /var/www/html/
vim index.html
server3:bbs.westos.org
/etc/init.d/httpd restart
在真机 vim /etc/hosts
172.25.47.1 server1 www.westos.org bbs.westos.org westos.org
curl westos.org
curl www.westos.org
看到的是server2服务
curl bbs.westos.org
看到的是server3服务
curl 172.25.47.1
3、负载均衡
在server3上
mkdir /www ##创建虚拟主机
cd /www/
vim index.html
www
mkdir /bbs
cd /bbs/
vim index.html
bbs
vim /etc/httpd/conf/httpd.conf
990 NameVirtualHost *:80
1003 <VirtualHost *:80>
1004 DocumentRoot /www
1005 ServerName www.westos.org
1006 </VirtualHost>
1007
1008 <VirtualHost *:80>
1009 DocumentRoot /bbs
1010 ServerName bbs.westos.org
1011 </VirtualHost>
/etc/init.d/httpd restart
在server1
vim /etc/varnish/default.vcl
17 director lb round-robin{ ##写轮询
18 { .backend = web1;}
19 { .backend = web2;}
20 }
21
22 sub vcl_recv {
23 if(req.http.host ~"^(www.)?westos.org"){
24 set req.http.host = "www.westos.org";
25 set req.backend = lb;
26 return (pass); ##不缓存
27 }elsif (req.http.host ~"^bbs.westos.org"){
28 set req.backend = web2;
29 }else {
30 error 404 "error";
31 }
32
33 }
/etc/init.d/varnish reload
varnishadm ban.url .*$
在真机中:
curl www.westos.org
轮询
curl bbs.westos.org
232

被折叠的 条评论
为什么被折叠?



