varnish---反向代理web加速缓存服务器和CDN的推送

Varnish 简介

Varnish 是一款高性能且开源的反向代理服务器和 HTTP 加速器,其采用全新的软件体系机构,和如今的硬件体系紧密配合,与传统的 squid 相比,varnish 具备性能更高、速度更快、管理更加方便等诸多优势,不少大型的网站都开始尝试使用 varnish 来替换 squid,这些都促进 varnish 迅速发展起来。php

挪威的最大的在线报纸 Verdens Gang(vg.no) 使用 3 台 Varnish 代替了原来的 12 台 Squid,性能比之前更好,这是 Varnish 最成功的应用案例。html

Varnish 文件缓存的工做流程

Varnish 与通常服务器软件相似,分为 master 进程和 child 进程。Master 进程读入存储配置文件,调用合适的存储类型,而后建立 / 读入相应大小的缓存文件,接着 master 初始化管理该存储空间的结构体,而后 fork 并监控 child 进程。Child 进程在主线程的初始化的过程当中,将前面打开的存储文件整个 mmap 到内存中,此时建立并初始化空闲结构体,挂到存储管理结构体,以待分配。Child 进程分配若干线程进行工做,主要包括一些管理线程和不少 worker 线程。web

接着,开始真正的工做,varnish 的某个负责接收新 HTTP 链接线程开始等待用户,若是有新的 HTTP 链接过来,它总负责接收,而后唤醒某个等待中的线程,并把具体的处理过程交给它。Worker 线程读入 HTTP 请求的 URI,查找已有的 object,若是命中则直接返回并回复用户。若是没有命中,则须要将所请求的内容,从后端服务器中取过来,存到缓存中,而后再回复。vim

分配缓存的过程是这样的:它根据所读到 object 的大小,建立相应大小的缓存文件。为了读写方便,程序会把每一个 object 的大小变为最接近其大小的内存页面倍数。而后从现有的空闲存储结构体中查找,找到最合适的大小的空闲存储块,分配给它。若是空闲块没有用完,就把多余的内存另外组成一个空闲存储块,挂到管理结构体上。若是缓存已满,就根据 LRU 机制,把最旧的 object 释放掉。后端

释放缓存的过程是这样的:有一个超时线程,检测缓存中全部 object 的生存期,若是超初设定的 TTL(Time To Live)没有被访问,就删除之,而且释放相应的结构体及存储内存。注意释放时会检查该存储内存块前面或后面的空闲内存块,若是前面或后面的空闲内存和该释放内存是连续的,就将它们合并成更大一块内存。缓存

整个文件缓存的管理,没有考虑文件与内存的关系,其实是将全部的 object 都考虑是在内存中,若是系统内存不足,系统会自动将其换到 swap 空间,而不须要 varnish 程序去控制。服务器


server11:tcp


rpm -ivh varnish-3.0.5-1.el6.x86_64.rpm varnish-libs-3.0.5-1.el6.x86_64.rpmide

vim /etc/sysconfig/varnish VARNISH_LISTEN_PORT=80性能

vim /etc/varnish/default.vcl

  7 backend default {
 8   .host = "172.25.88.13";
 9   .port = "80";
10 }
11
12 backend web {
13   .host = "172.25.88.12";
14   .port = "80";
15 }
16
17 sub vcl_recv {
18 if (req.http.host ~ "^(www.)?westos.org") { #若是用户访问:westos.org,会自动补全www
19 set req.http.host = "www.westos.org";
20 set req.backend = default;
21 } elsif (req.http.host ~ "^bbs.westos.org") { #若是访问:bbs.westos.org,就去访问web
22 set req.backend = web;
23 } else
        {error 404 "westos cache";    除了访问这些域名,其余就GG了
24 }
25 }

   #测试缓存命中
27 sub vcl_deliver {
28 if (obj.hits > 0) {
29 set resp.http.X-Cache = "HIT from westos cache"; 命中缓存
30 }
31 else {
32 set resp.http.X-Cache = "MISS from westos cache";
33 }
34 return (deliver);
35 }

/etc/init.d/varnish start

[root@server11 ~]# netstat -antlp |grep 80 tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1167/varnishd

server12

/etc/init.d/httpd start

cat index.html

server13

经过 varnishadm 手动清除缓存

varnishadm ban.url .*$          #清除全部
varnishadm ban.url /index.html  #清除 index.html 页面缓存
varnishadm ban.url /admin/$    #清除 admin 目录缓存


第一次错过(miss)缓存

wKioL1jnqc7CurrkAACWQkKYq_M177.png


第一次命中(hit)缓存

wKiom1jnqc_B14MRAACUt05cews140.png


varnish虚拟主机和轮寻


server12:

vim /etc/httpd/conf/httpd.conf

990 NameVirtualHost *:80
1012 <VirtualHost *:80>
1013     DocumentRoot /var/www/html
1014     ServerName server12.lalala.com
1015 </VirtualHost>
1016
1017 <VirtualHost *:80>
1018     DocumentRoot /www1
1019     ServerName www.westos.org
1020 </VirtualHost>
1021
1022 <VirtualHost *:80>
1023     DocumentRoot /www2
1024     ServerName bbs.westos.org
1025 </VirtualHost>

server11:

vim /etc/varnish/default.vcl

  7 backend default {
 8   .host = "172.25.88.13";
 9   .port = "80";
10 }
11
12 backend web {
13   .host = "172.25.88.12";
14   .port = "80";
15 }
16
17 director lb round-robin {
18 {.backend = default;}
19 {.backend = web;}
20 }
21
22 sub vcl_recv {
23 if (req.http.host ~ "^(www.)?westos.org") {
24 set req.http.host = "www.westos.org";
25 set req.backend = lb;
26 return (pass);    #为了测试方便,不进行缓存。
27 } elsif (req.http.host ~ "^bbs.westos.org") {
28 set req.backend = web;
29 } else {error 404 "westos cache";
30 }
31 }
32
33 sub vcl_deliver {
34 if (obj.hits > 0) {
35 set resp.http.X-Cache = "HIT from westos cache";
36 }
37 else {
38 set resp.http.X-Cache = "MISS from westos cache";
39 }
40 return (deliver);
41 }

wKioL1jnqc_AilidAAAi7ssx1Qs222.png


wKiom1jnqdDB2nHfAAATS0KhM0M428.png


wKioL1jnqdCwgBWSAAAUF7l8l4o626.png


wKiom1jnqdCDxJO1AAAW-nqRZnY988.png

wKiom1jnqdCS-MWnAABOIIJUpwM091.png



CDN推送


当varnish缓存的页面有更新,须要从新的页面的时候,只须要web开发人员,提交更改的网址,这就是咱们的CDN推送

[root@server11 html]# unzip bansys.zip 
[root@server11 html]# cd bansys
[root@server11 bansys]# mv * ..
bansys 有两种工做模式,分别是:telnet 和 http 模式。
telnet 模式须要关闭 varnish 服务管理端口的验证,注释掉/etc/sysconfig/varnish 文件中的 “ -S $
{VARNISH_SECRET_FILE}”这行,重启 varnish 服务便可。
若是是 http 模式须要对 varnish 作如下设置:

vim /etc/varnish/default.vcl

  8 acl westos {
 9 "127.0.0.1";
10 "172.25.88.0"/24;
11 }
12
13 sub vcl_recv {
14 if (req.request == "BAN") {
15 if (!client.ip ~ westos) {
16 error 405 "Not allowed.";
17 }
18 ban("req.url ~ " + req.url);
19 error 200 "ban added";
20 }
21 }

vim config.php #只保留以下设置,其他注释掉

<?php


//varnish主机列表
$var_group1 = array(
                       'host' => array('172.25.88.11'),
                                               'port' => '80',                  
                   );




//varnish群组定义
//对主机列表进行绑定
$VAR_CLUSTER = array(
                        'www.westos.org' => $var_group1,
                    );


//varnish版本
//2.x和3.x推送命令不同
$VAR_VERSION = "3";

?>




wKioL1jnqdGjJkuDAABZiQqIEPQ185.png


wKioL1jnqdGwfKA0AABQCcuqCCM964.png

相关文章
相关标签/搜索