zoukankan      html  css  js  c++  java
  • Varnish是一款高性能的开源HTTP加速器

    • 如何衡量缓存系统的优劣性
    1:缓存命中率:
    在memcached服务器中,get_hits的值表示缓存命中的次数,get_misses的值表示没有命中的次数,那么命中率的计算公式就是:命中率=get_hits/(get_hits+get_misses)
    终端用户访问加速节点时,如果该节点有缓存住了要被访问的数据时就叫做命中,如果没有的话需要到原服务器取,就是没有命中。取数据的过程与用户访问是同步进行的,所以即使是重新取的新数据,用户也不会感觉到有延时。 命中率=命中数/(命中数+没有命中数), 缓存命中率是判断加速效果好坏的重要因素之一。
     
     
    2:命中率有两种衡量指标
    文档命中率:从命中的文档数量角度来衡量
    字节命中率:从命中的字节大小角度来衡量
    • 应该让哪些资源被缓存
    1:静态资源中的公共资源缓存
    2:静态资源中的私有资源不缓存
    3:动态资源中的公共资源缓存
    4:动态资源中的私有资源不缓存
    HTTP/1.0 响应首部
    Expires
    HTTP/1.1 响应首部
    Cache-Control:max-age=60
    •  

    (三)varnish进

     
     

    • 安装
    RPM包
    yum install -y varnish
     
    编译安装
    wget http://varnish-cache.org/_downloads/varnish-4.0.5.tgz
    • 官方文档
    http://varnish-cache.org
    • varnish存储类型
    1)Malloc 通过malloc获取内存,及分配内存。
    2)Mmap file 创建大文件,通过二分法分段映射成1G以内的大块。
    • varnish配置文件讲解
    default.vcl :主配置文件
     
    varnish.params :服务器参数配置文件

    (四)varnish配置文件详解

     
     

    • 配置varnish进程参数的配置文件/etc/varnish/varnish.params,在启动varnish的时候,就会调用这个文件,可以在/usr/lib/systemd/system/varnish.service文件中看到,启动是确实调用了这个参数文件
     
    # 指定重新reload varnish的时候,重新reload一下VCL配置文件
    RELOAD_VCL=1
     
    # 指定VCL的配置文件
    VARNISH_VCL_CONF=/etc/varnish/default.vcl
     
    # 指定varnish作为反代时候监听的地址和端口
    # 在企业级情况下,varnish通常是面向的Nginx或haproxy这样的反代负载均衡器,可以实现端口映射的功能,不一定是80端口
    # 监听的地址为192.168.1.5,默认是注释的,表明监听本机的所有的IP地址
    # VARNISH_LISTEN_ADDRESS=192.168.1.5
    VARNISH_LISTEN_PORT=7000
     
    # 指定varnishadm的shell登入接口
    VARNISH_ADMIN_LISTEN_ADDRESS=127.0.0.1
    VARNISH_ADMIN_LISTEN_PORT=6082
     
    # 指定shell接口使用的密钥文件
    VARNISH_SECRET_FILE=/etc/varnish/secret
     
     
    # 指定varnish存储的类型,以及大小,这里使用默认的内存缓存,大小为256M即可, 也可以使用file的存储
    # VARNISH_STORAGE="file,/var/lib/varnish/varnish_storage.bin,1G"
    VARNISH_STORAGE="malloc,256M"
     
    # 指定varnish进程的属主和属组
    VARNISH_USER=varnish
    VARNISH_GROUP=varnish
     
    # 指定运行时的参数,使用-p选项来指定,thread_pools=6:表示启用6个线程池,thread_pool_min=5:表示每个线程池里面最少5个线程,thread_pool_max=500:表示每个线程池里面最大500个线程,thread_pool_timeout=300:表示线程的请求超时时长
    DAEMON_OPTS="-p thread_pools=6 -p thread_pool_min=5 -p thread_pool_max=500 -p thread_pool_timeout=300"
    • 请求过程和响应过程分析
    请求处理流程
    (1)请求的为可以缓存对象
    1:缓存命中:通过本地缓存响应客户端
    2:缓存未命中:varnish扮演为客户端的角色,发送请求报文,向后端服务器请求资源对象,可以缓存的对象先缓存再响应给客户端,不可以缓存的对象,不缓存直接响应给客户端
     
    (2)请求的为不可以缓存对象
    1:varnish扮演为客户端的角色,发送请求报文,向后端服务器请求资源对象
    • 在编写vcl配置文件中,常用的对象分类
    1:req.:由客户发来的http请求相关
    req.http.:拿到请求报文各个首部值
    例如:req.http.Cookie 拿到请求报文中的Cookie首部的值
     
     
    2:resp.:由varnish响应给client的http响应报文
    resp.http. :响应报文的各个首部
    例如:set resp.http.X-Cache = "HIT from " + server.hostname 给X-Cache首部赋值
     
     
    3:bereq.:由varnish向backend主机发出的http请求 (backend request:后端主机的请求报文)
    bereq.http. :向backend主机发送的请求报文的对象
     
     
    4:beresp.:由backend主机发来的http响应报文
    beresp.http. :由backend主机发来的http的响应报文的对象
     
     
    5:obj. :存储在缓存空间中的缓存对象属性
    • 在编写vcl配置文件中,常用的对象,已经对象的意义说明
    1:req
    req.method:请求的方法
    req.url:请求的URL
     
    2:bereq
    bereq.http.HEADERS:varnish的请求报文首部
    bereq.request:请求方法
    bereq.url:请求的URL
    bereq.proto:协议版本
    bereq.backend:指明要调用的后端主机
     
    3:beresp
    beresp.proto:后端主机响应给varnish的协议版本
    beresp.status:响应状态码
    beresp.backend.name:后端主机的主机名
    beresp.http.HEADERS:后端主机响应报文的首部
    beresp.ttl:后端主机响应内容ttl值
     
    4:obj
    obj.hits:对象在缓存中命中的次数
    obj.ttl:对象的ttl值
     
    5:server:
    server.ip:主机的IP
    server.hostname:主机名
     
    vcl 4.0;
     
    # 导入调度器模块
    import directors;
     
    #############################(一)################################
    # 指定调度到后端的主机
    backend web1 {
    .host = "192.168.23.21";
    .port = "8000";
    .probe = {
    # 指定做健康状态检查的URL,既然给了这个URL,一定需要让后端主机的站点目录里面有这个URL,如果没有varnish将不会将请求调度到这台主机上
    .url = "/health.html";
    # 指定检查的超时时长
    .timeout = 2s;
    # 检查每次检查的时间间隔
    .interval = 4s;
    # 指定一个检测多少次
    .window = 5;
    # 指定最少成功多少次认为后端主机有效
    .threshold = 1;
    }
    }
     
    backend web2 {
    .host = "192.168.23.22";
    .port = "8000";
    .probe = {
    # 指定做健康状态检查的URL
    .url = "/health.html";
    # 指定检查的超时时长
    .timeout = 2s;
    # 检查每次检查的时间间隔
    .interval = 4s;
    # 指定一个检测多少次
    .window = 5;
    # 指定最少成功多少次认为后端主机有效
    .threshold = 1;
    }
    }
     
     
    #############################(二)################################
     
    # 定义负载均衡调度器
    sub vcl_init {
    # 创建一个调度器对象,directors.round_robin()指定了轮询调度算法
    new static = directors.round_robin();
    static.add_backend(web1);
    static.add_backend(web2);
    }
     
     
     
    #############################(三)################################
    # 第一个子历程,当收到请求处理的子历程
    sub vcl_recv {
     
    # 指定varnish接受到的请求,如果缓存没有命中,直接全部发往后端的static主机组
    set req.backend_hint = static.backend();
     
     
    # 如何请求方法是pri,直接返回synth子历程
    if (req.method == "PRI") {
    /* We do not support SPDY or HTTP/2.0 */
    return (synth(405));
    }
     
     
    # 如果不是一下七中方法的任意一个,直接返回pipe子历程
    if (req.method != "GET" &&
    req.method != "HEAD" &&
    req.method != "PUT" &&
    req.method != "POST" &&
    req.method != "TRACE" &&
    req.method != "OPTIONS" &&
    req.method != "DELETE") {
    /* Non-RFC2616 or CONNECT which is weird. */
    return (pipe);
    }
     
     
    # 如果不是get或者head方法,我们就不用去查缓存,直接交由后端主机处理就是
    if (req.method != "GET" && req.method != "HEAD") {
    /* We only deal with GET and HEAD by default */
    return (pass);
    }
     
     
    # 如果客户端的请求报文中的http首部包含认证信息或cookie信息,也直接交由后端主机处理,这是保密的静态内容
    # 由于在haproxy对于动态请求都会在用户的浏览器中设置cookie信息,因此,下面这项先将其注释掉,以免请求都不能查询缓存
    #if (req.http.Authorization || req.http.Cookie) {
    # /* Not cacheable by default */
    # return (pass);
    #}
     
     
     
     
     
     
    # 否则其他的请求都通过hash子历程处理
    return (hash);
    }
     
     
    #############################(四)################################
     
    # 对后端主机响应的响应报做修改
    sub vcl_backend_response {
     
    # 如何发往后端主机的请求报文的http首部中没有s-maxage参数,那么做两个if判断
    # 1:如果请求的是css样式代码,设置响应回来的资源对象的ttl值为7200s,并且删除Set-Cookie参数
    # 2:如果请求的是jpg图片,设置响应回来的资源对象的ttl值为7200s,并且删除Set-Cookie参数
    # 其他的请求都交由deliver子历程处理
    if (beresp.http.cache-control !~ "s-maxage"){
    # 这里要写为bereq.url,如果写成beresp.url会报错
    if (bereq.url ~ "(?i).css$") {
     
    set beresp.ttl = 7200s;
    unset beresp.http.Set-Cookie;
     
    }
     
    if (bereq.url ~ "(?i).js$") {
     
    set beresp.ttl = 7200s;
    unset beresp.http.Set-Cookie;
     
    }
     
    if (bereq.url ~ "(?i).jpg$") {
     
    set beresp.ttl = 7200s;
    unset beresp.http.Set-Cookie;
     
    }
    }
     
    return (deliver);
    }
     
    #############################(五)################################
     
     
    # 这一条子历程是最后一个子历程
    # 在deliver子历程中可以修改响应报文http的首部
    sub vcl_deliver {
     
    # 如果客户端的请求被缓存命中,那么加一个http的首部参数,明确告诉用户请求的资源是从缓存加载的
    if (obj.hits>0)
    {
     
    set resp.http.X-Cache = "HIT from " + server.hostname;
     
    }else{
     
    set resp.http.X-Cache = "MISS from " + server.hostname;
     
    }
     
    }

    (五)varnish工具介绍(对于缓存服务器,修改了配置,千万不能重启,重启就会清空所有的内存)

     
     

    • varnishadm
    # 获取帮助
    varnishadm -h
     
    # 登入到varnishadm的命令行接口
    varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082
     
    # 获取命令帮助
    help
     
    # 装载指定的配置文件
    vcl.load <configname> <filename>
    例如:vcl.load config1 default.vcl
     
    # 使用指定的配置文件
    vcl.use <configname>
    例如:vcl.use config1
     
    # 删除配置文件
    vcl.discard <configname>
    例如:vcl.discard boot
     
    # 列出所有可用的配置文件
    vcl.list:
    例如:vcl.list
     
    # 显示配置文件的内容
    vcl.show [-v] <configname>
    例如:vcl.show config1
     
    # 列出后端可用的主机
    backend.list
    • varnishstat
    查看varnish服务器的状态信息
  • 相关阅读:
    每天进步一小点
    C# 类
    XML JavaScript
    基础XML
    多态,重载,重写
    数据结构
    sql server规范
    .net core 使用TimeZoneInfo类的时间与时间戳转换
    git 重命名文件与文件夹
    IDEA spring boot 开启热加载
  • 原文地址:https://www.cnblogs.com/liu1026/p/7588121.html
Copyright © 2011-2022 走看看