关于varnish的原理及配置流程
1 总体流程
主进程 fork 子进程,主进程等待子进程的信号,子进程退出后,主进程重新启动子进程
子进程生成若干线程。
Accept 线程:接受请求,将请求挂在 overflow队列上
Work 线程: 多个,从对列上摘除请求,对请求进行处理,直到完成,然后处理下一个
请求
Epoll 线程: 一个请求处理称作一个 session,在 session 周期内,处理完请求后,会交给
Epoll 处理,监听是否还有事件发生。
Expire 线程:对于缓存的对象,根据过期时间,组织成二叉堆,该线程周期检查该堆的
根,处理过期的文件。
处理过程大致分为如下几个步骤:
(1)Receive 状态,也就是请求处理的入口状态,根据 VCL 规则判断该请求应该是 Pass 或
Pipe,或者进入 Lookup(本地查询)。
(2)Lookup 状态,进入此状态后,会在 hash 表中查找数据,若找到,则进入 Hit 状态,否则进
入 miss 状态。
(3)Pass 状态,在此状态下,会进入后端请求,即进入 fetch 状态。
(4)Fetch 状态,在 Fetch 状态下,对请求进行后端的获取,发送请求,获得数据,并进行本地
的存储。
(5)Deliver 状态, 将获取到的数据发送给客户端,然后完成本次请求。
线程之间的关系:
2. accept 线程
监听端口,接受连接。
接受后组织成 struct ses(session 结构) ,看是否有空闲的工作线程,如果有,将请求给它,
pthread_cond_signal 信号通知它没有空闲线程,如果 overflow过大,则放弃该请求。否则,
将其挂在 overflow 上(需要更多工作线程,发通知)。
继续监听 2.1.2 work 线程
从 overflow队列上摘取请求(struct ses),进入状态机处理,处理结束后,通过 pipe通信,
将 struct ses发送给 epoll 线程。
2.1.3 Epoll 线程,得到传过来的 struct ses,若还没有过期,将 socket 放入 epoll 的事件中,事
件发生时,也会将其放入到 overflow中进行。
varnish的简单配置
1.准备4台虚拟机
主配置机其ip为172.25.79.1 名称为wyx1
安装varnish
[root@wyx1 ~]# yum install varnish-3.0.5-1.el6.x86_64.rpm varnish-libs-3.0.5-1.el6.x86_64.rpm -y
俩个安装包必须同时安装 ,否则会出现依赖性的问题,导致无法安装
配置 varnish文件
vim /etc/sysconfig/varnish 配置varnish服务端口
vim /etc/varnish/default.vcl 配置一个后台服务器
配置完成后重新启动服务
/etc/init.d/varnish reload
测试:
在实验机上安装httpd
进行编辑/var/www/html/index
在物理机上输入curl 172.25.79.1
进行测试测试结果如下
###查看缓存命中情况
sub vcl_deliver {
if (obj.hits > 0) {
set resp.http.X-Cache = "HIT from wyx cache";(从1号缓存机中获取的)
}
else {
set resp.http.X-Cache = "MISS from wyx cache";(从2号缓存机中获取的)
}
return (deliver);
}
# service varnish reload
当第一次访问时访问结果如下
当第二次及之后访问结果如下
### 通过 varnishadm 手动清除缓存
由于之前在文件/etc/sysconfig/varnish设置了1号机会缓存文件120秒,导致2号机进行更新 /etc/www/html/index.html中的
文件中,客户访问网站时没有得到实时更新,访问的还是之前的文件,需要清除1号机缓存,使得客户端访问的文件时最新的
# # Idle timeout for worker threads
VARNISH_THREAD_TIMEOUT=120
# varnishadm ban.url .*$
#清除所有(注意,一般情况下不要用此命令,此命令会时前端缓存清空,导致所有访问都会到后端从而使后端服务器压力过大,可能奔溃)
# varnishadm ban.url /index.html
#清除 index.html 页面缓存
# varnishadm ban.url /admin/$
#清除 admin 目录缓存
###定义多个不同域名站点的后端服务器
backend wyx1 {
.host = "172.25.79.2";
.port = "80";
}
backend wyx2 {
.host = "172.25.79.3";
.port = "80";
}
#当访问 www.wyx.org 域名时从 wyx1 上取数据,访问 bbs.wyx.org 域名时到 wyx2 取数据,
访问其他页面报错。
if (req.http.host ~ "^(www.)?wyx.org") {
set req.http.host = "www.wyx.org";
set req.backend = wyx1;
} elsif (req.http.host ~ "^bbs.wyx.org") {
set req.backend = wyx2;
} else {error 404 "wyx cache";
}
}
测试
开启2.3号机的http服务,当客户端访问该域名时结果如下
###定义负载均衡
关于这个测试项目有俩种测试方法,一种是在3号机上配置http服务 配置一个域名为www。wyx。org
或者通过在打开一个虚拟机4进行安装http服务。在实验时我使用的是在加一个虚拟机4
在进行配置文件//etc/varnish/default.vcl
}
backend wyx3 {
.host = "172.25.79.4";
.port = "80";
}
backend wyx1 {
.host = "172.25.79.2";
.port = "80";
}
backend wyx2 {
.host = "172.25.79.3";
.port = "80";
}
定义一个轮询负载均衡lb编写如下
director lb round-robin {
{
.backend = wyx1;}
{.backend = wyx3;
#把多个后端聚合为一个组,并检测后端健康状况
}
}
if (req.http.host ~ "^(www.)?wyx.org") {
set req.http.host = "www.wyx.org";
set req.backend = lb;
return (pass);
#为了测试方便,不进行缓存。
} elsif (req.http.host ~ "^bbs.wyx.org") {
set req.backend = wyx2;
} else {
error 404 "westos cache";
}
测试
配置虚拟机4上的http配置文件在默认发目录中书写文件index.html文件
输入域名进行测试结果如下
###varnish cdn 推送平台
之前讲过手动清理缓存以便进行实时同步文件的更新,而在正常的应用中。有很多的服务端要同时更新,此时在用手动更新
就显得有点浪费时间了。这是引入varnish cdn 推送平台来解决这一问题。
http://www.wyx.org/p/bansys/
#需要安装 php 支持
# unzip bansys.zip -d /var/www/html
由于之前配置过varnish的服务端口为80,而此时应用到的http默认端口也为80
这是就需要进行对http的 默认端口进行更改
更改配置文件/etc/htttpd/conf/httpd.conf
中的Listen 的80端改为8080 避免与varnish的服务端口冲突
# vi /var/www/html/bansys/config.php
#只保留如下设置,其余注释掉
<?php
$var_group1 = array(
'host' => array('172.25.79.1'),
'port' => '80',
);
//varnish群组定义
//对主机列表进行绑定
$VAR_CLUSTER = array(
'www.wyx.org' => $var_group1,
);
//varnish版本
//2.x和3.x推送命令不一样
$VAR_VERSION = "3";
?>
#bansys 有两种工作模式,分别是:telnet 和 http 模式。
#telnet 模式需要关闭 varnish 服务管理端口的验证,注释掉/etc/sysconfig/varnish 文件中的 “ -S $
{VARNISH_SECRET_FILE}”这行,重启 varnish 服务即可。
#如果是 http 模式需要对 varnish 做以下设置:
acl wyx {
#设置访问控制
"127.0.0.1";
"172.25.0.0"/24;
}
if (req.request == "BAN") {
if (!client.ip ~ wyx) {
error 405 "Not allowed.";
}
ban("req.url ~ " + req.url);
error 200 "ban added";
}
测试
在主机上输入http://172.25.79.1:8080/bansys/ 进行cdn推送管理页面
选者HTTP推送模式 群组编辑需要更改的网站
推送内容编辑你要进行更改的文件
编辑前的网站访问结果为
修改4号机index.html文件
进行推送后
得到结果
可见更新成功