web_cache_server --> Varnish

web cache server : Varnish (web reserve proxy)

一 关于Varnish

1 Varnish的系统架构.

Varnish主要运行两个进程,Management进程和Child进程:

Management进程主要实现初始化varnish,监控varnish,编译VCL和提供了一个命令行接口,Management进程会每隔几秒钟就会探测一下Child进程以判断其是否运行正常,如果在指定的时间内没有得到Child进程的回应,Management进程会重启Child进程.

Child进程包含多种类型的线程: 
Acceptor线程,接受新的连接请求并回应.
Worker线程,Child进程会为每一个请求分配一个worker线程处理.
Expire线程,从缓存中清理过期内容.

2 VCL Varnish  Configure  Language 

VCL(varnish configure language)是一门编程语言,它支持有限的算术运算和逻辑运算,允许使用正则表达式进行字符串匹配,允许用户使用set设置变量的值,支持if判断语句,也有内置的变量.

VCL可以同时保存几份尚在引用的旧版本配置,也能够让新的配置立即生效,编译后的旧版本配置通常在varnish重启是才会别丢弃,如果需要手动清理也可以使用 varnishadm 的 vcl.discard命令完成.

3 Varnish 的后端存储.

Varnish支持多种类型的后端存储,这可以在varnish启动的时候设定,后端处处的类型如下:

(1) file 使用特定的文件存储全部的缓存数据,并通过操作系统的mmap()系统调用将整个文件映射到内存区域中. 在重启varnish的时候 数据会丢失
(2) maiiloc 使用malloc()系统调用在varnish启动的时候向操作系统申请置顶大小的内存空间以存储缓存对象. 在重启varnish的时候 数据会丢失
(3) persistent 类似file 但是在varnish重启的时候数据b不会丢失,但是这个机制还不太稳定.

为Varnish的指定使用的缓存的类型:

malloc[,size]
file[,path[,size[,granularity]]]


二 VCL Varnish Configure Language 

1 VCL状态引擎

varnish开始处理一个请求的时候,首先需要分析HTTP请求本身,比如从首部获取请求方法,验证其是否是一个合法的HTTP请求,当这些基本分析结束之后需要作出一个决定,就是是否需要从缓存中查找请求资源这个决定就是使用vcl_recv方法决定的,如果管理员没有自定义vcl_recv函数,varnish仍将执行默认的vcl_recv函数,事实上varnish官方强烈建议执行默认的vcl>recv函数以便处理自定义vcl_recv函数中可能出现的故障.

2 VCL 语法 Varnish Configure Language

VCL的设计参考了C和Perl语言,其基本的语法如下:
(1) // # /* */ 注释
(2) sub 定义子例程(函数)
(3) 不支持循环 有内置函数
(4) 没有返回值 但是可以使用终止语句return 
(5) 操作符 =(赋值) ==(等值比较) ~(模式匹配) ! && ||

3 vcl_recv

vcl_recv 是在varnish完成对请求报文的解码为基本数据结构后第一个要执行的子例程,它通常有以下四个主要功能:

(1) 修改客户端的数据以减少换缓存对象差异
(2) 基于客户端数据选用换缓存策略
(3) 为web应用程序执行URL重写
(4) 挑选合适的后端web服务器

可以使用下面电费终止语句
pass 绕过缓存,就是不从缓存中查询内容或不将内容存储在缓存中. 
pipe 不对客户端的进行验证操作,而是客户端与后端服务器之间建立专用的管道,并直接将数据在二者之间进行传递,此时
lookup 在缓存中查找用户的请求.
error 有varnish自己合成一个响应报文,一般是响应一个错误类信息,

安全起见,一般在自己定义的vcl_recv中不要使用return() 终止语句,而是再执行默认额vcl_recv进行处理,并由其作出相应的处理策略:

4 vcl_fetch 

vcl_recv是根据客户端的请求作出缓存决策的,vcl_fetch则是根据服务器的响应作出缓存决策的,在任何VCL状态引擎中返回的pass都将有vl_fetch进行后续处理,通过return 能够返回给varnish的操作指令:

(1) deliver 缓存该对象,并将其发往客户端.
(2) hit_for_pass 不缓存次对象 但是可以导致后续对此对象的请求直接送达到vcl_pass进行处理
(3) restart 重启vcl并增加重启计数器
(4) error code [reason] 返回指定的错误代码给客户端并丢弃请求

可以使用自定义对对象的缓存时长 beresp.ttl 

三 修剪缓存对象:

1 缓存内容的修剪

提高缓存命中率的最有效途径之一就是增加缓存对象的生存时间(TTL),但是这也可能带来副作用,比如缓存的对象在到达为其指定的有效期之前已经失效,因此,手动检验缓存对象的有效性或很有可能成为服务器管理员的日常工作.

2 移除单个缓存对象.

purge用于清理缓存中的某特定的对象及变种

案例:
acl purges {
"127.0.0.1";
"172.31.0.0"/16;
}

sub vcl_recv {
if(req.request == "PURGE"){
if(!client.ip ~ "purges"){
error 405 “Method not Allowwd";
}
return(lookup);
}
}


sub vcl_hit {
if(req.request == "PRUGE"){
purge;
error 200 "Purge";
}
}
sub vcl_miss {
if(req.request == "PURGE"){
purge;
error 404 "Not IN Cache";
}
}


sub vcl_pass {
if(req.request == "PURGE"){
error 502 "PURGE Not";
}
}



变量的使用:


-----------------------------------------------------------------------------------------------------------------------------
        | vcl_recv | vcl_hash | vcl_hit | vcl_miss | vcl_fetch | vcl_deliver | vcl_pass | vcl_pipe |
-----------------------------------------------------------------------------------------------------------------------------
req.* | OK           | OK            | OK       | OK           | OK           | OK               | OK           | OK           |
-----------------------------------------------------------------------------------------------------------------------------
resp.* |                 |             |              |                  |                 | OK               |                  |                  |
-----------------------------------------------------------------------------------------------------------------------------
breq.* |                 |                  |              | OK           | OK           |                     | OK            |                 |
-----------------------------------------------------------------------------------------------------------------------------
bresp.* |                 |                  |              |                  | OK           |                     |                  |                 | 
-----------------------------------------------------------------------------------------------------------------------------
obj.hits   |                |                   | OK       |               |                  | OK               |                  |                 |
-----------------------------------------------------------------------------------------------------------------------------
obj.* |                |                   | OK       |                 |                  |                   |              |               |
-----------------------------------------------------------------------------------------------------------------------------


-----------------------------------------
sub vcl_deliver {
if(obj.hits > 0){
set resp.http.X-Cache = "HIT";
}else{
set resp.http.X-Cache = "MISS";
}
}

-----------------------------------------
cookie :

sub vcl_recv {
if(!(req.url ~ "admin|login")){
unset req.http.cookie;
}
}

sub vcl_fetch {
if(!(req.url ~ "admin|login")){
unset beresp.http.set-cookie;
}
}

----------------------------------------------------------------------
案例:


backend web1 {
.host = "172.31.0.2";
.port = "80";
.probe = { //后端服务器的健康状况检测
.url = "/health.html";
.interval = 2s;
.window = 5;
.threshold = 2;
}
}


backend web2 {
.host = "172.31.0.3";
.port = "80";
.probe = {
.url = "/health.html";
.interval = 2s;
.window = 5;
.threshold = 2;
}
}




director webserver random { //后端服务器的负载均衡
{
.backend = web1;
.weight = 1;
}
{
.backend = web2;
.weight = 1;
}
}


acl purges {
"127.0.0.1";
"172.31.0.0"/16;
}


subb vcl_recv {
if(req.request == "PURGE"){
if(!client.ip ~ purges){
error 404 ”NOt ";
}
return(lookup);
}

if(req.url ~ "\.(js|html|css|png|jpeg|gif) && req.http.cookie){
unset req.http.cookie;
}


set req.backend = webserver;
if(req.url ~ "\.(js|css|html)$"){
set req.backend = web1
}
if(req.url ~ "\.(png|jpeg|gif)$"){
set req.backend = web2;
}

}


sub vcl_hit {
if(req.request == "PURGE"){
purge;
error 200 "OK";
}
}


sub vcl_miss {
if(req.request == "PURGE"){
purge;
error 500 "Not In Cache";
}
}


sub vcl_pass {
if(req.request == "PURGE"){
error 503 "NOt Allowed";
}
}


subb vcl_fetch {
if(req.url ~ "\.(js|css|html|png|jpeg|gif)$" && beresp.http.Set-Cookie){
unset beresp.http.Set-Cookie;
}
if(req.url ~ "\.(js|css|html)$"){
set beresp.ttl = 1200s;
set beresp.http.Expire = 1200;
}
if(req.url ~ "\.(png|jpeg|gif)$"){
set beresp.ttl = 7200s;
set beresp.http.Expire = 7200;
}
}


sub vcl_deliver {
if(obj.hits > 0){
set resp.http.X-Cache = "HIT";
}else{
set resp.http.X-Cacje = "MISS";
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值