企业常用cdn搭建varnish服务器

一、varnish简介
Varnish是一款高性能的开源HTTP加速器,他的作者Poul-Henning Kamp是FreeBSD的内核开发者之一。挪威最大的在线报纸 Verdens Gang 使用3台Varnish代替了原来的12台Squid,性能比以前更好。
Varnish与一般服务器软件类似,就是一个web缓存代理服务器,分为master(management)进程和child(worker,主要做cache的工作)进程。master进程读入命令,进行一些初始化,然后fork并监控child进程。child进程分配若干线程进行工作,主要包括一些管理线程和很多woker线程。

二、VCL介绍
Varnish Configuration Language (VCL)是varnish配置缓存策略的工具,它是一种基于“域”(domain specific)的简单编程语言,它支持有限的算术运算和逻辑运算操作、允许使用正则表达式进行字符串匹配、允许用户使用set自定义变量、支持if判 断语句,也有内置的函数和变量等。使用VCL编写的缓存策略通常保存至.vcl文件中,其需要编译成二进制的格式后才能由varnish调用。

VCL处理过程大致分为如下几个步骤:
(1)Receive 状态,也就是请求处理的入口状态,根据 VCL 规则判断该请求应该是 Pass 或Pipe,或者进入 Lookup(本地查询)。
(2)Lookup 状态,进入此状态后,会在 hash 表中查找数据,若找到,则进入 Hit 状态,否则进
入 miss 状态。
(3)Pass 状态,在此状态下,会进入后端请求,即进入 fetch 状态。
(4)Fetch 状态,在 Fetch 状态下,对请求进行后端的获取,发送请求,获得数据,并进行本地
的存储。
(5)Deliver 状态, 将获取到的数据发送给客户端,然后完成本次请求。

三、varnish的安装
1.环境:
实验主机(需要三台虚拟机,如下分别说明主机名,ip以及所要安装的服务):

server1 172.25.35.1 varnish
server2 172.25.35.2 apache
server3 172.25.35.3 apache

2.varnish部署
1.下载安装varnish软件包(server1上)

yum install varnish-3.0.5-1.el6.x86_64.rpm varnish-libs-3.0.5-1.el6.x86_64.rpm -y

这里写图片描述
2. 修改监听端口为80(与http端口冲突可修改http端口为8080)

vi /etc/sysconfig/varnish 
VARNISH_LISTEN_PORT=80

3.更改varnish配置文件,配置一个后端服务器,并重新加载服务

vim /etc/varnish/default.vcl       
backend web1 {
    .host = "172.25.35.2";
    .port = "80";
}
/etc/init.d/varnish start

4.在server2上安装apache,并编写测试页

yum install httpd -y
/etc/init.d/httpd start

这里写图片描述

vim /var/www/html/index.html
    <h1>server2</h1>

注意:以后只要修改过配置文件就要reload,或者restart,不然会导致实验过程中出现错误。
6.测试(物理机/etc/hosts上要有server2的解析)
172.25.35.1
这里写图片描述
可以看到访问的是172.25.35.1得到是后端服务器http的发布网页的内容。
四、测试缓存命中情况
1.修改server1的配置文件即可

 vim /etc/varnish/default.vcl  ## varnish配置文件
    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);
    }

2.重启服务

    /etc/init.d/varnish reload

3.测试

    cul -I www.westos.org

这里写图片描述
第一次显示 MISS from westos cache 缓存中没有,前往后端获取
第二次显示 HIT from westos cache 缓存中直接获取
补充varnish的工作原理:请求varnish服务器的过程是首先查看自己的缓存区,如果命中,如果有则直接返回给请求者,若没有则去后端服务器去取数据,将取到的数据复制到缓存区,并且返回给请求者,这样如果有连续的相同请求,则不用再去后端服务器取数据,在varnish服务器的缓存区即可命中返回,减小了后端服务器的压力。varnish服务器的缓存区的默认保存时间是120秒,超过时间会清空。可根据实际的需求在varnish的配置文件中进行修改数据的保存时间。
4.通过varnishadm手动清除缓存

    varnishadm ban.url .*$     #清除所有
    varnishadm ban.url /index.html  #清除页面缓存
    varnishadm ban.url /admin/$    #清除目录缓存

这三条命令可根据实际的需求选择合适的命令来清除varnish服务器的缓存。
注意:
这里要注意一个小的方面:
使用curl -I 172.25.4.1访问和使用curl -I 172.25.4.1/index.html访问,得到的结果是一样的,但是这两条命令会在缓存区生成两条不同的缓存。
若你执行了清除页面缓存的命令后在执行curl -I 172.25.4.1也会显示命中,而执行curl -I 172.25.4.1/index.html会显示不命中。
五、定义多个不同站点的后端服务器
1.配置后端服务器(server1上在原先的配置上再添加一个后端服务器)

vim /etc/varnish/default.vcl    ## 配置文件     
backend web1 {
        .host = "172.25.35.2";
        .port = "80";
        }
        backend web2 {
        .host = "172.25.35.3";
        .port = "80";
        }
        sub vcl_recv {
        if (req.http.host ~ "^(www.)?westos.org") {
            set req.http.host = "www.westos.org";
            set req.backend = web1;
            return(pass)
        } elsif (req.http.host ~ "^bbs.westos.org") {
            set req.backend = web2;
        } else {
            error 404 "westos cache";
            }
        }
/etc/init.d/varnish reload  ## 重启服务

2.依次类推,仿照server2的设置,在每个后端服务器上安装http并编写测试页面
这里又添加了一个后端服务器server3 配置如下:

vim /var/www/html/index.html
    <h1>server3</h1>

3.测试(在测试的物理机器上要对新添加的后端服务器进行解析)
vim /etc/hosts
这里写图片描述
测试结果:
这里写图片描述

这里写图片描述
六、定义负载均衡和健康检查
1.配置后端服务器

vim /etc/varnish/default.vcl
backend web1 {
    .host = "172.25.35.2";
    .port = "80";
    }
    backend web2 {
        .host = "172.25.35.3";
        .port = "80";
    }
    director lb round-robin {
    #把多个后端聚合为一个组,并检测后端健康状况
    {   .backend = web1;    }
    {   .backend = web2;    }
    }
    sub vcl_recv {
    if (req.http.host ~ "^(www.)?westos.org") {
        set req.http.host = "www.westos.org";
        set req.backend = lb;
    } elsif (req.http.host ~ "^www.linux.org") {
        set req.backend = web2;
    } else {
        error 404 "westos cache";
        }
    }

测试结果:
这里写图片描述
注:在配置这里,还可以更改server1中varnish配置文件,在set req.backend = lb;下添加return (pass); 使得varnish缓存功能失效,客户端直接去后端抓取内容,可以获得更好的测试对比效果。

注:此时若server2的httpd服务关闭curl会一直读取server3相应的index.html内容而不会报错,这是因为varnish拥有自动的健康检查功能,

/etc/init.d/httpd stop

这里写图片描述
打开server2的http服务后,varnish服务器的健康检查功能自动又将server2添加,使用curl又能够循环读取到server2和server3相应的index.html内容
这里写图片描述

七、varnish cdn推送平台
1.首先server1上需要安装apache服务,

yum install httpd -y

这里写图片描述
修改http的访问端口为8080,避免与varnish服务器的端口冲突。

vim /etc/httpd/conf/httpd.conf
    LISTEN 8080

更改完成后重启服务即可
2.server1上需要安装php

yum install php -y

这里写图片描述

编写配置文件,只保留如下内容

cd /var/www/html
vim config.php
<?php
    $var_group1 = array(
    'host' => array('172.25.35.1'),
    'port' => '6082',
    );
//varnish 群组定义
//对主机列表进行绑定
$VAR_CLUSTER = array(
'www.westos.org' => $var_group1,
);
//varnish 版本//2.x 和 3.x 推送命令不一样
$VAR_VERSION = "3";
?>

3.下载bansys.zip包,并进行解压

yum install unzip -y
unzip bansys.zip -d /var/www/html

4.bansys 有两种工作模式,分别是:telnet 和 http 模式。
telnet 模式需要关闭 varnish 服务管理端口的验证,注释掉/etc/sysconfig/varnish 文件中的
“ -S ${VARNISH_SECRET_FILE}”这行,重启 varnish 服务即可
如果是 http 模式需要对 varnish 做以下设置(本次试验采用http模式推送)
如下为http模式的设定:
更改varnish的配置文件

vim /etc/varnish/default.vcl
acl westos {
    #设置访问控制
    "127.0.0.1";
    "172.25.35.1"/24;
}
sub vcl_recv {
if (req.request == "BAN") {
    if (!client.ip ~ westos) {
        error 405 "Not allowed.";
    }
ban("req.url ~ " + req.url);
error 200 "ban added";
}
}

这里写图片描述

这里写图片描述

这里写图片描述

重新加载varnish服务

/etc/init.d/varnish reload

5.测试
物理机中:
用firefox访问www.westos.org
打开另外一个网页,用firefox访问 172.25.35.1:8080
这里写图片描述

这里写图片描述

推送模式:HTTP
CDN群组:www.westos.org
推送内容:
/index.html # 推送文件
/images/* # 目录
本次试验推送文件 /index.html
推送一次后,再访问172.25.4.1:8080一次,发现循环读取到server2和server3相应的index.html内容
这里写图片描述

这里写图片描述

猜你喜欢

转载自blog.csdn.net/oikinkl/article/details/82694005
今日推荐