varnish:
www.varnish-cache.org
varnish是一款开源应用程序,高性能且开源的反向代理服务器,同时也是http加速器,采用较新的开发技术和体系结构,较为现代的硬件体系紧密结合,于传统squid相比,varnish性能更高,速度更快,管理更方便等一系列优点。目前大多大型网站已经用varnish来替换squid。 varnsh只要有两个进程,management和child/cache。
1,management主要实现应用新的配置,编译vcl,监控varnsh众多子进程,初始化varnsh,并且提供命令行commadn line进程。commadn line由多线程组成。
2,varnsh每隔几秒钟就会探测cache进程,来判断是否正常。如果cache较长时间内没有回应management探测,management将会重启相应的cache进程。一旦cache无法响应management,management将会将cache唤醒,这种唤醒一般重启cache。
cache/chuld,有多类线程
Acceptor:接收新的链接请求
worker:主要负责为每个会话启动worker线程,用于处理并响应用户请求。
Expiry:从缓存中清理过期的cache
varnsh依赖于工作区,
varnsh的配置文件是由vcl编写,由c编译器编译成varnsh能够加载的格式,由management分析并加载新的配置,配置生效由management指挥各cache/child实现。
varnsh接口:
cli interface :密码认证
telnet interface:已经被废
web interface:基于gui界面管理,but,这是收费的。
日志文件log file:
对varnsh而言,为了实现较高性能,对日志是保存在一个共享内存空间之中的。一旦这个内存空间用完,将会从头开始存储。最多保持最近最新的日志,如果希望长久保存只能将日志导出保存到其他空间。默认情况是保存在内存空间的,不但包含了谁放我的varnsh,还包括访问时命中与否,命中率多高,分析客户端请求首部,记录varnsh响应响应首部等等,通过记录日志可以了解很多varnsh的信息。
日志:Shared Memory Log
Shared可以通过文件系统进程访问的共享内存日志,因此某进程如果需要记录信息,只需持有一个锁向内存发数据即可。这种类型使得每个进程在记录日志时都使用了自己的日志缓存。
共享内存内存日志大小一般为90mb,分别两部分组成,前部分为计数器,后部分为客户端请求数据。
Varnish Configuration Language
1,vlc配置是由vcl来实现。这个配置是配置varnsh的缓存策略,并不是varnsh进程的。如果是启动varnsh自己监听端口,Ip,以及最多启动多少个工作线程等,则是在启动varnsh进程同时使用命令行参数指定的;它没有专属的配置文件。
2,基于“域'的编程语言,代码写在{}中生效,这个"域"在一定程度上讲指的是vcl的状态引擎。
varnsh工作机制:在vcl中用于让管理员定义缓存策略,而定义好的策略由management进行分析,转换成c语言代码,c编译器编译成二进制程序并连接至chache程序。
varnsh工作时有多种状态。 state engine:
vcl_recv:vcl内部有几个状态,可以理解为处理流程步骤,在这些状态所加vcl定义的策略完成缓存的处理机制,因此所有的缓存配置都是在引擎上实现的。vcl配置的缓存策略在此些state engine发挥作用;vcl也称为域专用,它写的配置必须要指明用在那些或那个状态引擎上。
当recv在处理一个http引擎的时候,需要获取这个请求中的各种信息,比如url,请求方法等。请求结束后作出第一个决策,是否查缓存,这个决策的实施在决策完成以后。而这个位置就是vcl_recv。
如果没有定义vcl_recv,系统有默认vcl_recv。系统会执行默认的vcl_recv
state engine之间有相关性,上级engine通过return指明下级engine;
vcl的配置语法:
1) //, #, /*comment*/用于注释;
(2) sub $NAME 用于定义函数;
(3) 不支持循环;
(4) 有众多内置变量;
(5) 支持终止语句,没有返回值;
(6) “域”专用语言;
(7) 操作符: =, ==, ~, !, &&, ||
state engine之间有相关性,上级engine通过return指明下级engine;
vcl_recv 终止语句
vcl_pipe 管道
vcl_pass 不要查缓存
vcl_hash 查缓存
vcl_hit 命中
vcl_miss 未命中
vcl_fetch 命中后投递
vcl_delier 命中后投递
vcl_error
查询缓存未命中工作流 查询缓存命中工作流
安装包下载:
www.varnish-cache.org/redhat/varnish-3.0/el6/x86_64/varnsh/
varnish,varnish-docs,varnish-libs
varnish-devel开发包,可以不用下载
1,安装
三个包依赖于gcc
#yum -y install gcc
#rpm -ivh varnish-libs-3.0.6-1.el6.x86_64.rpm varnish-3.0.6-1.el6.x86_64.rpm varnish-docs-3.0.6-1.el6.x86_64.rpm
PS:
#rpm -ql varnish
用于实现从varnish共享内存中去读取日志,并持久保存在文件中的一种脚本
/etc/rc.d/init.d/varnishlog
/etc/rc.d/init.d/varnishncsa
配置缓存策略文件
/etc/varnish/default.vcl
命令行工具
/usr/bin/varnish_reload_vcl是为/etc/rc.d/init.d/varnish脚本配置以实现启动varnishd的时候传递命令行参数,来决定varnish工作特性
/usr/bin/varnishadm
/usr/bin/varnishhist
/usr/bin/varnishlog
/usr/bin/varnishncsa
/usr/bin/varnishreplay
/usr/bin/varnishsizes
/usr/bin/varnishstat
/usr/bin/varnishtest
/usr/bin/varnishtop
/usr/sbin/varnishd 主程序
状态数据
/var/lib/varnish
/var/log/varnish
#export LANG=en
#man varnishd
-a 监听端口,默认监听6081
-b 指明后端主机
-c 显示vcl编辑代码转换c语言
-d 打开bug模式
-f 指明配置文件
-h 指明hash算法
-l 指明共享内存日志大小
-P pid文件
-p 众多参数
-s 指定存储客户端
|||||||| -s ||||||||
Hash Algorithms
varnish支持后端缓存存储机制:
-s type
malloc[,size]
file[,path[,size[,granularity]]],文件类型,大小,力度
persistent,path,size,
persistent:即便使用file,一旦缓存重启,所有缓存对象统统清空,而persistent不会被清楚。不过persistent在生成环境表现不太友好。
如果一旦缓存服务器重启,缓存将被清空,需要重新建立缓存;对于缓存而言,预热(将热点数据缓存)缓存,可能需要几分钟。缓存服务器一旦预热完毕,不宜随意上下线更换缓存服务器;一旦缓存崩溃,可能会造成雪崩。
-T 提供一个管理接口。默认6082 脚本文件详解 #vim /etc/sysconfig/varnish NFILES=131072 打开文件最大数 MEMLOCK=82000 锁定内存空间 NPROCS="unlimited" 最多单个用户运行的进程树 # Maximum size of corefile (for ulimit -c). Default in Fedora is 0
# DAEMON_COREFILE_LIMIT="unlimited"
# Set this to 1 to make init script reload try to switch vcl without restart.
# To make this work, you need to set the following variables
# explicit: VARNISH_VCL_CONF, VARNISH_ADMIN_LISTEN_ADDRESS,
# VARNISH_ADMIN_LISTEN_PORT, VARNISH_SECRET_FILE, or in short,
# use Alternative 3, Advanced configuration, below RELOAD_VCL=1 会不会自己自动装载缓存策略配置文件 # This file contains 4 alternatives, please use only one.
## Alternative 1, Minimal configuration, no VCL
#
# Listen on port 6081, administration on localhost:6082, and forward to
# content server on localhost:8080. Use a fixed-size cache file.
#
#DAEMON_OPTS="-a :6081
# -T localhost:6082
# -b localhost:8080
# -u varnish -g varnish
# -s file,/var/lib/varnish/varnish_storage.bin,1G"
## Alternative 2, Configuration with VCL
#
# Listen on port 6081, administration on localhost:6082, and forward to
# one content server selected by the vcl file, based on the request. Use a
# fixed-size cache file.
#
#DAEMON_OPTS="-a :6081
# -T localhost:6082
# -f /etc/varnish/default.vcl
# -S /etc/varnish/secret
# -s file,/var/lib/varnish/varnish_storage.bin,1G" VARNISH_VCL_CONF=/etc/varnish/default.vcl 默认读取缓存策略配置文件 VARNISH_LISTEN_PORT=80 默认监听端口
# VARNISH_ADMIN_LISTEN_ADDRESS=127.0.0.1 指的是cli interface接口 VARNISH_ADMIN_LISTEN_PORT=6082 # VARNISH_SECRET_FILE=/etc/varnish/secret 装载密钥文件 # VARNISH_MIN_THREADS=50 VARNISH启动最少空闲线程 VARNISH_MAX_THREADS=1000 VARNISH最多启动多少线程 # VARNISH_THREAD_TIMEOUT=120 线程超时时间 # VARNISH_STORAGE_FILE=/var/lib/varnish/varnish_storage.bin 缓存数据路径 # VARNISH_STORAGE_SIZE=1G 缓存大小 #
【】VARNISH_STORAGE_SHM=64M 缓存一般不应该太大,缓存大小取决于硬盘的I/O能力 VARNISH_STORAGE="file,${VARNISH_STORAGE_FILE},${VARNISH_STORAGE_SIZE}" 存储类型 #
【】VARNISH_STORAGE="malloc,${VARNISH_STORAGE_SHM}" 使用内存缓存 VARNISH_TTL=120 #
# # DAEMON_OPTS is used by the init script. If you add or remove options, make
# # sure you update this section, too.
DAEMON_OPTS="-a ${VARNISH_LISTEN_ADDRESS}:${VARNISH_LISTEN_PORT} 定义
-f ${VARNISH_VCL_CONF}
-T ${VARNISH_ADMIN_LISTEN_ADDRESS}:${VARNISH_ADMIN_LISTEN_PORT}
-t ${VARNISH_TTL}
-w ${VARNISH_MIN_THREADS},${VARNISH_MAX_THREADS},${VARNISH_THREAD_TIMEOUT}
-u varnish -g varnish
-S ${VARNISH_SECRET_FILE}
-s ${VARNISH_STORAGE}"
#
## Alternative 4, Do It Yourself. See varnishd(1) for more information.
#
# DAEMON_OPTS="" 2,启动 2.1编辑脚本文件
#vim /etc/sysconfig/varnish VARNISH_STORAGE_SHM=64M 缓存一般不应该太大,缓存大小取决于硬盘的I/O能力 VARNISH_STORAGE="malloc,${VARNISH_STORAGE_SHM}" 使用内存缓存 VARNISH_LISTEN_PORT=80 修改默认监听端口为80 #service varnish start
# ss -tnlp |grep :6082
LISTEN 0 10 127.0.0.1:6082 *:* users:(("varnishd",1830,6))
# ss -tnlp |grep :80
LISTEN 0 128 :::80 :::* users:(("varnishd",1832,8))
LISTEN 0 128 *:80 *:* users:(("varnishd",1832,7))
#
3,配置node2后端主机node2
#yum -y install http
#vim /var/www/html/index.html
node2
4,编辑node0
# vim /etc/varnish/default.vcl
backend default {
.host = "172.16.249.69"; 修改为后端主机ip
.port = "80";
在通过浏览器访问完全可以访问到node2的。
二:通过varnishadm管理 1,链接varnishadm
# varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082 200
-----------------------------
Varnish Cache CLI 1.0
-----------------------------
Linux,2.6.32-504.el6.x86_64,x86_64,-smalloc,-smalloc,-hcritbit
varnish-3.0.6 revision 1899836
Type 'help' for command list.
Type 'quit' to close CLI session.
varnish>help 200
help [command]
ping [timestamp]
auth response 做认证的
quit 退出
banner banner信息显示
status 状态信息显示
start 启动子进程
stop 停止子进程
vcl.load 装载
vcl.inline 使用
vcl.use 使用
vcl.discard 删除
vcl.list 显示
vcl.show 显示vcl内部信息 vcl.show boot
param.show [-l] []
param.set
panic.show
panic.clear
storage.list
backend.list
backend.set_health matcher state
ban.url
ban [&& ]...
演示: 打开node3主机,配置node0从node2切换至node3 node3已经配置好http
配置后端node0
1,node1打开
# vim /etc/varnish/default.vcl backend default { .host = "172.16.249.99"; .port = "80"; } 这里改了之后是不会立即生效的 2,
# varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082 varnish> vcl.list 200
active 2 boot
varnish>vcl.load test1 default.vcl 装载一个命令为test1,文件为default.vcl 200
VCL compiled.
varnish>vcl.list test1已经装载编译完毕 200
active 2 boot
available 0 test1
varnish> vcl.use test1 配置使用test1 200
varnish> vcl.list 在查看,已经激活 200
available 2 boot active 0 test1 varnish> vcl.show test1 show test1,host的ip地址已经启用 200
# This is a basic VCL configuration file for varnish. See the vcl(7)
# man page for details on VCL syntax and semantics.
#
# Default backend definition. Set this to point to your content
# server.
#
backend default {
.host = "172.16.249.99";这里已经启用
.port = "80";
}
指明缓存命中机制,添加响应首部。
1,还是在node0上配置配置文件
# vim /etc/varnish/default.vcl
找到sub vcl_deliver修改
sub vcl_deliver { if (obj.hits>0){ set resp.http.X-Cache = "HIT"; } else { set resp.http.X-Cache = "MISS"; } return (deliver); } 2,
varnish> vcl.load test2 default.vcl varnish> vcl.use test2 varnish> vcl.list 在打开浏览器查看