Varnish与一般服务器软件类似,分为master(management)进程和child(worker,主要做cache的工作)进程。master进程读入命令,进行一些初始化,然后fork并监控child进程。child进程分配若干线程进行工作,主要包括一些管理线程和很多woker线程。
VCL: ”域“专有类型的配置语言
VCL有多个状态引擎,状态之间存在相关性,但状态引擎彼此间互相隔离;
每个状态引擎可使用return( )指明关联至哪个下一级引擎;
每个状态引擎对应于vcl文件中的一个配置段。
varnish中的内置变量
req.*:request,表示由客户端发来的请求报文相关; bereq.*:由varnish发往BE主机的httpd请求相关; beresp.*:由BE主机响应给varnish的响应报文相关; resp.*:由varnish响应给client相关; obj.*:存储在缓存空间中的缓存对象的属性;只读;
常用变量: bereq.*, req.*: bereq.http.HEADERS bereq.request:请求方法; bereq.url:请求的url; bereq.proto:请求的协议版本; bereq.backend:指明要调用的后端主机; req.http.Cookie:客户端的请求报文中Cookie首部的值; req.http.User-Agent ~ “chrome” beresp.*, resp.*: beresp.http.HEADERS beresp.status:响应的状态码; reresp.proto:协议版本; beresp.backend.name:BE主机的主机名; beresp.ttl:BE主机响应的内容的余下的可缓存时长; obj.* obj.hits:此对象从缓存中命中的次数; obj.ttl:对象的ttl值 server.* server.ip server.hostname client.* client.ip
[[ Varnish的基本配置 ]]
1.交互式配置
varnishadm
登录:
# varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082
配置文件相关:
vcl.list :状态引擎列表; vcl.load <configname> <filename>:装载那个文件为配置文件; vcl.use <configname>:使用哪个vcl文件 vcl.discard:删除; vcl.show [-v] <configname>:查看指定的配置文件的详细信息,可看默认配置;
param.show -l:显示运行时参数列表; param.show <PARAM>:指定显示哪个参数 param.set <PARAM> <VALUE>:修改参数 storage.list:显示存储列表 backend.list:显示后端服务器列表
2.强制对某类资源的请求不检查缓存
示例:在请求报文中包含以/login|admin 为首的不查缓存,直接送到backend(后端服务器)
sub vcl_recv { if (req.url ~ "(?i)^/(login|admin)") { return(pass); }
} (?i)---不区分大小写
3.拒绝某种请求访问
sub vcl_recv { if (req.http.User-Agent ~ “(?i)^/curl”) { return(synth(403)); } }
4.对特定类型的资源取消私有的Cookie标识,并设定其可在varnish缓存的时长
if (beresp.http.cache-control !~ “s-maxage”) { if (bereq.url ~ "(?i)\.(jpg|jpeg|png|gif)$") { unset beresp.http.Set-Cookie; set beresp.ttl = 3600s; } }
5.设置后端服务器日志中记录的真实的客户端IP
if (req.restarts == 0) {
if (req.http.X-Fowarded-For) {
set req.http.X-Forwarded-For = req.http.X-Forwarded-For + “,” + client.ip;
} else {
set req.http.X-Forwarded-For = client.ip;
}
}
并在后端服务器中设置日志格式:
# vim /etc/httpd/conf/httpd.conf
LogFormat "%{X-Forwarded-For}i"
6.对后端主机进行健康状态检测
.probe:定义健康状态检测方法;
.url:检测时请求的URL,默认为”/”;
.request:发出的具体请求;
.window:基于最近的多少次检查来判断其健康状态;
.threshhold:最近.window中定义的这么次检查中至有.threshhold定义的次数是成功的;
.interval:检测频度;
.timeout:超时时长;
.expected_response:期望的响应码,默认为200;
示例:
backend websrv1 { .host = "192.168.1.16"; .port = "80"; .probe = { .url= "/.test.html"; 需要先创建这个测试页面 } }
7.varnish的性能优化
thread_pools:最好小于或等于CPU核心数量;
thread_pool_max:每线程池的最大线程数;
thread_pool_min:额外意义为“最大空闲线程数”;
thread_pool_timeout:线程超时时间
thread_pool_add_delay:创建新线程
thread_pool_destroy_delay:杀死空闲线程延迟时间
设置方式:
/etc/varnish/varnish.params (永久有效)
param.set
[[ VCL配置的实例 ]]
1.负载均衡
import directors; 导入模块 backend websrv1 { .host = "192.168.1.16"; .port = "80"; } backend aebsrv2 { .host = "192.168.1.47"; .port = "80";
} sub vcl_init { 定义集群 new webcluster = directors.round_robin(); 调度方法 webcluster.add_backend(websrv1); webcluster.add_backend(websrv2); } sub vcl_recv { set req.backend_hint = webcluster.backend(); }
2.varnish动静分离
backend websrv1 { .host = "192.168.1.16"; .port = "80"; } backend aebsrv2 { .host = "192.168.1.47"; .port = "80";
} sub vcl_recv { if (req.url ~ "(?i)\.(jpg|png|gif)$") { set req.backend_hint = websrv1; } else { set req.backend_hint = websrv2; } }
掌握 varnishstat、varnishtop
1、varnishstat – Varnish Cache statistics 各种计数器
-f FILED_NAME
-l: 可用于-f选项指定的字段名称列表;
-x: xml输出格式
示例:
varnishstat -f MAIN.cache_hit -f MAIN.cache_miss
2、varnishtop – Varnish log entry ranking 将日志文件中相关数据排序
-i taglist,可以同时使用多个-i选项,也可以一个选项跟上多个标签;
-I <[taglist:]regex>:仅显示被模式匹配到的条目
-x taglist:排除列表
-X <[taglist:]regex>:仅显示不被模式匹配到的条目
-C:忽略字符大小写
3、varnishlog – Display Varnish logs 查看实时日志
4、varnishncsa – Display Varnish logs in Apache / NCSA combined log format 标准日志格式
原创文章,作者:nene,如若转载,请注明出处:http://www.178linux.com/88357