varnish如何存储缓存对象:
file: 单个文件;不支持持久机制;
malloc: 缓存在内存中;
persistent:基于文件的持久存储;(此方式不建议使用)
vcl:配置缓存系统的缓存机制;【线程中缓存功能的工作机制】
一、在vs2和vs3上安装http
写入文件,内容一个为on vs2,另一个为on vs3
[root@vs2 ~]# yum install http[root@vs2 ~]# for i in {1..10}; do echo "web$i on vs2" > /var/www/html/test$i.html; done
[root@vs2 ~]# ls /var/www/html/
test10.html test2.html test4.html test6.html test8.html
test1.html test3.html test5.html test7.html test9.html
[root@vs2 ~]# systemctl start httpd.service
二、安装varnish(在centos7上安装4.0.3版本)
[root@vs1 ~]# yum install varnish
三、varnish主程序的配置文件
[root@vs1 ~]# vim /etc/varnish/varnish.params # Varnish environment configuration description. This was derived from# the old style sysconfig/defaults settings# Set this to 1 to make systemd reload try to switch vcl without restart.RELOAD_VCL=1# Main configuration file. You probably want to change it.VARNISH_VCL_CONF=/etc/varnish/default.vcl #读取vcl配置文件的位置# Default address and port to bind to. Blank address means all IPv4# and IPv6 interfaces, otherwise specify a host name, an IPv4 dotted# quad, or an IPv6 address in brackets.# VARNISH_LISTEN_ADDRESS=192.168.1.5VARNISH_LISTEN_PORT=6081 #监听的服务端口为6081# Admin interface listen address and portVARNISH_ADMIN_LISTEN_ADDRESS=127.0.0.1 #监听的管理地址为本机VARNISH_ADMIN_LISTEN_PORT=6082 #监听的管理端口为6082# Shared secret file for admin interfaceVARNISH_SECRET_FILE=/etc/varnish/secret #密钥文件位置# Backend storage specification, see Storage Types in the varnishd(5)# man page for details.VARNISH_STORAGE="file,/var/lib/varnish/varnish_storage.bin,1G" #缓存以文件的方式的存储位置和大小#VARNISH_STORAGE="malooc,256M" #以内存方式缓存,缓存大小为256M# Default TTL used when the backend does not specify oneVARNISH_TTL=120 #联系后端服务器超时时长# User and group for the varnishd worker processesVARNISH_USER=varnish #主进程所使用的用户VARNISH_GROUP=varnish #主进程所使用的组# Other options, see the man page varnishd(1) #进程选项,线程池的最大值最小值和超时时长DAEMON_OPTS="-p thread_pool_min=5 -p thread_pool_max=500 -p thread_pool_timeout=300"
四、varnish的命令行管理工具
[root@vs1 ~]# varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082help help [<command>] #获取帮助信息ping [<timestamp>] #测试服务器是否正常auth <response> #quit #退出bannerstatus #显示服务器状态信息start #启动子进程stop #停止子进程vcl.load <configname> <filename> #载入哪个文件为配置文件vcl.inline <configname> <quoted_VCLstring>vcl.use <configname> #使用哪个vcl文件vcl.discard <configname> #删除哪个vcl文件vcl.list #列出所有可用的vcl文件param.show [-l] [<param>] #显示运行时参数param.set <param> <value> panic.show #显示恐慌信息,显示进程或子进程上次挂掉的原因panic.clear #清除恐慌信息storage.list #显示缓存信息vcl.show [-v] <configname> #显示vcl文件的详细信息,vcl编译前的样子backend.list [<backend_expression>] #显示后端服务器列表backend.set_health <backend_expression> <state> #手动上线下线后端服务器ban <field> <operator> <arg> [&& <field> <oper> <arg>]... #清理缓存中的缓存对象ban.list #显示定义的清理缓存规则
varnish的访问日志
[root@vs1 ~]# varnishlog[root@vs1 ~]# varnishtop
varnish的统计信息
[root@vs1 ~]# varnishstat
五、vcl配置文件的说明
http://book.varnish-software.com/4.0/chapters/VCL_Basics.html
http://book.varnish-software.com/4.0/_images/simplified_fsm.svg
vcl_recv 接收请求cacheable 判断是否为可缓存对象incache 判断hash后的结果是否存在vcl_hash 可缓存对象hash计算vcl_hit 缓存中命中vcl_miss 缓存中未命中vcl_fetch 获取后端内容vcl_deliver 构建缓存发送vcl_pipe 客户端请求的方法不是常见方法时,直接交给后端服务器处理vcl_pass 不检查缓存直接从后端服务器取vcl_error varnish直接返回错误响应
六、vcl配置文件
[root@vs1 ~]# cp /etc/varnish/default.vcl /etc/varnish/test.vcl[root@vs1 ~]# vim /etc/varnish/test.vcl # This is an example VCL file for Varnish.## It does not do anything by default, delegating control to the# builtin VCL. The builtin VCL is called when there is no explicit# return statement.## See the VCL chapters in the Users Guide at https://www.varnish-cache.org/docs/# and http://varnish-cache.org/trac/wiki/VCLExamples for more examples.# Marker to tell the VCL compiler that this VCL has been adapted to the# new 4.0 format.vcl 4.0;# Default backend definition. Set this to point to your content server.backend vs2 { #定义后端主机vs2 .host = "172.16.24.102"; .port = "80"; .probe = { #对后端主机的test1进行进行健康状态检测 .url = "/test1.html"; }}backend vs3 { .host = "172.16.24.104"; .port = "80"; .probe = { .url = "/test1.html"; }}#import directors; #加载directors模块,在负载均衡轮询时要用到#sub vcl_init { #轮询方式的负载均衡# new mycluster = directors.round_robin();# mycluster.add_backend(vs2);# mycluster.add_backend(vs3);#}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. #url中开头带有login或者admin的直接从后端主机取结果不缓存 if (req.url ~ "(?i)^/login" || req.url ~ "(?i)^/admin") { return(pass); } #url以jpg,png,gif结尾的直接发给vs2,其他的都发给vs3 if (req.url ~ "(?i)\.(jpg|png|gif)$") { set req.backend_hint = vs2; } else { set req.backend_hint = vs3; }# set req.backend_hint = mycluster.backend(); #负载均衡集群#如果客户端请求为PRI返回405,如果请求的为非GET,HEAD,PUT,POST,TRACE,OPTIONS,DELETE都直接发给后端主机处理 if (req.method == "PRI") { /* We do not support SPDY or HTTP/2.0 */ return (synth(405)); } if (req.method != "GET" && req.method != "HEAD" && req.method != "PUT" && req.method != "POST" && req.method != "TRACE" && req.method != "OPTIONS" && req.method != "DELETE") { /* Non-RFC2616 or CONNECT which is weird. */ return (pipe); } if (req.method != "GET" && req.method != "HEAD") { /* We only deal with GET and HEAD by default */ return (pass); } if (req.http.Authorization || req.http.Cookie) { /* Not cacheable by default */ return (pass); } return (hash);}sub vcl_backend_response { # Happens after we have read the response headers from the backend. # # Here you clean the response headers, removing silly Set-Cookie headers # and other mistakes your backend does.}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. #如果缓存能命中就在返回值中插入HIT,未命中则插入MISS if (obj.hits>0) { set resp.http.X-Cache = "HIT"; } else { set resp.http.X-Cache = "MISS"; }}[root@vs1 ~]# varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082vcl.load test2 test.vcl200 VCL compiled.vcl.use test2200 VCL 'test2' now active
七、测试
在vs2上上传一张dog.jpg,在vs3上不上传任何图片
本文出自 “信风” 博客,请务必保留此出处http://xsllqs.blog.51cto.com/2308669/1791225