Varnish实现Web缓存

varnish实现Web缓存

一、varnish简介

Varnish 的作者Poul-Henning Kamp是FreeBSD的内核开发者之一,他认为现在的计算机比起1975年已经复杂许多。在1975年时,储存媒介只有两种:内存与硬盘。但现在计算 机系统的内存除了主存外,还包括了CPU内的L1、L2,甚至有L3快取。硬盘上也有自己的快取装置,因此Squid Cache自行处理物件替换的架构不可能得知这些情况而做到最佳化,但操作系统可以得知这些情况,所以这部份的工作应该交给操作系统处理,这就是 Varnish cache设计架构。

varnish项目是2006年发布的第一个版本0.9.距今已经八年多了,此文档之前也提过varnish还不稳 定,那是2007年时候编写的,经过varnish开发团队和网友们的辛苦耕耘,现在的varnish已经很健壮。很多门户网站已经部署了 varnish,并且反应都很好,甚至反应比squid还稳定,且效率更高,资源占用更少。相信在反向代理,web加速方面,varnish已经有足够能力代替squid。

二、Varnish的工作原理

varnish主要运行两个进程:Management进程和Child进程(也叫Cache进程)。

Management进程主要实现应用新的配置、编译VCL、监控varnish、初始化varnish以及提供一个命令行接口等。Management进程会每隔几秒钟探测一下Child进程以判断其是否正常运行,如果在指定的时长内未得到Child进程的回应,Management将会重启此Child进程。

Child进程包含多种类型的线程,常见的如:

Acceptor线程:接收新的连接请求并响应;

Worker线程:child进程会为每个会话启动一个worker线程,因此,在高并发的场景中可能会出现数百个worker线程甚至更多;

Expiry线程:从缓存中清理过期内容;

Varnish依赖“工作区(workspace)”以降低线程在申请或修改内存时出现竞争的可能性。在varnish内部有多种不同的工作区,其中最关键的当属用于管理会话数据的session工作区。

Varnish处理过程

vcl_recv-->lookup-->vcl_hash-->vcl_hit-->vcl_deliver

vcl_recv-->lookup-->vcl_hash-->vcl_miss-->vcl_fetch-->cache-->vcl_deliver

vcl_recv-->pipe-->vcl_pipe

vcl_recv-->pass-->vcl_pass-->vcl_fetch-->nocache-->vcl_deliver

Receive 状态:也就是请求处理的入口状态,根据VCL规则判断该请求应该是Pass或Pipe,或者进入Lookup(本地查询)

Lookup 状态:进入此状态后,会在hash表中查找数据,若找到,则进入Hit状态,否则进入miss状态

Pass 状态:在此状态下,会进入后端请求,即进入fetch状态

Fetch 状态:在Fetch状态下,对请求进行后端的获取,发送请求,获得数据,并进行本地的存储

Deliver 状态:将获取到的数据发送给客户端,然后完成本次请求

三、Varnish特点

1、是基于内存缓存,重启后数据将消失

2、利用虚拟内存方式,I/O性能好

3、支持设置0~60秒内的精确缓存时间

4、VCL配置管理比较灵活

5、32位机器上缓存文件大小为最大2G

6、具有强大的管理功能,例如top,stat,admin,list等

7、状态机设计巧妙,结构清晰

8、利用二叉堆管理缓存文件,达到积极删除目的

四、安装配置varnish

1、环境

OS:CentOS 6.5

Varnish:3.0.7

Varnish IP:192.168.31.178

Web:192.168.31.105

2、安装varnish

[[email protected] ~]# wget https://repo.varnish-cache.org/redhat/varnish-3.0.el6.rpm

[[email protected] ~]# yum install varnish  -y

[[email protected] ~]# sed -i ‘[email protected]_LISTEN_PORT=.*@[email protected]‘ /etc/sysconfig/varnish

[[email protected] ~]# sed -i ‘[email protected]_STORAGE=.*@VARNISH_STORAGE="malloc,128M"@‘ /etc/sysconfig/varnish

3、varnish的配置文件内容如下(/etc/varnish/default.vcl)

backend default {

.host = "192.168.31.105";

.port = "80";

}

sub vcl_recv {

if (req.restarts == 0) {

if (req.http.x-forwarded-for) {

set req.http.X-Forwarded-For =

req.http.X-Forwarded-For + ", " + client.ip;

} else {

set req.http.X-Forwarded-For = client.ip;

}

}

if (req.request != "GET" &&

req.request != "HEAD" &&

req.request != "PUT" &&

req.request != "POST" &&

req.request != "TRACE" &&

req.request != "OPTIONS" &&

req.request != "DELETE") {

return (pipe);

}

if (req.request != "GET" && req.request != "HEAD") {

return (pass);

}

if (req.http.Authorization || req.http.Cookie) {

return (pass);

}

return (lookup);

}

sub vcl_pipe {

return (pipe);

}

sub vcl_pass {

return (pass);

}

sub vcl_hash {

hash_data(req.url);

if (req.http.host) {

hash_data(req.http.host);

} else {

hash_data(server.ip);

}

return (hash);

}

sub vcl_hit {

return (deliver);

}

sub vcl_miss {

return (fetch);

}

sub vcl_fetch {

if (beresp.ttl <= 0s ||

beresp.http.Set-Cookie ||

beresp.http.Vary == "*") {

set beresp.ttl = 120 s;

return (hit_for_pass);

}

return (deliver);

}

sub vcl_deliver {

if (obj.hits > 0){

set resp.http.X-Cache = "HIT from " + server.ip;

} else {

set resp.http.X-Cache = "MISS from " + server.ip;

}

return (deliver);

}                     #红色部分为设置缓存是否命中的标识

sub vcl_init {

return (ok);

}

sub vcl_fini {

return (ok);

}

五、配置后端Web服务器

[[email protected] ~]# yum install httpd -y

[[email protected] ~]# echo 192.168.31.105 > /var/www/html/index.html

[[email protected] ~]# service httpd start

六、测试varnish

[[email protected] ~]# curl -I http://192.168.31.178/index.html

HTTP/1.1 200 OK

Server: Apache/2.2.15 (CentOS)

Last-Modified: Sat, 05 Sep 2015 12:49:01 GMT

ETag: "c0b6d-f-51eff70ceede6"

Content-Type: text/html; charset=UTF-8

Content-Length: 15

Accept-Ranges: bytes

Date: Sat, 05 Sep 2015 20:50:35 GMT

X-Varnish: 1577077233

Age: 0

Via: 1.1 varnish

Connection: keep-alive

X-Cache: MISS from 192.168.31.178       #第一次未命中

[[email protected] ~]# curl -I http://192.168.31.178/index.html

HTTP/1.1 200 OK

Server: Apache/2.2.15 (CentOS)

Last-Modified: Sat, 05 Sep 2015 12:49:01 GMT

ETag: "c0b6d-f-51eff70ceede6"

Content-Type: text/html; charset=UTF-8

Content-Length: 15

Accept-Ranges: bytes

Date: Sat, 05 Sep 2015 20:51:35 GMT

X-Varnish: 1577077234 1577077233

Age: 60

Via: 1.1 varnish

Connection: keep-alive

X-Cache: HIT from 192.168.31.178          #第二次以及第三次都命中了

时间: 2024-08-24 08:23:07

Varnish实现Web缓存的相关文章

Varnish之二web缓存实践

一.实验说明 操作系统说明:Centos 7.2 主机名:node-proxy  IP:192.168.2.5(模拟外网)/192.168.2.18(模拟内网)  职责:双网卡,nginx负载均衡调度器 主机名:node01      IP:192.168.2.14(模拟内网)                        职责:varnish缓存服务器 主机名:node02      IP:192.168.2.15/192.168.2.101(模拟内网)          职责:httpd静态

web缓存及varnish 使用基础

Web缓存及varnish 使用基础 ================================================================================ Web Page Cache:  1.介绍 ★概念: 缓存就是数据交换的缓冲区(称作Cache),当某一硬件要读取数据时,会首先从缓存中查找需要的数据,如果找到了则直接执行,找不到的话则从内存中找.由于缓存的运行速度比内存快得多,故缓存的作用就是帮助硬件更快地运行. ★程序的运行具有局部性特征: 时

高性能web缓存加速器---varnish

web缓存是对网页文档的临时缓存的信息技术,web缓存能有效降低带宽使用量和服务器负载,提高用户体验.为什么需要缓存呢? 经验研究发现程序的运行具有两个方面的局部性特征: 时间局部性:数据再次被访问到的几率很大 空间局部性:周围数据也可能被访问到的几率很大 根据局部性特征,将访问过的资源IO或加载到高速存储上,不再从源位置加载:另外把其周边的数据也加载到高速存储中,加速资源的访问.缓存就是使用了高速的设备和良好结构设计加速资源访问速度. 一.web缓存 web缓存加速器常常应用的于调度器之后,实

varnish实现的web缓存

面对大量的PV访问,web服务器的缓存功能不容小觑,缓存在互联网中的地位已经举足轻重.那么好的缓存机制对web服务来说已经不可获取,varnish的缓存功能有目共睹,那么我们似乎没理由不了解一下基于varnish是如何让实现缓存的. varnish的官方站点:https://www.varnish-cache.org/目前最新的版本是Varnish Cache 4.0.0 不一定最新的就是最好的,在实际生产环境中稳定最重要,我们这里使用的版本是varnish-3.0.4-1.el6.x86_64

varnish 4.0 缓存代理配置

一.varnish原理: 1)Varnish简介: varnish缓存是web应用加速器,同时也作为http反向缓存代理.你可以安装varnish在任何http的前端,同时配置它缓存内容.与传统的 squid 相比,varnish 具有性能更高.速度更快.管理更加方便等诸多优点.有一部分企业已经在生产环境中使用其作为旧版本的squid的替代方案,以在相同的服务器成本下提供更好的缓存效果,Varnish更是作为CDN缓存服务器的可选服务之一. 根据官网的介绍,Varnish的主要特性如下:http

mysql 触发器 Varnish:高速http缓存 varnish cdn 推送平台

sendfile(数据直接从 kernal的buffer出去)适合小文件Aio(nginx)全异步(与事件驱动io的区别是:数据会到达mem才会通知,其实也不需要通知 可以直接返回给客户端) 支持:mmap event drive(处理大文件) 上一回说到,在数据库修改后,redis里面的数据不能做到自动更新,必须手动删除更改过的数据 根据以上问题我们做出如下改进:所以接下来就要通过 mysql 触发器将改变的数据同步到 redis 中配置 gearman 实现数据同步Gearman 是一个支持

varnish 优秀的缓存服务器

[去除干扰环境]关停:本机的httpd,haproxy,nginx iptables [varnish 优秀的缓存服务器] 特点 反向代理,负载均衡,健康状态检查 连接弱于nginx,nginx比varnish反向代理好 [看看] curl -I www.sohu.com Cache-Control: no-transform, max-age=120 [安装] varnish-3.0.4-1.el6.x86_64.rpm varnish-libs-3.0.4-1.el6.x86_64.rpm

利用varnish构建httpd缓存服务器

varnish如何存储缓存对象: file: 单个文件:不支持持久机制: malloc: 缓存在内存中: persistent:基于文件的持久存储:(此方式不建议使用) vcl:配置缓存系统的缓存机制:[线程中缓存功能的工作机制] 一.在vs2和vs3上安装http 写入文件,内容一个为on vs2,另一个为on vs3 [[email protected] ~]# yum install http [[email protected] ~]# for i in {1..10}; do echo

高级运维(一):反向代理&amp;使用Varnish加速Web

案例1.反向代理      目标: 1.代理服务器可以将远程的Web服务器页面缓存于本地 2.代理服务器端口设置为80端口 3.用户通过访问代理服务器即可获得远程Web服务器页面上的内容 4.远程Web服务器对客户端用户是透明的 5.利用缓存机制提高网站响应速度      方案: 使用3台RHEL7虚拟机,一台作为Squid代理服务器,需要配置两个网卡(连接不同网段),地址分别为192.168.4.5.192.168.2.5.一台作为客户端测试主机,IP地址为192.168.4.100.一台作为