varnish缓存总结

一、理论基础

  1. 二种常用的开源解决方案squid、varnish
  2. 条件式请求解决缓存与后端服务器内容更新不匹配问题的二种解决方案(http1.1才支持条件式请求,http1.0只支持过期机制)
    ● last modified /If-Modified-Since:基于时间戳来请求,客户端会发一个首部,自从这个时间之后你有没有改变过
    ● Etag(扩展标记)/If-None-Match:每次服务端内容改变生成Etag发给客户端,客户端每次请求将Etag发给服务端,服务端将请求内容提取出来hash出Etag 进行比较
  3. 判断过期与否:过期时间Expires
    ● HTTP/1.0
    Expires:过期
    ● HTTP/1.1
    Cache-Control:maxage= (所有缓存的缓存时长)
    Cache-Control:s-maxage= (公共缓存的缓存时长)
  4. 程序架构
    ● Manager进程
    ● Cacher进程,包含多种类型的线程accept、worker、expiry.......
    ● shared memory log:共享内存日志(滚动存储只有80M左右大小)
    查看保存导出类小工具:varnishlog,varnishcsa,varnishstat.....
    ● 配置接口:VCL(varnish configuration language)
  5. varnish的程序环境
    ● /etc/varnish/varnish.params:配置varnish服务进程的工作特性,例如监听的地址和端口,缓存机制;
    ● /etc/varnish/default.vcl:配置各child/cache线程的缓存策略
    ● /usr/sbin/varnishd: 主程序
    ● /usr/bin/varnishadm: 管理命令接口
    ● Shared Memory Log 交互工具
    /usr/bin/varnishhist
    /usr/bin/varnishlog
    /usr/bin/varnishcsa
    /usr/bin/varnishstat
    /usr/bin/varnishtop
    ● 测试工具程序:/usr/bin/varnishtest
    ● VCL配置文件重载程序:/usr/sbin/varnish_reload_vcl
  6. 常用状态引擎:
    ● 前端线程Frontend Workthread
    vcl_recv ,vcl_hash, vcl_hit, vcl_miss, vcl_purge, vcl_pipe, vcl_pass
    vcl_deliver, vcl_synth
    ● 后端线程对服务器端Backend Workthead
    vcl_backend_fetch, vcl_backedn_response, vcl_backend_error
  7. 查看状态引擎的一些默认配置
    ● varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082 连上管理程序
    ● help 一下,看到一些管控的子命令
    ● vcl.list :查看当前生效的配置
    ● vcl.show boot 查看生效配置的代码 vcl.show -v boot 查看详细的默认代码
  8. 内部常用变量总结(分三大类req类,be类,obj类)
    ● req.method :http请求方法(GET,HEAD,PUT,POST,TRACE,OPTIONS,DELETE
    ● req.http.Authorization:用户的请求认证方法
    ● req.url:请求报文中的url
    ● req.http.Cookie:用户的请求cookie信息
    ● req.http.User_Agent ~ "chrome" 用户浏览器类型
    ● req.http.Referer:防盗链用的,从那跳转过来
    ● bereq.http.HEAERS
    ● berep.request:请求方法
    ● bereq.url:请求的url
    ● bereq.proto:请求相关的协议
    ● bereq.backend:指明要调用的后端主机
    ● beresp.http.HEADERS
    ● beresp.status:响应的状态码
    ● beresp.proto:协议版本
    ● beresp.backend.name:BE主机的主机名
    ● beresp.ttl:BE主机响应的内容的余下的可缓存时长
    ● obj.hits:此对象从缓存中命中的次数
    ● obj.ttl:对象的ttl值
    ● server.ip:varnish主机的IP
    ● server.hostname:varnish主机的hostname
    ● clien.ip:发请求至varnish主机的客户端IP
    ● 用户自定义:set ,unset
    ● 示例1:强制对某类资源的请求不检查缓存
Paste_Image.png

● 示例2:对于特定类型的资源,例如公开的图片等,取消其私有标识,并强行设定基可以varnish缓存的时长;定义在val_backend_response中

Paste_Image.png

● 示例3:定义在val_recv中

Paste_Image.png

二、缓存对象的修剪purge,ban等操作

  1. 能执行purge操作
    sub vcl_purge {
    return (synth(200,"Purged"));
    }
  2. 何时执行purge操作
    sub vcl_recv{
    if ( req.method == "PURGE") {
    return(purge);
    }
    }
  3. 对此类请求添加访问控制机制
    acl purgers {
    "127.0.0.0"/8;
    "10.1.0.0"/16;
    }
    sub vcl_recv {
    if (req.method == "PURGE") {
    if ( !client.ip ~ purgers ) {
    return(synth(405,"purging not allowed for" + client.ip));
    }
    return(purge);
    }
    }
  4. 将同类操作ban在一起,ban的设置
    ● 在varnishadm命令下,用ban命令(方法1)
    ● ban < field><operator><arg>
    示:ban req.url ~ ^/javascripts
    ● 在配置文件中定义,使用ban()函数(方法2)
    示:if ( req.method == "BAN" ) {
    ban("req.http.host ==" + req.http.host + "&&req.url ==" +req.url);
    return(synth(200,"ban added"));
    }

三、varnish后连多个终端,实现动静资源分离

backend default {
.host = "172.16.100.6";
.port = "80";
}
backend appsrv {
.host = "172.16.100.7";
.port = "80";
}
sub vcl_recv {
if (req.url ~ "(?i).php$") {
set req.backend_hint = appsrv;
} else {
set req.backedn_hint = default;
}
}

四、后端同种资源服务器之间的调度

  1. 使用前先导入import directors

  2. 示例:
    import directors:
    backend server1 {
    .host=
    .port=
    }
    backend server2 {
    .host =
    .port =
    }
    sub vcl_init { #初始化一下,把同样功能的多个服务器定义为一个组
    new GROUP_NAME = directors.round_robin(); 设置调度算法
    GOUP_NAME.add_backend(server1);
    GOUP_NAME.add_backend(server2);
    }
    sub vcl_recv {
    set req.backend_hint = GROUP_NAME.backend();
    }

  3. 基于cookie的session sticky
    sub vcl_init {
    new h = directors.hash();
    h.add_backend(one,1); // backend 'one' with weight '1'
    h.add_backend(two,1); //backend 'two' with weight '1'
    }
    sub vcl_recv {
    set req.backend_hint = h.backend(req.http.cookie);
    }

  4. 后端主机健康状态检查
    ● 方法一:每个backend里都定义
    backend BE_NAME {
    .host =
    .port =
    .probe = {
    .url= 对哪个url进行检查
    .timeout= 超时时间
    .interval= 每隔多长时间检查一次
    .window= 基于最近的几次进行判断
    .threshold= 域 值 ,有几次成功的次数
    }
    }
    ● 统一定义,后面各自调用
    ● 示例:
    probe check {
    .url = "/.healthcheck.html";
    .window = 5;
    .threshold = 4;
    .interval = 2s;
    .timeout = 1s;
    }
    backend default {
    .host = "10.1.1.68";
    .port = "80";
    .porbe = check;
    }
    backend appsrv {
    .host = "10.1.1.69";
    .port = "80";
    .probe = "check";
    }
    ● 手动设置为管理healthy与sick状态,在varnishadm连接命令下
    backend.set_health server1 sick 设置
    backend.list 查看
    backend.set_health auto 再恢复原有设置

  5. 设置后端的主机属性:
    backend BE_NAME {
    .....
    .connect_timeout = 0.5s;
    .first_byte_timeout = 20s;
    .between_bytes_timeout = 5s;
    .max_connections = 50;
    }

  6. 设置修改进程池,等相关参数的设置,并永久有效
    ● /etc/varnish/varnish.params 修改或者添加
    ● DAEMON_OPTS="-p thread_pools=4 -p thread_pool_max=10000"
    ● 设了四个进程池,每个进程池一万并发量
    ● thread_pool_min :最大空闲线程数
    ● thread_pool_timeout:线程空闲时长,并移除掉
    ● thread_pool_add_delay:添加新线程的延时期
    ● thread_pool_destroy_delay:线程超时后,再给个宽限期

五、varnish日志工具

  1. varnishstat
    ● varnishstat -1 -f MAIN.cache_hit -f MAIN.cache_miss
    显示指定参数的当前统计数据
    ● varnishstat -l -f MAIN -f MEMPOOL
    列出指定配置段的每个参数的意义
  2. varnishtop
  3. varnishlog :以KV数据显示日志信息
    ● varnishncsa:以传统格式显示
    ● varnishncsa -D -a -w /var/log/varnish/access.log 自己手动指明日志保存到什么位置的文件中
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容