Varnish从菜鸟到专家 一
9 年 ago jony 1
1.1 Varnish 简介及工作原理
Varnish官网地址是 http://varnish-cache.org 或 https://www.varnish-cache.org ,LOGO也没有沿用业内“潜规则”使用动物,而是一个小巫师。
Varnish当前最新的主干版本是 5.0 ,最新稳定版是4.0。就功能讲,企业中更多的应用场景是Web缓存功能,架构中通常扮演的角色如下:
但据官网介绍,Varnish的设计不仅仅是定位于反向代理服务器,根据使用方式的不同,Varnish可扮演的角色也丰富多样,其它可实现的功能如下:
- WEB应用防火墙;
- DDoS攻击防护;
- 网站防盗链;
- 负载均衡;
- integration point(个人没用过);
- 单点登录网关;
- 认证和认证授权;
- 后端主机快速修复;
- HTTP路由
Varnish缓存策略的实现是通过VCL(Varnish Configuration Language)实现,VCL的语法简单,继承了C语言的很多特性,使得VCL样式看起来很像C和PELR语言,VCL配置文件也是通过VCL编译为C代码后继而执行,高效与生俱来。Varnish已在各大型和轻量型应用场景中充分证明其能力。Varnish开源产品全称为Varnish Cache,同时提供功能更为强大齐全的商业套件,全称为Varnish Plus。
1.2.2 Object对象存储机制
Object对象缓存按如下规则存储:
- HTTP响应信息缓存本地;
- Varnish处理的对象在内存中以hash树方式存储;
- 用户可处理和控制hash信息;
- 多个对象可拥有相同的hash地址;
1.3 Object对象存活时间
Varnish基于内存缓存,众所周知,内存即使在现在也是非常昂贵的设备且容量有限,因此所有缓存对象均在缓存周期,过期数据或缓存策略内的数据会被清理。每个Object的生命周期分为如图4个阶段:
http://book.varnish-software.com/4.0/_images/objectlifetime.svg
每个对象拥有1个起初时间缀和3个时间属性,分别是1) TTL, 2) grace, and 3) keep. t_origin,其中:
- 对象缓存周期为 :t_origin->TTL->grace->keep.,之后Object将被从Varnish缓存中删除
- 对象新鲜期为:t_origin->TTL
- 对象陈旧期为:TTL->grace
- If-Modified-Since属性周期为:t_origin->TTL->grace->keep
- Varnish & Squid
简要对比如下:
| 软件 | 存储模式 | 性能 | 配置复杂度 | purge效率 | 共享存储 |
|---|---|---|---|---|---|
| squid | 硬盘 | 较高 | 简单 | 低 | 可以并联,但是配置复杂 |
| varnish | 硬盘/内存 | 高 | 比较简单 | 低 | 不能 |
- Varnish & Squid
详细对比如下: - Varnish对比Squid的优点
- varnish稳定性很高,两者在完成相同负荷的工作时,squid服务器发生故障的几率要高于varnish,因为squid要经常重启;
- varnish访问速度更快,其采用了”Visual Page Cache”技术,所有缓存数据都直接从内存中读取,而squid是从硬盘读取,因而varnish在访问速度方面会更快;
- varnish可支持更多并发连接,因为varnish的TCP连接释放要比squid快,因而在高并发连接情况下可以支持更多TCP连接;
- varnish可以通过管理端口,使用正则表达式批量的清除部分缓存,而squid是做不到的;
- squid属于单进程使用单核CPU,但Varnish是通过fork形式打开多进程来做处理,所以是合理的使用所有核来处理相应的请求;
- Varnish对比Squid的缺点
- varnish进程一旦Hang、Crash或者重启,缓存数据都会从内存中完全释放,此时所有请求都会发送到后端服务器,在高并发情况下,会给后端服务器造成很大的压力;
- 在varnish使用中,如果单个url的请求通过HA/F5,每次请求不同的varnish服务器时,被请求的varnish服务器都会被穿透到后端,而同样的请求会在多台服务器上缓存 ,也会造成varnish的缓存资源浪费,也会造成性能下降;
2. Varnish配置进阶
了解完Varnish的功能作用,优劣势及在企业技术架构中扮演的角色后,我们接着了解Varnish工具套件。熟练掌握这些工具的功能作用及使用对于Varnish的应用很有帮助。
2.1 Varnish核心工具集介绍
- varnishd
varnishd是varnish的核心进程,以Daemon方式运行,接受HTTP请求,转发前端请求至后端backend,缓存返回的缓存对象并且回应请求的客户端。 - varnishtest
- 验证Varnish的安装
- 功能强大,可自定义client请求模型或从后端真实用品拉取内容。
- 支持与Varnish交互性
- varnishadm
Varnish实例命令行管理工具:start/stopVarnishd- 更新配置文件参数
- 重载Varnish Configuration Language(VCL)
- 查看最新的参数文档
- varnishlog
Varnish日志展示工具,因信息量较大往往需要事先过滤。varnishlog支持精确日志匹配。 - varnishstat
varnishstat可访问全局计算器,可提供全面的统计信息,如全部请求数,缓存对象的数量等。常和varnishlog结合分析Varnish的安装。 - 其它工具
varnishncsa、varnishtop、varnishhist对Varnish的性能及状态分析均有帮助。
2.2 Varnish 安装部署及QA技巧
2.2.1 安装
- 系统环境介绍
| Roles | ip | Detail |
|---|---|---|
| varnish(4.0.3) | 192.168.99.111 | 80,6082 |
| WebServer(nginx) | 192.168.99.113 | 80(Varnish.html) |
- CentOS6.8 安装 Varnish 4.0
yum install epel-release
rpm --nosignature -i https://repo.varnish-cache.org/redhat/varnish-4.0.el6.rpm
yum install varnish gcc varnish-libs-devel-4.0.3 -y
- CentOS7 安装 Varnish 4.0
yum install epel-release
rpm --nosignature -i https://repo.varnish-cache.org/redhat/varnish-4.0.el7.rpm
yum install varnish gcc varnish-libs-devel-4.0.3 -y
gcc提供Varnish编译VCL语言所需的依赖插件
varnish提供主程序包
varnish-libs提供程序相关依赖包
varnish-libs-devel-4.0.3提供二次开发所依赖的库文件
- 安装验证
- 目录架构详解(主要)
[root@stanley-6 ~]# rpm -ql varnish
/etc/logrotate.d/varnish #日志切割配置
/etc/rc.d/init.d/{varnish,varnishlog,varnishncsa} #启动脚本
/etc/sysconfig/varnish #Varnish配置文件
/etc/varnish/default.vcl #VCL配置模板
/usr/bin/{varnishadm,varnishhist,varnishlog,varnishncsa,varnishstat,varnishtest,varnishtop #管理工具
/usr/sbin/{varnish_reload_vcl,varnishd} #管理工具
/usr/share/doc/ #文档目录
/usr/share/man/ #man文档
/var/lib/varnish #lib库文件
/var/log/varnish #日志文件
- 修改varnish默认监听端口
vim /etc/sysconfig/varnish
VARNISH_LISTEN_PORT=80 #因做web cache,该项通常默认会修改为80
- 修改VCL backend区块(事先准备好web服务)
vim /etc/varnish/default.vcl
backend default {
.host = "192.168.99.113"; #Backend的web服务,需自己事先配置好http服务,这里不再赘述
.port = "80";
}
- 启动
~]# service varnish restart
- 查看效果
在192.168.99.111执行如下curl命令
curl http://192.168.99.111/varnish.html
效果如图
- 查看所有可用VCL配置(Varnish允许同时存在多个VCL配置)
varnishadm vcl.list
- VCL配置更新
方式1:
service varnish reload
方式2:
varnishadm vcl.load vcl01 /etc/varnish/default.vcl
varnishadm vcl.use vcl01
方式3:
varnish_reload_vcl
2.2.2 QA技巧
- 如init脚本启动失败,手工启动尝试(
官网该原生命令格式有错)
/usr/sbin/varnishd -P /var/run/varnish.pid -f /etc/varnish/default.vcl -a :80 -T 127.0.0.1:6082 -t 120 -S /etc/varnish/secret -s malloc,256MB -F
官网提供的该方式实不能有效检测总是所致,建议方式如下:
修改启动脚本,将Varnish启动日志打印至标准输出,找到/etc/init.d/varnish启动脚本,找到77行,做类似如图修改:
#daemon --pidfile $pidfile $exec -P $pidfile "$DAEMON_OPTS" > /dev/null 2>&1
daemon --pidfile $pidfile $exec -P $pidfile "$DAEMON_OPTS"
常见错误是误开启SeLinux导致权限不足,报错如下:
Starting Varnish Cache: Failed to change owner on ./vcl.XGkTSgBO.c: Operation not permitted
Running VCC-compiler failed, exited with 2
VCL compilation failed
遇到该情况关闭SeLinux,删除已生成的varnish pid文件,重新启动varnish即可
setenforce 0
2.3 Varnish配置文件参数详解
Varnish的配置文件很简单,因为Varnish借助内核调度请求,因此配置文件中诸如MEMLOCK、NPROCS等配置均和ulimit设置相关,具体函数请参考如下:
- /etc/sysconfig/varnish配置文件参数详解
| 参数 | 功能说明 |
|---|---|
| NFILES=131072 | 打开的最大文件数 (uliit -n) |
| MEMLOCK=82000 | 锁定共享内存大小 (ulimit -l) |
| NPROCS=”unlimited” | 最大线程数,无限制 (ulimit -u) |
| RELOAD_VCL=1 | 自动重新装载缓存策略,1表示脚本启动自动重新装载缓存策略配置文件 |
| VARNISH_VCL_CONF=/etc/varnish/default.vcl | 默认的缓存策略配置文件 |
| VARNISH_LISTEN_PORT=6081 | 默认监听端口,一般改为80端口 |
| VARNISH_ADMIN_LISTEN_ADDRESS=127.0.0.1 | 管理员management进程管理地址 |
| VARNISH_ADMIN_LISTEN_PORT=6082 | 管理员management进程管理端口 |
| VARNISH_SECRET_FILE=/etc/varnish/secret | 启动装载的密钥文件位置,域共享密钥 |
| VARNISH_MIN_THREADS=50 | 最少线程,启动时最骚启动的空闲进程 |
| VARNISH_MAX_THREADS=1000 | 最大启动进程,最多不能超过1000个并发 |
| VARNISH_THREAD_TIMEOUT=120 | 线程超时时长 |
| VARNISH_STORAGE_FILE=/var/lib/varnish/varnish_storage.bin | 缓存文件存放文件(二进制文件) |
| VARNISH_STORAGE_SIZE=1G | 缓存大小,也可使用%比方式 |
| VARNISH_STORAGE=”file,…” | 缓存类型和大小 |
| VARNISH_TTL=120 | 当后端主机不是指定的时候使用超时时长 |
| “DAEMON_OPTS=”“-a …\… | Init脚本调用的参数信息 |
本文转载自公众号运维部落
http://mp.weixin.qq.com/s/S77ehOnvZ0VyaFXHZ5q6Ag
https://fomore.net/os/?p=2022
https://fomore.net/os/?p=2020
1 comment
Varnish常用变量使用小结 – OS运维 自动化 3 月 28, 2017 at 12:32 下午
[…] Varnish从菜鸟到专家 一 […]
评论已关闭。