varnish配置示例,概念安装篇

varnish: www.varnish-cache.org varnish是一款开源应用程序,高性能且开源的反向代理服务器,同时也是http加速器,采用较新的开发技术和体系结构,较为现代的硬件体系紧密结合,于传统squid相比,varnish性能更高,速度更快,管理更方便等一系列优点。目前大多大型网站已经用varnish来替换squid。 2015-06-05_135912varnsh 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工作时有多种状态。 vcl 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 查询缓存未命中工作流2015-06-06_171035查询缓存未命中工作流 查询缓存命中工作流 2015-06-06_171247查询缓存命中工作流   安装包下载: 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 在打开浏览器查看 2015-06-06_151007HIT2