共计 6755 个字符,预计需要花费 17 分钟才能阅读完成。
Varnish 缓存服务器是工作在代理模式的。意思是说,由 varnish 接收用户的请求,把用户请求资源的 URL 做“哈唏”编码后,做为“键”与缓存条目中的键做比对:
1、如果,缓存条目有一模一样的键的话,那么该键对应的值就是用户请求 URL 对应的资源,
varnish 把该键对应的值取出来,响应给客户端。
2、如果,缓存条目没有与之匹配的键的话,那么 varnish 就向后端服务器 (backup server) 发送请求。当后端服务器 (backup server) 构建完响应报文响应 varnish,varnish 服务器收到后端服务器 (backup server) 的响应后,会把:用户请求的 URL 做“哈唏”编码后,作为键(key),该 URL 对应的资源作为值(value),保存在 varnish 的缓存中。
这就是所谓的,插入缓存条目。varnish 的缓存条目是:key:value 方式存在的。
然后,varnish 再构建响应报文响应客户端。
这就是,varnish 缓存服务器的正常工作流程。
如下图所示:
缓存服务器 Varnish 概念篇 http://www.linuxidc.com/Linux/2014-05/101389.htm
缓存服务器 Varnish 概念篇 http://www.linuxidc.com/Linux/2014-05/101389.htm
Varnish Cache 的架构笔记 http://www.linuxidc.com/Linux/2013-10/91016.htm
CentOS 5.8 下 Varnish-2.1.5 的安装配置 http://www.linuxidc.com/Linux/2013-09/89916.htm
RedHat 脚本改用 CentOS 源更新安装 Nginx、PHP 5.3、Varnish http://www.linuxidc.com/Linux/2012-07/65801.htm
利用 Varnish 构建 Cache 服务器笔记 http://www.linuxidc.com/Linux/2012-07/65234.htm
缓存服务 Varnish 安装配置 http://www.linuxidc.com/Linux/2012-07/65228.htm
Varnish 编译安装所需准备 http://www.linuxidc.com/Linux/2012-07/65230.htm
Linux 下 Varnish 缓存的配置优化 http://www.linuxidc.com/Linux/2012-03/56435.htm
那么如何实现 varnish 缓存的管理呢?
1、varnish 接收用户请求后,是如何根据用户请求的报文来决定是否查找缓存的呢?
由上图所知。当 varnish 服务器接收到用户请求后,分析用户请求的 URL 是否符合缓存标准,再查找缓存。这样是为了避免花费在与缓存条目比对的时间。如果,缓存条目较多的话,做缓存比对也是需要很长时间的。varnish 通过如下方式,控制那些 URL 可以查找缓存的:
varnish 在 vcl_recv 状态引擎定义策略,怎么样处理用户的请求的。如:varnish 处理的客户端请求的标准、如果判断是否查找缓存的。
sub vcl_recv {
# varnish 在 vcl_recv 状态引擎定义的策略来控制,varnish 服务器只处理指定 http 协议请求资源的方法,的 URL
if (req.request != “GET” &&
req.request != “HEAD” &&
req.request != “PUT” &&
req.request != “POST” &&
req.request != “TRACE” &&\
req.request != “OPTIONS” &&
req.request != “DELETE”) {
/* Non-RFC2616 or CONNECT which is weird. */
return (pipe); —–> 用户请求的访问的服务虽然是:tcp/80 但是,varnish 不处理除了,GET、HEAD、PUT、POST、TRACE、OPTIONS、DELETE 请求资源的方法。直接让该请求把该请求交给 backup server.
}
# 再使用下述策略来过滤用户请求资源时所使用的方法;判断用户请求资源时使用的方法不是:GET、HEAD 就绕过查找缓存的操作
if (req.request != “GET” && req.request != “HEAD”) {
/* We only deal with GET and HEAD by default */
return (pass); —–> 绕过查找缓存操作,varnish 直接向 backup server 请求资源
}
# 使用 vcl_recv 状态引擎判断用户的请求,都不符合上述:if 条件。那么该用户请求资源所使用的方法一定是:GET 或 HEAD。但是如果用户访问的是资源,需要通过口令认证
# 才可以访问的。用户请求该资源使用的也是 ”GET” 方法。该用户请求的 URL 是不需要查找缓存的。
if (req.http.Authorization || req.http.Cookie) {
/* Not cacheable by default */
return (pass); —–> 绕过查找缓存操作,varnish 直接向 backup server 请求资源
}
return (lookup); ——> 查找缓存
}
说明:
varnish 有很多内置变量保存了,http 协议报文的信息。通过使用 if 判断这些信息,来控制 varnish 是如何使用缓存的。
如:
req.url ——> 记录用户请求的 URL
req.request ——-> 记录了用户请求资源使用的方法
req.http.HEADER ——-> 记录了用户请求报文的首部。该变量是可写的。如:req.http.hostreq.restarts ——-> 请求被重启的次数
server.ip ——-> varnish 的 IP 地址
server.port ——-> varnish 监听的端口
server.hostname ——-> 服务器的主机名
client.ip ——-> 客户端 IP
req.backend ——-> 如果,未从缓存中命中。该请求分调度到后端的那个服务器。
例:
当用户访问指定页面时,禁止查询缓存
sub vcl_recv {
…
if (req.url ~ “/images/a.jpg$”) {
return (pass);
}
return (lookup);
}
更多详情见请继续阅读下一页的精彩内容:http://www.linuxidc.com/Linux/2014-10/107616p2.htm
2、当缓存没有命中 (cache miss) 如何控制 varnish 向缓存中插入缓存条目时,该缓存条目的过期时长呢?
使用 varnish 缓存服务器提供的:vcl_fetch 状态引擎来控制是否向缓存中插入缓存条目的。
如:
sub vcl_recv {
….
if (req.request == “GET” && req.request ~ “\.png$”) {
set beresp.ttl = 10s;
}
….
}
3、如何修剪 (删除) 缓存条目呢?
使用 varnish 提供 purge 指令来清除不需要的缓存
如:
(1)、为了安全,对操作清除缓存条目的指令的用户做限制
只允许下述用户修剪缓存条目
acl purgers {
“127.0.0.1”;
“172.16.13.0”/24;
}
(2)、在 vcl_recv 状态引擎,放行 purge 请求方法查询缓存
sub vcl_recv {
。。。
if (req.request == “PURGE”) {———-> 开放用户请求资源使用 purgers 方法,
if (client.ip !~ purgers) {——> 检测发起 PURGE 方法的用户来源,只允许属于 purgers 的用户的请求查询缓存
error 405 “Method not allowed”;
}
return (lookup); ——–> 查询缓存
}
}
(3)、当缓存命中 (cache hit) 就执行 varnish 的 purge 清除 (修剪) 缓存条目的指令
sub vcl_hit {
if (req.request == “PURGE”) {
purge; ———-> 执行 varnish 修改缓存的指令
error 200 “Purged”; —-> 合成状态码,和“原因短语”
}
return (deliver);
}
(4)、使用【curl】指定使用 PURGE 方法访问指定的资源,实现缓存修剪
如:
curl -X PURGE http://172.16.13.1/index.html
说明:
4、定义缓存大小;
[root@haproxy2 ~]# vim /etc/sysconfig/varnish
VARNISH_STORAGE_SIZE=64M —-> 定义缓存大小
VARNISH_STORAGE=”malloc,${VARNISH_STORAGE_SIZE}” —> 明确指定 varnish 使用内存做为缓存。
Varnish 的详细介绍:请点这里
Varnish 的下载地址:请点这里
Varnish 缓存服务器是工作在代理模式的。意思是说,由 varnish 接收用户的请求,把用户请求资源的 URL 做“哈唏”编码后,做为“键”与缓存条目中的键做比对:
1、如果,缓存条目有一模一样的键的话,那么该键对应的值就是用户请求 URL 对应的资源,
varnish 把该键对应的值取出来,响应给客户端。
2、如果,缓存条目没有与之匹配的键的话,那么 varnish 就向后端服务器 (backup server) 发送请求。当后端服务器 (backup server) 构建完响应报文响应 varnish,varnish 服务器收到后端服务器 (backup server) 的响应后,会把:用户请求的 URL 做“哈唏”编码后,作为键(key),该 URL 对应的资源作为值(value),保存在 varnish 的缓存中。
这就是所谓的,插入缓存条目。varnish 的缓存条目是:key:value 方式存在的。
然后,varnish 再构建响应报文响应客户端。
这就是,varnish 缓存服务器的正常工作流程。
如下图所示:
缓存服务器 Varnish 概念篇 http://www.linuxidc.com/Linux/2014-05/101389.htm
缓存服务器 Varnish 概念篇 http://www.linuxidc.com/Linux/2014-05/101389.htm
Varnish Cache 的架构笔记 http://www.linuxidc.com/Linux/2013-10/91016.htm
CentOS 5.8 下 Varnish-2.1.5 的安装配置 http://www.linuxidc.com/Linux/2013-09/89916.htm
RedHat 脚本改用 CentOS 源更新安装 Nginx、PHP 5.3、Varnish http://www.linuxidc.com/Linux/2012-07/65801.htm
利用 Varnish 构建 Cache 服务器笔记 http://www.linuxidc.com/Linux/2012-07/65234.htm
缓存服务 Varnish 安装配置 http://www.linuxidc.com/Linux/2012-07/65228.htm
Varnish 编译安装所需准备 http://www.linuxidc.com/Linux/2012-07/65230.htm
Linux 下 Varnish 缓存的配置优化 http://www.linuxidc.com/Linux/2012-03/56435.htm
那么如何实现 varnish 缓存的管理呢?
1、varnish 接收用户请求后,是如何根据用户请求的报文来决定是否查找缓存的呢?
由上图所知。当 varnish 服务器接收到用户请求后,分析用户请求的 URL 是否符合缓存标准,再查找缓存。这样是为了避免花费在与缓存条目比对的时间。如果,缓存条目较多的话,做缓存比对也是需要很长时间的。varnish 通过如下方式,控制那些 URL 可以查找缓存的:
varnish 在 vcl_recv 状态引擎定义策略,怎么样处理用户的请求的。如:varnish 处理的客户端请求的标准、如果判断是否查找缓存的。
sub vcl_recv {
# varnish 在 vcl_recv 状态引擎定义的策略来控制,varnish 服务器只处理指定 http 协议请求资源的方法,的 URL
if (req.request != “GET” &&
req.request != “HEAD” &&
req.request != “PUT” &&
req.request != “POST” &&
req.request != “TRACE” &&\
req.request != “OPTIONS” &&
req.request != “DELETE”) {
/* Non-RFC2616 or CONNECT which is weird. */
return (pipe); —–> 用户请求的访问的服务虽然是:tcp/80 但是,varnish 不处理除了,GET、HEAD、PUT、POST、TRACE、OPTIONS、DELETE 请求资源的方法。直接让该请求把该请求交给 backup server.
}
# 再使用下述策略来过滤用户请求资源时所使用的方法;判断用户请求资源时使用的方法不是:GET、HEAD 就绕过查找缓存的操作
if (req.request != “GET” && req.request != “HEAD”) {
/* We only deal with GET and HEAD by default */
return (pass); —–> 绕过查找缓存操作,varnish 直接向 backup server 请求资源
}
# 使用 vcl_recv 状态引擎判断用户的请求,都不符合上述:if 条件。那么该用户请求资源所使用的方法一定是:GET 或 HEAD。但是如果用户访问的是资源,需要通过口令认证
# 才可以访问的。用户请求该资源使用的也是 ”GET” 方法。该用户请求的 URL 是不需要查找缓存的。
if (req.http.Authorization || req.http.Cookie) {
/* Not cacheable by default */
return (pass); —–> 绕过查找缓存操作,varnish 直接向 backup server 请求资源
}
return (lookup); ——> 查找缓存
}
说明:
varnish 有很多内置变量保存了,http 协议报文的信息。通过使用 if 判断这些信息,来控制 varnish 是如何使用缓存的。
如:
req.url ——> 记录用户请求的 URL
req.request ——-> 记录了用户请求资源使用的方法
req.http.HEADER ——-> 记录了用户请求报文的首部。该变量是可写的。如:req.http.hostreq.restarts ——-> 请求被重启的次数
server.ip ——-> varnish 的 IP 地址
server.port ——-> varnish 监听的端口
server.hostname ——-> 服务器的主机名
client.ip ——-> 客户端 IP
req.backend ——-> 如果,未从缓存中命中。该请求分调度到后端的那个服务器。
例:
当用户访问指定页面时,禁止查询缓存
sub vcl_recv {
…
if (req.url ~ “/images/a.jpg$”) {
return (pass);
}
return (lookup);
}
更多详情见请继续阅读下一页的精彩内容:http://www.linuxidc.com/Linux/2014-10/107616p2.htm