码迷,mamicode.com
首页 > 其他好文 > 详细

Varnish详解与实战

时间:2014-09-25 23:48:18      阅读:369      评论:0      收藏:0      [点我收藏+]

标签:代理服务器   target   机构   加速器   blank   

一、简介:

Varnish 是一款高性能且开源的反向代理服务器和 HTTP 加速器,其采用全新的软件体系机构,和现在的硬件体系紧密配合,与传统的 squid 相比,varnish 具有稳定,且效率更高,资源占用更少等优点。

Varnish的官网为https://www.varnish-cache.org,rpm,rpm包的下载位置为:http://repo.varnish-cache.org

二、varnish结构特点:

1、varnish结构

三大部分,客户端,varnish处理,varnish日志。如图

 

2、varnish特点:

     varnish主要运行两个进程:Management进程和Child进程(也叫Cache进程)。bubuko.com,布布扣

     Management进程主要实现应用新的配置、编译VCL、监控varnish、初始化varnish以及提供一个命令行接口等。Management进程会每隔一段时间探测一下Child进程以判断其是否正常运行,如果在指定的时长内未得到Child进程的回应,Mangagement将会重启此Child进程。

     Child进程包含多种类型的线程,关键点有:

          Acceptor进程:接受新的连接请求并响应

          worker进程:child进程会为每个用户启动一个worker进程,因此,在高并发的场景中可能会出现数百个worker进程甚至更多

          Object Expiry进程:从缓存中清理过期内容

     Varnish依赖“工作区(workspace)”以降低线程在申请或修改内存时出现竞争的可能性。在varnish内部有多种不同的工作区,其中最关键的当属用于管理会话数据的session工作区。

3、varnish日志:

   varnish共享内存大小一般为90M,其分为两部分,计数器和为客户端请求的数据。varnish通过varnishlog、varnishncsa、varnishstst等来分析共享内存日志中的信息并能够以指定的方式进行显示

4、varnish缺点:

    varnish在高并发状态下,CPU、I/O和内存等资源的开销高于Squid。Varnish的进程一旦挂起、崩溃或者重启,缓存的数据都会从内存中释放出来。此时的所有请求都会被发送到后端应用服务器上,在高并发的情况下,就会给后端服务器造成很大压力。

三、varnish的工作原理及工作流程

工作原理:

    1、Varnish 与一般服务器软件一样,分为master 进程和child 进程。master进程读入存储配置文件,调用合适的存储类型,然后创建/ 读入相应大小的缓存文件,接着master 初始化管理该存储空间的结构体,然后fork 并监控child 进程。child进程在主线程的初始化的过程中,将前面打开的存储文件整个mmap 到内存中,此时创建并初始化空闲结构体,挂到存储管理结构体,以待分配。child进程分配若干线程进行工作,主要包括一些管理线程和很多worker 线程。

    2、开始真正的工作,varnish的某个负责接收新HTTP 连接线程开始等待用户,如果有新的HTTP连接过来,它总负责接收,然后唤醒某个等待中的线程,并把具体的处理过程交给它。Worker线程读入HTTP 请求的URI,查找已有的object,如果命中则直接返回并回复用户。如果没有命中,则需要将所请求的内容,从后端服务器中取过来,存到缓存中,然后再回复。

    3、分配缓存的过程是这样的:它根据所读到object 的大小,创建相应大小的缓存文件。为了读写方便,程序会把每个object的大小变为最接近其大小的内存页面倍数。然后从现有的空闲存储结构体中查找,找到最合适的大小的空闲存储块,分配给它。如果空闲块没有用完,就把多余的内存另外组成一个空闲存储块,挂到管理结构体上。如果缓存已满,就根据LRU 机制,把最旧的object 释放掉。

    4、释放缓存的过程是这样的:有一个超时线程,检测缓存中所有object 的生存期,如果超初设定的TTL(Time To Live)没有被访问,就删除之,并且释放相应的结构体及存储内存。注意释放时会检查该存储内存块前面或后面的空闲内存块,如果前面或后面的空闲内存和该释放内存是连续的,就将它们合并成更大一块内存。

    5、整个文件缓存的管理,没有考虑文件与内存的关系,实际上是将所有的object 都考虑是在内存中,如果系统内存不足,系统会自动将其换到swap 空间,而不需要varnish 程序去控制。

    官方提供的工作流程图:

bubuko.com,布布扣

四、varnish实战:

1、拓扑图:

bubuko.com,布布扣

2、安装配置:    
# 安装包下载地址:
http://repo.varnish-cache.org/redhat/varnish-4.0/el6/

yum -y install varnish-3.0.5-1.el6.x86_64.rpm varnish-docs-3.0.5-1.el6.x86_64.rpm varnish-libs-3.0.5-1.el6.x86_64.rpm     
vim /etc/sysconfig/varnish # 编辑配置文件,修改如下项
VARNISH_LISTEN_PORT=80 # varnish监听端口改为80端口
VARNISH_STORAGE_SIZE=64M # 此值根据自身情况调整,测试环境可调低此值
VARNISH_STORAGE="malloc,${VARNISH_STORAGE_SIZE}" #使用malloc(即内存)作为缓存对象存储方式;
service varnish start # 启动varnish
varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082 # 登录管理命令行
varnish> vcl.list                 # 列出所有的配置
varnish> vcl.load test1 ./test.vcl  # 加载编译新配置,test1是配置名,test.vcl是配置文件
varnish> vcl.use test1            # 使用配置,需指定配置名,当前使用的配置以最后一次vcl.use为准
varnish> vcl.show test1           # 显示配置内容,需指定配置名

 

3、主配置文件分析

vim /etc/varnish/default.vcl
# This is a basic VCL configuration file for varnish. See the vcl(7)
# man page for details on VCL syntax and semantics.
#
# Default backend definition. Set this to point to your content
# server.
#      
import directors;    # 导入directors模块;
probe backend_healthcheck {    # 创建健康监测机制;
    .url = "/health.html";
    .window = 5;
    .threshold = 2;
    .interval = 3s;
}
backend web1 {    # 创建后端主机;
    .host = "192.168.1.4";
    .port = "80";
    .probe = backend_healthcheck;
}
backend web2 {
    .host = "192.168.1.5";
    .port = "80";
    .probe = backend_healthcheck;
}
backend img1 {
    .host = "192.168.1.4";
    .port = "4040";
    .probe = backend_healthcheck;
}
backend img2 {
    .host = "192.168.1.5";
    .port = "4040";
    .probe = backend_healthcheck;
}
sub vcl_init {    # 创建后端主机组,即directors;
    new web_cluster = directors.random();
    web_cluster.add_backend(web1,1.0);
    web_cluster.add_backend(web2,1.0);
    new img_cluster = directors.random();
    img_cluster.add_backend(img1,1.0);
    img_cluster.add_backend(img2,1.0);
}
acl purgers {    # 定义可访问来源IP;
        "127.0.0.1";
        "192.168.0.0"/24;
}
sub vcl_recv {
    if (req.method == "GET" && req.http.cookie) {    # 带cookie首部的GET请求也缓存;
        return(hash);
    }
    if (req.url ~ "test.html") {    # test.html文件禁止缓存;
        return(pass);
    }
    if (req.method == "PURGE") {    # PURGE请求的处理;
        if (!client.ip ~ purgers) {
            return(synth(405,"Method not allowed"));
        }
        return(hash);
    }
    if (req.http.X-Forward-For) {    # 为发往后端主机的请求添加X-Forward-For首部;
        set req.http.X-Forward-For = req.http.X-Forward-For + "," + client.ip;
    } else {
        set req.http.X-Forward-For = client.ip;
    }
    if (req.http.host ~ "(?i)^(www.)?lnmmp.com$") {    # 根据不同的访问域名,分发至不同的后端主机组;
            set req.http.host = "www.lnmmp.com";
            set req.backend_hint = web_cluster.backend();
    } elsif (req.http.host ~ "(?i)^images.lnmmp.com$") {
            set req.backend_hint = img_cluster.backend();
    }
    return(hash);
}
sub vcl_hit {
    if (req.method == "PURGE") {    # PURGE请求的处理;
        purge;
        return(synth(200,"Purged"));
    }
}
sub vcl_miss {
    if (req.method == "PURGE") {    # PURGE请求的处理;
        purge;
        return(synth(404,"Not in cache"));
    }
}
sub vcl_pass {
    if (req.method == "PURGE") {    # PURGE请求的处理;
        return(synth(502,"PURGE on a passed object"));
    }
}
sub vcl_backend_response {     # 自定义缓存文件的缓存时长,即TTL值;
        if (bereq.url ~ "\.(jpg|jpeg|gif|png)$") {
                set beresp.ttl = 7200s;
        }
        if (bereq.url ~ "\.(html|css|js)$") {
                set beresp.ttl = 1200s;
        }
    if (beresp.http.Set-Cookie) {    # 定义带Set-Cookie首部的后端响应不缓存,直接返回给客户端;
        return(deliver);
    }
}
sub vcl_deliver {
    if (obj.hits > 0) {    # 为响应添加X-Cache首部,显示缓存是否命中;
        set resp.http.X-Cache = "HIT from " + server.ip;
    } else {
        set resp.http.X-Cache = "MISS";
    }
}

 

4、测试结果:

bubuko.com,布布扣

本文出自 “gentoo” 博客,请务必保留此出处http://linuxgentoo.blog.51cto.com/7678232/1558263

Varnish详解与实战

标签:代理服务器   target   机构   加速器   blank   

原文地址:http://linuxgentoo.blog.51cto.com/7678232/1558263

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!