Varnish配置示例

标签(空格分隔): 未分类


开始前先修改Varnish的缓存存储方式,监听端口号

[root@varnish varnish]# vim varnish.params
VARNISH_LISTEN_PORT=80
VARNISH_STORAGE="file,/data/web/cache,2g"

[root@varnish varnish]# mkdir -pv /data/web/cache
[root@varnish varnish]# systemctl restart varnish

示例

在响应首部增加一个cache是否命中的字段X-cache

sub vcl_deliver {
    # Happens when we have all the pieces we need, and are about to send the
    # response to the client.
    #   
    # You can do accounting or modifying the final object here.
    if ( obj.hits>0 ) {
        set resp.http.X-cache = "HIT via" + server.ip;
        } else {
        set resp.http.X-cache = "Miss via" + server.ip;
        }
}
[root@varnish varnish]# varnish_reload_vcl

客户端测试

第一次请求
[root@client ~]# curl -I  http://192.168.30.33/test.html
HTTP/1.1 200 OK
...
Via: 1.1 varnish-v4
X-cache: Miss via192.168.30.33  #第一次MISS

第二次请求

[root@client ~]# curl -I  http://192.168.30.33/test.html
...
X-cache: HIT via192.168.30.33   #第二次命中
Connection: keep-alive

强制对某类资源的请求不检查缓存:

例如对url中开头为/admin或者/login的不检查缓存

sub vcl_recv {
    # Happens before we check if we have this in cache already.
    #
    # Typically you clean up the request here, removing cookies you don't need,
    # rewriting the request, etc.
    if (req.url ~ "(?i)^/(admin|login)") {
        return(pass);
        }
}

~]# vcl.load test1 de.vcl
200        
~]# VCL compiled.
vcl.use test1 


在服务器上创建2个对应目录和创建index文件

[root@rs1 ~]# mkdir -pv /usr/share/nginx/html/{admin,login}
mkdir: 已创建目录 "/usr/share/nginx/html/admin"
mkdir: 已创建目录 "/usr/share/nginx/html/login"
[root@rs1 ~]# echo "admin " > /usr/share/nginx/html/admin/index.html
[root@rs1 ~]# echo "login " > /usr/share/nginx/html/login/index.html

在客户端上测试

[root@client ~]# curl -I  http://192.168.30.33/admin
HTTP/1.1 301 Moved Permanently
...
X-cache: Miss via192.168.30.33  #无论多少次,都不会查缓存


对于特定类型的资源,例如公开的图片等,取消其私有标识,并强行设定其可以由varnish缓存的时长;

sub vcl_backend_response {

    if (beresp.http.cache-control !~ "s-maxage") {  #如果是非公用数据,则进入判断
        if (bereq.url ~ "(?!)\.(jpg|jpeg|png|png|gif|css|js)") {   #如果数据是以静态文件结尾的话,则进入
                unset bereq.http.Set-cookie;    #取消请求报文的cookie值
                set beresp.ttl=3600s;   #设置响应报文的ttl
        }
        }
}

缓存对象的修剪:purge, ban

(1) 能执行purge操作
sub vcl_purge {
return (synth(200,"Purged"));
}

(2) 何时执行purge操作
sub vcl_recv {
if (req.method == "PURGE") {        #当方法时purge时执行purge操作。
return(purge);
}
...
}

客户端测试

[root@client ~]# curl -I   http://192.168.30.33/test.html
X-cache: HIT via192.168.30.33   #已缓存

[root@client ~]# curl -X PURGE http://192.168.30.33/test.html
<!DOCTYPE html>
<html>
  <head>
    <title>200 Purged</title>   #修剪成功
  </head>
  <body>
    <h1>Error 200 Purged</h1>   
    <p>Purged</p>
    <h3>Guru Meditation:</h3>
    <p>XID: 63</p>
    <hr>
    <p>Varnish cache server</p>
  </body>
</html>

为了防止其他人随意修剪,应该设置一个访问控制

acl purges {
"127.0.0.1"/8;
}

sub vcl_recv {
    if (req.method == "PURGE") {
        if (client.ip ~ purges) {
        return(purge);
        } else {
        return(synth(405,"Purging not allowed for" + clietn.ip));
        }
}
}

在客户端测试

[root@client ~]# curl -X PURGE http://192.168.30.33/test.html
<!DOCTYPE html>
<html>
  <head>
    <title>405 Purging not allowed for192.168.30.148</title>
  </head>
  <body>
    <h1>Error 405 Purging not allowed for192.168.30.148</h1>
    <p>Purging not allowed for192.168.30.148</p>
    <h3>Guru Meditation:</h3>
    <p>XID: 32841</p>
    <hr>
    <p>Varnish cache server</p>
  </body>
</html>

BAN
在CLI命令行中直接BAN,也可以在配置文件中定义
varnishadm:
ban <field> <operator> <arg>
示例:
ban req.url ~ ^/javascripts

设定使用多个后端主机

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;            #php资源转发至appsrv处理
  } else {
      set req.backend_hint = default;
   }    
  ...
}

定义后端服务器组

使用前需要在vcl配置中导入模块:import director
三步走:先定义后端主机,然后定义组,往组中添加主机,最后调用组

示例:
import directors; # load the directors

backend server1 {                 
.host = 
.port = 
}
backend server2 {
.host = 
.port = 
}

sub vcl_init {      #在init 子函数中定义
new GROUP_NAME = directors.round_robin();   #创建组,并命名为GROUP_NAME,指定调度方法
GROUP_NAME.add_backend(server1);    #为组添加服务器成员
GROUP_NAME.add_backend(server2);
}

sub vcl_recv {
# send all traffic to the bar director:
set req.backend_hint = GROUP_NAME.backend();  #组引用方法
}

#示例:基于cookie的session sticky:
sub vcl_init {
    new h = directors.hash();   h为组名
    h.add_backend(one, 1);   // backend 'one' with weight '1'
    h.add_backend(two, 1);   // backend 'two' with weight '1'
    }

sub vcl_recv {
// pick a backend based on the cookie header of the client
    set req.backend_hint = h.backend(req.http.cookie);
                }       

后端主机健康检测机制

varnish可以对后端主机进行健康检测,动态进行移除或恢复后端主机调度列表

.probe:定义健康状态检测方法;
.url:检测时请求的URL,默认为"/";
.request:发出的具体请求;
.request =
"GET /.healthtest.html HTTP/1.1"
"Host: www.magedu.com"
"Connection: close"
.window:基于最近的多少次检查来判断其健康状态;
.threshhold:最近.window中定义的这么次检查中至有.threshhold定义的次数是成功的;
.interval:检测频度;
.timeout:超时时长;
.expected_response:期望的响应码,默认为200;

健康状态检测的配置方式:

(1) probe PB_NAME = { }
backend NAME = {
.probe = PB_NAME;
...
}

(2) backend NAME {
.probe = {
...
}
}

示例:
probe check {   #定义probe检查项目
.url = "/test.html";
.window = 5;
.threshold = 3;
.interval = 2s;
.timeout = 1s;
}



backend default {
    .host = "192.168.30.11";
    .port = "80";
    .probe = check;     #引用probe名
}


在varniadm 命令接口中查看检测状况

 backend.list
200        
Backend name                   Refs   Admin      Probe
default(192.168.30.11,,80)     7      probe      Healthy 5/5

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

推荐阅读更多精彩内容

  • 缓存的基础知识 1、程序本身具有局部性 时间局部性过去访问到的数据,也有可能被两次访问 空间局部性一个数据被访问到...
    魏镇坪阅读 2,005评论 1 3
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,585评论 18 139
  • 本文编译自:users-guide 本节讲述如何使用 VCL 编写处理 HTTP 流量的策略。 Varnish 的...
    C86guli阅读 3,130评论 0 1
  • 有一种类型的夫妻,男方虽不是嫁给女方,却是在女方家住和女方父母一起生活,或者在女方的城市生活,这些情况,女方在整体...
    敢不敢爱自己阅读 236评论 0 0
  • 拉沃尔,没有尼斯的浮华,没有戛纳的张扬,没有马赛的喧嚣,也没有巴黎的浪漫。拉沃尔,只是法国南部塔恩省一个普通的不能...
    关观阅读 368评论 1 3