您的位置:首页 > 运维架构 > Nginx

Varnish+Nginx实现单双Web服务器缓存

2016-09-12 10:55 621 查看
实验目的:

varnish利用实现对后端单双静态web服务器的缓存

varnish包的下载路径:http://repo.varnish-cache.org/redhat/varnish-3.0/el6 可以下载到varnish的rpm包

需要下载的有:

varnish-3.0.5-1.el6.x86_64

varnish-docs-3.0.5-1.el6.x86_64

varnish-libs-3.0.5-1.el6.x86_64

varnish的官网地址:https://www.varnish-cache.org/

实验环境:

web1:172.16.18.3            Nginx

web2:172.16.17.12          Nginx

varnish:172.16.18.1        Varnish

实验内容:

一,安装varnish包,配置web服务器

[root@node1~]# rpm -ql varnish   

/etc/rc.d/init.d/varnish              #varnish的启动程序   

/etc/rc.d/init.d/varnishlog          #日志   

/etc/rc.d/init.d/varnishncsa          #日志   

/etc/sysconfig/varnish                #配置文件,varnish定义自身属性   

/etc/varnish                          #配置文件目录   

/etc/varnish/default.vcl              #默认配置文件,定义后端节点的   

/usr/bin/varnish_reload_vcl          #加载vcl,   

/usr/bin/varnishadm                  #客户端程序   

/usr/bin/varnishstat                  #状态监控

二,编辑配置文件

[root@node1 ~]# vim /etc/sysconfig/varnish

NFILES=131072

MEMLOCK=82000

NPROCS="unlimited"

RELOAD_VCL=1                                                        #是否重载VCL文件

## Alternative 3, Advanced configuration

VARNISH_VCL_CONF=/etc/varnish/default.vcl              #vcl文件路径

VARNISH_LISTEN_PORT=80                                    #varnish自己工作于那个端口。默认是6081

VARNISH_ADMIN_LISTEN_ADDRESS=127.0.0.1      #管理接口

VARNISH_ADMIN_LISTEN_PORT=6082                    #管理接口监听端口

VARNISH_SECRET_FILE=/etc/varnish/secret                #密钥文件

VARNISH_MIN_THREADS=50                                    #最少空闲线程

VARNISH_MAX_THREADS=1000                                #最多启动线程

VARNISH_THREAD_TIMEOUT=120                            #work超时时长

#VARNISH_STORAGE_FILE=/var/lib/varnish/varnish_storage.bin        #存储文件

VARNISH_STORAGE_SIZE=64M                                                    #存储文件文件大小

#VARNISH_STORAGE="file,${VARNISH_STORAGE_FILE},${VARNISH_STORAGE_SIZE}"    #存储方式file

VARNISH_STORAGE="malloc,${VARNISH_STORAGE_SIZE}"    #基于内存方式

VARNISH_TTL=120

DAEMON_OPTS="-a ${VARNISH_LISTEN_ADDRESS}:${VARNISH_LISTEN_PORT} \

            -f ${VARNISH_VCL_CONF} \

            -T ${VARNISH_ADMIN_LISTEN_ADDRESS}:${VARNISH_ADMIN_LISTEN_PORT} \

            -t ${VARNISH_TTL} \

            -w ${VARNISH_MIN_THREADS},${VARNISH_MAX_THREADS},${VARNISH_THREAD_TIMEOUT} \

            -u varnish -g varnish \

            -S ${VARNISH_SECRET_FILE} \

            -s ${VARNISH_STORAGE}"

[root@node1 ~]# vim /etc/varnish/default.vcl

backend default {

  .host = "172.16.18.3";

  .port = "80";

}

此时varnish就已经可以启动了。下来就是最重要的编写vcl文件。

------------------------------------------------------------

Varnish Cache 的架构笔记 http://www.linuxidc.com/Linux/2013-10/91016.htm

CentOS 5.8下Varnish-2.1.5的安装配置 http://www.linuxidc.com/Linux/2013-09/89916.htm

RedHat脚本改用CentOS源更新安装Nginx、PHP 5.3、Varnish http://www.linuxidc.com/Linux/2012-07/65801.htm

利用Varnish构建Cache服务器笔记 http://www.linuxidc.com/Linux/2012-07/65234.htm

缓存服务Varnish安装配置 http://www.linuxidc.com/Linux/2012-07/65228.htm

Varnish 编译安装所需准备 http://www.linuxidc.com/Linux/2012-07/65230.htm

Linux下Varnish缓存的配置优化 http://www.linuxidc.com/Linux/2012-03/56435.htm

Varnish基础概念详解 http://www.linuxidc.com/Linux/2014-07/104535.htm

-----------------------------------------------------------------------------------

那么我们就应该熟悉这张表,每一个状态引擎所对应的变量



简单介绍一下vcl的语法

VCL的设计参考了C和Perl语言,因此,对有着C或Perl编程经验者来说,其非常易于理解。其基本语法说明如下:

(1)//、#或/* comment */用于注释

(2)sub $name 定义函数

(3)不支持循环,有内置变量

(4)使用终止语句,没有返回值

(5)域专用

(6)操作符:=(赋值)、==(等值比较)、~(模式匹配)、!(取反)、&&(逻辑与)、||(逻辑或)

编译vcl文件中状态引擎的顺序我们按照默认配置文件的顺序来,此顺序也符合请求处理的基本顺序,当然,为了配合实验也会有些改动。我们来看一张图,可以明确的明白请求的过程:



1,首先我们来编写vcl_recv段,

vcl_recv作为进入varnish对请求报文解码后第一个子例程,可以在此处做访问控制,是否查询缓存,以及无法识别的数据的判定。

首先对default.vcl文件复制一份重新改名为test1.vcl

acl purgers {                                        #定义一个acl

"127.0.0.1";

"172.16.0.0"/16;

}

sub vcl_recv {

    if (req.url ~ "^/test.html$") {            #请求首部的url匹配到test.html,

                return(pass);                      #跳过缓存

        }

    if

    if (req.request != "GET" &&            #请求方法不是已知的这7中则发到pipe上去

      req.request != "HEAD" &&

      req.request != "PUT" &&

      req.request != "POST" &&

      req.request != "TRACE" &&

      req.request != "OPTIONS" &&

      req.request != "DELETE") {

      return (pipe);

      }

    if (req.request != "GET" && req.request != "HEAD") {        #不是获取资源的全部跳过缓存,减少无用缓存查询

      return (pass);

    }

    if (req.request == "PURGE") {             

        if (!client.ip ~ purgers) {                                                  #请求IP不在ACL中定义,则发挥405错误页。

            error 405 "Method not allowed";

          }

        return (lookup);

    }

    return (lookup);

}

那么此时如何加载这个test1让他生效呢?

第一修改配置文件。

第二,利用varnishadm客户端工具。

varnishadm

[root@node1 ~]# varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082        #进入到管理工具    

200      

-----------------------------    

Varnish Cache CLI 1.0    

-----------------------------    

Linux,2.6.32-431.el6.x86_64,x86_64,-sfile,-smalloc,-hcritbit    

varnish-3.0.5 revision 1a89b1f    

Type 'help' for command list.    

Type 'quit' to close CLI session.    

varnish> vcl.load test1 test1.vcl                                                                    #加载vcl文件

200

VCL compiled.

varnish> vcl.list

200

active 2 boot

available 0 test1

varnish> vcl.use test1

200

varnish> vcl.list

200

available 2 boot

active 0 test1

这样就设定成功了。

为了显示效果我们来配置一下deliver段,给客户端返回时候匹配到缓存信息,以便我我们来查看实验结果。

sub vcl_deliver {

        if (obj.hits > 0) {                                                                        #判断条件缓存匹配次数大于0

                set resp.http.X-Cache = "HIT via" + " " + server.hostname;    #添加HIT via

        } else {

                set resp.http.X-Cache = "MISS via" + " " + server.hostname;  #没有匹配到则添加MISS via

        }

}

访问缓存172.16.18.1.第一次是miss via 之后的访问在缓存有效期内都是HIT via



当访问test.html是会被vcl_recv定义的pass匹配到,直接跳过缓存,所以X-cache状态一直是MISS via



2,编辑vcl_hash,自定义hash生成时的数据来源。

sub vcl_hash {

  hash_data(req.url);                  #依据req.url来匹配

if (req.http.host) {

  hash_data(req.http.host);          #请求首部的host来缓存

  } else {

  hash_data(server.ip);

  }

  return (hash);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: