小生博客:http://xsboke.blog.51cto.com
-------谢谢您的参考,如有疑问,欢迎交流
目录
-------------------------------------- vcl内置预设变量
-------------------------------------- 功能语句与对象
-------------------------------------- varnish中内置子程序
-------------------------------------- varnish缓存模式和子程序的关系
varnish的安装
varnish实例配置解析
启动varnish
varnish acl配置解析
一、 Varnish简介
1. 作用
2. 特点
3. Varnish的优势
4. Varnish的劣势
在多台varnish实现负载均衡时,每次请求都会落到不同的varnish服务器中,造成url请求可能会穿透到后端
1)劣势解决方案
A、在varnish的后端添加squid/nignx代理,这样防止了当varnish缓存被清空时,瞬间大量的请求发往web服务器
B、在负载均衡上做url哈西,让单个url请求固定请求到一台varnish服务器上
5. Varnish的组成
1) Management进程(管理进程)
对child进程进行管理,同时对vcl配置进行编译
2) Child进程(子进程)
生成线程池,负责处理用户请求
6. Varnish配置组成
l 后端配置:指定后端服务器
l ACL配置:为varnish添加访问控制列表,用于规则设置
l Probes配置:实现后端服务器的健康检查
l Directors配置:为varnish添加集群
l 核心子进程:为后端服务器、缓存、访问控制、错误处理等功能添
一、 arnish配置简介
1. vcl内置预设变量

1)阶段
2)对象






3) 运算符

2. 功能语句与对象
l 一般功能语句都用于匹配对象,就是对某个对象实现什么操作
l 格式为:功能语句(对象)
1)功能语句
2)return的常用动作
语法:return(action)
3. varnish中内置子程序
1) vcl_recv子程序

2) vcl_pipe子程序

3) vcl_pass子程序

4) vc_hit子程序

5) vcl_miss子进程

6) vcl_hash子进程

7) acl_purge子进程

8) vcl_deliver子进程

9) vcl_backend——fetch子程序

10) vcl_backend_response子程序

11) vcl_backend_error子程序

12) vcl_synth子程序

13) vcl_init子进程

14) acl_fini子进程

4. varnish缓存模式和子程序的关系
l varnish的配置文件,就是通过各种子程序组成的,当varnish运行时,也是通过子程序的配置进行相应的操作
l 子程序的关系如下图

1) 右上角的两个图代表:加载vcl时执行vcl_init子程序,卸载vcl时执行vcl_fini子程序
2) 当vcl_recv调用 hash函数时
进入该状态后,会通过vcl_hash子程序,根据请求的url或其他信息生成hash键值,
然后查找hash键值相同的缓存数据,若找到,则进入val_hit状态,否则进入vcl_miss状态

3) 当vcl_recv调用pass 函数时

4) 当vcl_recv判断需要调用 pipe 函数时
5) 当vcl_recv指定purge模式时
Purge模式用于清除缓存
5. 优雅模式garce mode
1) 请求合并
2) 问题
3) 解决问题
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
| 案例: Sub vcl_recv { If (! req.backend.healthy) { 判断如果不健康 set req.grace = 5m;varnish向前端提供5分钟的过期内容 } else { 如果健康 set req.grace = 15s;varnish向前段提供15秒的过期内容 } } sub vcl_fetch { set beresp.grace = 30m;将失效的缓存对象再多保留30分钟 }
|
三、 varnish的安装
1. 下载varnish压缩包
有两个地方可下载
1) 通过Varnish的官方网址http://varnish-cache.org,可以在这里下载最新版本的软件。
但是有时候varnish的官网会被墙
2) GIT下载:git clone https://github.com/varnish/Varnish-Cache/var/tmp/
但是在安装时需要先使用./autogen.sh生成configure编译配置文件
2. Varnish的安装
首先安装依赖包

配置varnish

编译并安装

拷贝vcl文件

官方提供的vcl配置文件没有提示太多的配置信息,在生产环境中还是需要自己进行配置
四、 Varnish VCL实例配置解析
拓扑环境

五、 启动varnish

六、 varnish vcl配置解析
Varnish有自己的编程语法vcl,varnish启动时,会将配置文件编译为C语言,然后再执行
1. 后端服务器地址池配置及后端服务器健康检查
1) 后端服务器定义,用于varnish连接指定的后端服务器


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
| 例:将监控块定义在后端服务器中 backend web{ .host="192.168.31.83";指定后端服务器的IP .port="80";后端服务器的暴露端口 .probe={ 直接追加监控块.probe是一个的参数 .url="/"; .timeout=2s; } } 或:先定义监控块,在定义后端服务器列表 probe web_probe{ 监控必需定义在前面,否则后端调用找不到监控块。 .url="/"; .timeout=2s; } backend web{ .host="192.168.31.83"; .port="80"; .probe=web_probe; 调用外部共用监控块 } |
2) 监视器定义


1 2 3 4 5 6 7 8
|
| 例:创建健康监测,定义健康检查名称为backend_healthcheck probe backend_healthcheck { 创建名为backend_healthcheck的健康检查 .url = "/";监控入口地址为/的 .timeout = 1s;请求超时时间 .interval = 5s;每次轮询间隔5秒 .window = 5;轮询5次 .threshold = 3;必须有3次轮询正常才算该节点正常 } |
3) 负载均衡群集directors
使用random,hash 必须配置权重值,用于提高随机率

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
|
| 例: 加载directors模块 import directors; 配置后端服务器 backend web1 { .host = "192.168.0.10"; .port = "80"; .probe = backend_healthcheck; } backend web2 { .host = "192.168.0.11"; .port = "80"; .probe = backend_healthcheck; } 初始化处理 sub vcl_init { 调用vcl_init初始化子程序创建后端主机组,即directors new web_cluster =directors.round_robin(); 使用new关键字创建drector对象,使用round_robin算法 web_cluster.add_backend(web1); 添加后端服务器节点 web_cluster.add_backend(web2); } 开始处理请求 sub vcl_recv { 调用vcl_recv子程序,用于接收和处理请求 set req.backend_hint = web_cluster.backend(); 选取后端 } |
说明:
2. 访问控制列表(acl)

3. 缓存规则设置

说明:

修改框中的变量,指定为varnish中设置的变量
七、 varnish将不同的url发送到不同的后端server
AutoIt Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
|
| import directors; # load the directors backend web1 { .host = "192.168.0.10"; .port = "80"; .probe = backend_healthcheck; } backend web2 { .host = "192.168.0.11"; .port = "80"; .probe = backend_healthcheck; } 定义后端服务器web1和web2
backend img1 { .host = "img1.lnmmp.com"; .port = "80"; .probe = backend_healthcheck; } backend img2 { .host = "img2.lnmmp.com"; .port = "80"; .probe = backend_healthcheck; } 定义后端服务器img1和img2
//初始化处理 sub vcl_init { //调用vcl_init初始化子程序创建后端主机组,即directors new web_cluster = directors.round_robin(); //使用new关键字创建drector对象,使用round_robin算法 web_cluster.add_backend(web1); //添加后端服务器节点 web_cluster.add_backend(web2); new img_cluster = directors.random(); //创建第二个集群 img_cluster.add_backend(img1,2); 添加后端服务器节点,并且设置权重值 img_cluster.add_backend(img2,5); }
//根据不同的访问域名,分发至不同的后端主机组 sub vcl_recv { if (req.http.host ~ "(?i)^(www.)?benet.com$") { 如果请求头为www.benet.com或benet.com set req.http.host = "www.benet.com"; set req.backend_hint = web_cluster.backend(); //选取后端 } elsif (req.http.host ~ "(?i)^images.benet.com$") { set req.backend_hint = img_cluster.backend(); } } 说明:中的i就是忽略大小写的意思。(?i)表示开启忽略大小写,而(?-i)表示关闭忽略大小写
|