lanm中cdn之varnish服务的搭建

关于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文件

进行推送后
得到结果

可见更新成功

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值