首页 > 代码库 > Varnish工作原理及配置详解

Varnish工作原理及配置详解

1.基本概念

     在当前主流的Web架构中,Cache担任着越来越重要的作用。常见的基于浏览器的C/S架构,Web Cache更是节约服务器资源的关键。而最近几年由FreeBSD创始人之一Kamp开发的varnish更是一个不可多得的Web Cache Server。严格意义上说,Varnish是一个高性能的反向代理软件,只不过与其出色的缓存功能相比,企业更愿意使用其搭建缓存服务器。同时,由于其工作在Web Server的前端,有一部分企业已经在生产环境中使用其作为旧版本的squid的替代方案,以在相同的服务器成本下提供更好的缓存效果,Varnish更是作为CDN缓存服务器的可选服务之一。

    

根据官网的介绍,Varnish的主要特性如下:https://www.varnish-cache.org/

        1.缓存位置:可以使用内存也可以使用磁盘。如果要使用磁盘的话推荐SSDRAID1

        2.日志存储:日志也存储在内存中。存储策略:固定大小,循环使用

        3.支持虚拟内存的使用。

        4.有精确的时间管理机制,即缓存的时间属性控制。

        5.状态引擎架构:在不同的引擎上完成对不同的缓存和代理数据进行处理。可以通过特定的配置语言设计不同的控制语句,以决定数据在不同位置以不同方式缓存。类似于netfilter中的钩子,在特定的地方对经过的报文进行特定规则的处理。

        6.缓存管理:以二叉堆格式管理缓存数据,做到数据的及时清理。

 

2.简单架构

    Management进程:对子进程进行管理,同时对VCL配置进行编译,并应用到不同的状态引擎。

    Child进程:生成线程池,负责对用户请求进行处理,并通过hash查找返回用户结果。

    wKioL1Qe667iERLeAAERfZzjdp0689.jpg


3.状态引擎

      每一个状态引擎处理结束之后,都会将结果returnvarnish,由varnish决定下一个状态引擎。由于每个引擎的下一个处理引擎都是特定的,所以return的值基本上也是确定的,可以通过官方文档获取。各引擎的处理流程图如下:

    wKiom1Qe7A7DjFuNAAFeXnOTfQA147.jpg


vcl_recv : 接收用户请求,判断是否是可缓存数据。
    vcl_pipe :不可缓存数据,直接管道后端处理
    vcl_hash :可缓存数据,通过hash机制处理,默认url做key;也可以自定义区分客户端是否支持处理压缩数据而判断区分缓存。
        vcl_hit : 命中          
        vcl_miss :未命中          vcl_fetch : 后端取数据
             vcl_pass :给命中或者未命中的数据提供一个特殊位置以对请求的数据进行特殊处理
vcl_deliver: 1.hit直接deliver; 2.fetch直接deliver



4.内部处理流程

        wKiom1Qe7IbRRHkVAAINQZRar-k711.jpg


5.简单安装

     可以直接去官网下载需要的版本: https://www.varnish-cache.org/installation/redhat

[root@node30 ~]# wget  https://repo.varnish-cache.org/redhat/varnish-3.0.el6.rpm
[root@node30 ~]# rpm -ivh varnish-3.0.el6.rpm
[root@node30 ~]# cat /etc/yum.repos.d/varnish.repo
    [varnish-3.0]
    name=Varnish 3.0 for Enterprise Linux el6 - $basearch
    baseurl=http://repo.varnish-cache.org/redhat/varnish-3.0/el6/$basearch
    enabled=1
    gpgcheck=0
    #gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-VARNISH
[root@node30 ~]# yum install varnish
    Downloading Packages:
    (1/2): varnish-3.0.5-1.el6.x86_64.rpm                  |   444 kB       00:10    
    (2/2): varnish-libs-3.0.5-1.el6.x86_64.rpm             |   42 kB        00:01    
[root@node30 ~]# service varnish start

 

6.配置文件

 #vim /etc/sysconfig/varnish
    NFILES=131072           #最大打开文件数65536*2
    MEMLOCK=82000           #默认日志文件大小,单位kB
    NPROCS="unlimited"      #最大线程数量
    RELOAD_VCL=1            #设置为1可以使用reload代替restart加载vcl
     
    ## Alternative 1 Minimal configuration, no VCL
    #DAEMON_OPTS="-a :6081     #             -T localhost:6082     #             -b localhost:8080     #             -u varnish -g varnish     #             -s file,/var/lib/varnish/varnish_storage.bin,1G"
     
    ## Alternative 2, Configuration with VCL
    #DAEMON_OPTS="-a :6081     #             -T localhost:6082     #             -f /etc/varnish/default.vcl     #             -u varnish -g varnish     #             -S /etc/varnish/secret     #             -s file,/var/lib/varnish/varnish_storage.bin,1G"
     
    ## Alternative 3, Advanced configuration
    VARNISH_VCL_CONF=/etc/varnish/default.vcl   # 定义vcl配置文件
    # VARNISH_LISTEN_ADDRESS=                   # 定义varnish服务监听地址
    VARNISH_LISTEN_PORT=6081                    # 定义varnish服务监听端口
    VARNISH_ADMIN_LISTEN_ADDRESS=127.0.0.1      # 定义允许进行进程管理地址
    VARNISH_ADMIN_LISTEN_PORT=6082              # 定义管理进程监听端口
    VARNISH_SECRET_FILE=/etc/varnish/secret     # 定义密码文件
    VARNISH_MIN_THREADS=50                      # 定义varnish启动时最小线程数
    VARNISH_MAX_THREADS=1000                    # 定义varnish启动时最大线程数
    VARNISH_THREAD_TIMEOUT=120                  # 定义varnish线程响应超时时间
     
    VARNISH_STORAGE_FILE=/var/lib/varnish/varnish_storage.bin  # 定义varnish文件存储地址
    VARNISH_STORAGE_SIZE=1G                     # 定义缓存使用文件大小,单位:k/M/G/T
    # VARNISH_MEMORY_SIZE=64M                   # 定义缓存使用内存大小
    
    VARNISH_STORAGE="file,${VARNISH_STORAGE_FILE},${VARNISH_STORAGE_SIZE}"# 使用文件缓存
    VARNISH_STORAGE="malloc,${VARNISH_MEMORY_FILE}"                       # 使用内存缓存             
    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}"

 

7.简单设置(反向代理配置)

vim /etc/varnish/default.vcl
    backend default {
        .host = "192.168.1.10";
        .port = "80";
    }

 

8.简单管理工具

# varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082
    varnish> ping
    varnish> vcl.load d1 /etc/varnish/default.vcl
    varnish> vcl.list
    varnish> vcl.use d1
    varnish> vcl.list
    varnish> backend.list
    varnish> storage.list

 

9.访问测试

     发现已经请求到后端httpd服务器上的内容了,今天就介绍到这儿。关于VCL详细的配置说明在下一篇博客中记录。

wKiom1Qe7tzjfBH7AAO9fGLRE_w473.jpg



本文出自 “Haris” 博客,请务必保留此出处http://harisxiong.blog.51cto.com/7513022/1556778

Varnish工作原理及配置详解