Varnish
简介:
Varnish是一款高性能且开源的反向代理服务器和http加速器。与传统的Squid相比,Varnish具有性能更高、速度更快、管理更方便等诸多优点。Varnish采用全新的软件体系架构,和现在的硬件提交配合紧密。
处理过程大致分为如下几个步骤:
Receive 状态,也就是请求处理的入口状态,根据 VCL 规则判断该请求应该是 Pass 或Pipe,或者进入 Lookup(本地查询)。
Lookup 状态,进入此状态后,会在 hash 表中查找数据,若找到,则进入 Hit 状态,否则进入 miss 状态。
Pass 状态,在此状态下,会进入后端请求,即进入 fetch 状态。
Fetch 状态,在 Fetch 状态下,对请求进行后端的获取,发送请求,获得数据,并进行本地的存储。
Deliver 状态, 将获取到的数据发送给客户端,然后完成本次请求
一、基础环境配置
1.封装虚拟机,配置三台
两台作为后端服务器 server2 :172.25.254.2 server3 : 172.25.254.3
一台作为varnish缓存服务器 server1 : 172.25.254.1
主机为客户端clients : 172.25.254.93
系统环境:rhel6.5
2. 配置varnish服务器(server1)
1)安装varnish
yum install varnish-3.0.5-1.el6.x86_64.rpm varnish-libs-3.0.5-1.el6.x86_64.rpm -y
2)配置
配置一个后端服务器:配置文件/etc/varnish/default.vcl
//文件中本身除了此处全部是注释掉的
在文件中 添加设置使可以查看缓存命中情况:
# 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);
}
配置 varnish 服务端口 配置文件 : /etc/sysconfig/varnish
...
7 # Maximum number of open files (for ulimit -n)
8 NFILES=131072 //代表最大文件打开数
注 :
1)NFILES = xxx 要修该的话,需要查看操作系统和内核限制,其中内核限制 > 操作系统限制 ,每个限制都相关,所以都需要修改
2)生产环境中,如果出现系统显示处理文件处理不过来的现象,多半就是这个问题
9
10 # Locked shared memory (for ulimit -l)
11 # Default log size is 82MB + header
12 MEMLOCK=82000 //最大锁定内存地址空间
13
14 # Maximum number of threads (for ulimit -u)
15 NPROCS="unlimited" //代表最大进程数,无限制线程程实际上是1024,这是默认的上限
主要的更改 :
66 VARNISH_LISTEN_PORT=80 ##将监听端口修改为80,这是apache的默认端口
95 VARNISH_TTL=120 ##TTL 值是缓存时间,也相当于为服务器提供保护
3)开启varnish
两种开启的方法:
/etc/init.d/varnish start “开启” | reload “重新读取”
service varnish start / reload
3. 配置后端的httpd服务
server2 (172.25.254.2)
编辑apache主页面 /var/www/html/index.html
<h1> server2 - www.sunshine.org </h1>
重启apache服务 : /etc/init.d/httpd restart
server3 (172.25.254.3)
编辑apache主页面 /var/www/html/index.html
<h1> server3 - www.sunshine.org </h1>
另外发布一个页面 /bbs/index.html
<h1> server3 - bbs.sunshine.org </h1>
因为发布两个页面,所以需要开启虚拟主机 在rhel6.5版本中,虚拟主机的配置都综合在主配置文件
/etc/httpd/conf/httpd.conf
...
990 NameVirtualHost *:80 ##开启虚拟主机,使用的端口为80
1010 <VirtualHost *:80> ##编辑第一个主页面 www.sunshine.com
1011 DocumentRoot /var/www/html
1012 ServerName www.sunshine.com
1013 </VirtualHost>
1014 <VirtualHost *:80> ##编辑第二个页面 bbs.westos.org
1015 DocumentRoot /bbs
1016 ServerName bbs.sunshine.com
1017 </VirtualHost>
重启apache服务生效: /etc/init.d/httpd restart
4. 测试
在客户端测试,编辑本地的解析文件 /etc/hosts
172.25.254.1 server1 www.sunshine.com bbs.sunshine.com
命中测试:
//其中的Age 为TTL值,第一次因为没有缓存所以未命中,第二次就成功命中了,同时也在读取TTL值
二、Varnish的更多功能
通过 varnishadm 手动清除缓存
varnishadm ban.url .*$ //清除所有'
varnishadm ban.url /index.html //清除 index.html 页面缓存
varnishadm ban.url /admin/$ //清除 admin 目录缓存
1、定义多个不同域名站点的后端服务器
backend web1 {
.host = "172.25.254.2";
.port = "80";
}
backend web2 {
.host = "172.25.254.3";
.port = "80";
}
2. 当访问 www.sunshine.com 域名时从 web1上取数据,访问bbs.sunshine.org 域名时到 web2 取数据,访问其他页面报错
sub vcl_recv {
if (req.http.host ~ "^(www.)?sunshine.com") {
set req.http.host = "www.sunshine.com";
set req.backend = web1;
} elsif (req.http.host ~ "^bbs.sunshine.com") {
set req.backend = web2;
} else { error 404 "sunshine cache"; }
}
这个设置之后,curl命令只能通过域名访问
# service varnish reload 重新读取配置生效
//测试如下:
3. 定义负载均衡
把多个后端聚合为一个组,并检测后端健康状况
director lb round-robin { //round-robin : 轮询机制
{.backend = web1;}
{.backend = web2;}
}
sub vcl_recv {
if (req.http.host ~ "^(www.)?sunshine.com") {
set req.http.host = "www.sunshine.com";
set req.backend = lb; //实现lb套件
return (pass); //跳过缓存,此处为了测试方便,开启此项
} elsif (req.http.host ~ "^bbs.sunshine.com") {
set req.backend = web2;
} else {error 404 "sunshine cache";
}
# service varnish reload
注 :
这里 return(pass) 和在注配置文件中设置 TTL = 0 效果效果相同,但是意义却不一样。 TTL设置的是dns缓存,如果设置为0 , 那么这个varnish缓存服务器的存在也没有必要了,将 return(pass) 添加的意义是临时为了实验效果,真实环境不会使用。真实环境会将TTL 设置为长时间,然后需要时再单独清空缓存。
三、varnish cdn 推送平台
CDN的全称是Content Delivery Network,即内容分发网络。其目的是通过在现有的Internet中增加一层新的网络架构,将网站的内容发布到最接近用户的网络”边缘”(边缘服务器),使用户可以就近取得所需的内容,解决Internet网络拥挤的状况,提高用户访问网站的响应速度。从技术上全面解决由于网络带宽小、用户访问量大、网点分布不均等原因所造成的用户访问网站响应速度慢的问题。
1、开启apache服务,设置httpd服务监听端口为8080
#配置文件: vim /etc/httpd/conf/httpd.conf
//因为vanish占用的是80端口,所以需要重新改变端口,不然服务也起不来
2、需要安装 php 支持
网上下载安装包
网址:http://code.google.com/p/varnish-php-bansys/
yum install unzip -y
unzip bansys.zip -d /var/www/html/#解压到指定目录
yum install php -y
3、配置服务
vim /var/www/html/bansys/config.php ##只保留如下设置,其余注释掉
<?php
//varnish主机列表
//可定义多个主机列表
$var_group1 = array(
'host' => array('172.25.254.1'),
'port' => '80',
);
//varnish群组定义
//对主机列表进行绑定
$VAR_CLUSTER = array(
'www.sunshine.com' => $var_group1,
);
//varnish版本
//2.x和3.x推送命令不一样
$VAR_VERSION = "3";
?>
4、bansys 有两种工作模式,分别是:telnet 和 http 模式
telnet 模式需要关闭 varnish 服务管理端口的验证,注释掉/etc/sysconfig/varnish 文件中的 “ -S $
{VARNISH_SECRET_FILE}”这行,重启 varnish 服务即可。
如果是 http 模式需要对 varnish 做以下设置:
# vim /etc/varnish/default.vcl
# 设置acl访问控制
acl sunshine { ##注意sunshine名称不要和之前定义的名称重叠,不然会出错
"127.0.0.1";
"172.25.254.0"/24;
}
sub vcl_recv { ##这个函数值之前定义过,加在里面就好
if (req.request == "BAN") {
if (!client.ip ~ sunshine) {
error 405 "Not allowed.";
}
ban("req.url ~ " + req.url);
error 200 "ban added";
}
}
# service varnish reload 重新读取varnish配置生效
5、测试
做该测试时,应注释掉varnish配置文件中的return (pass); 项
原始访问页面为 server3:
网页访问 网址 : 172.25.254.1:8080/bansys
//实现点对点的刷新指定界面
//点击确认提交成功
刷新界面:
//因为设置了轮询机制,所以是刷新成功了
注:当然也可以手动刷新缓存
tips:
在真实生产环境中,可能设置的缓存时间为一个月甚至更久,这里就需要推送平台了,因为如果用varnish刷新的命令,需要管理员的权限,这显然是非常不安全的,用平台就可以避免这个问题,另外还可以对指定的界面进行刷新,非常的实用