linux之企业实训篇——varnish服务的搭建

一、varnish简介

   Varnish 是一款高性能的开源HTTP加速器,挪威最大的在线报纸 Verdens Gang 使用3台Varnish代替了原来的12台Squid,性能比以前更好。
   Varnish与一般服务器软件类似,分为master(management)进程和child(worker,主要做cache的工作)进程。master进程读入命令,进行一些初始化,然后fork并监控child进程。child进程分配若干线程进行工作,主要包括一些管理线程和很多woker线程。
   针对文件缓存部分,master读入存储配置(-s file[,path[,size[,granularity]]] ),调用合适的存储类型,然后创建/读入相应大小的缓存大文件。接着,master初始化管理该存储空间的结构体。这些变量都是全局变量,在fork以后会被child进程所继承(包括文件描述符)。
   在child进程主线程初始化过程中,将前面打开的存储大文件整个mmap到内存中(如果超出系统的虚拟内存,mmap失败,进程会减少原来的配置mmap大小,然后继续mmap),此时创建并初始化空闲存储结构体,挂到存储管理结构体,以待分配。接着,真正的工作开始,Varnish的某个负责接受新HTTP连接的线程开始等待用户,如果有新的HTTP连接过来,它总负责接收,然后叫醒某个等待中的线程,并把具体的处理过程交给它。Worker线程读入HTTP请求的URI,查找已有的object,如果命中则直接返回并回复用户。如果没有命中,则需要将所请求的内容,从后端服务器中取过来,存到缓存中,然后再回复。
分配缓存的过程是这样的:它根据所读到object的大小,创建相应大小的缓存文件。为了读写方便,程序会把每个object的大小变为最接近其大小的内存页面倍数。然后从现有的空闲存储结构体中查找,找到最合适的大小的空闲存储块,分配给它。如果空闲块没有用完,就把多余的内存另外组成一个空闲存储块,挂到管理结构体上。如果缓存已满,就根据LRU机制,把最旧的object释放掉。
   释放缓存的过程是这样的:有一个超时线程,检测缓存中所有object的生存期,如果超初设定的TTL(Time To Live)没有被访问,就删除之,并且释放相应的结构体及存储内存。注意释放时会检查该存储内存块前面或后面的空闲内存块,如果前面或后面的空闲内存和该释放内存是连续的,就将它们合并成更大一块内存。整个文件缓存的管理,没有考虑文件与内存的关系,实际上是将所有的object都考虑是在内存中,如果系统内存不足,系统会自动将其换到swap空间,而不需要varnish程序去控制。

二、搭建varnish服务

2.1、创建一个子镜像虚拟机,具体做法在上篇博客中提到
2.2、修改静态网络

这里写图片描述
修改后重启网络

2.3、安装varnish服务

(1)物理机连接虚拟机
(2)安装服务
–>安装包百度云链接: https://pan.baidu.com/s/1pENJbrk4uST6EpmyONh7oA 密码: pawf

server1
[root@server1 ~]# ls
varnish-3.0.5-1.el6.x86_64.rpm  varnish-libs-3.0.5-1.el6.x86_64.rpm
[root@server1 ~]# yum install * -y     //安装服务
Loaded plugins: product-id, subscription-manager
This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.
[root@server1 ~]# cd /etc/varnish/     //存放varnish配置文件
[root@server1 varnish]# ls
default.vcl  secret
[root@server1 varnish]# ll /etc/sysconfig/varnish   //存放varnish运行的相关参数
-rw-r--r-- 1 root root 3610 Dec  2  2013 /etc/sysconfig/varnish

这里写图片描述
(3)初始化配置文件参数
运行文件,进程数等规则: 内核 >= 操作系统 >= 软件
这里写图片描述

[root@server1 varnish]# sysctl -a |grep file     //查看内核允许的最大文件数
fs.file-nr = 480    0   98864
fs.file-max = 98864
[root@server1 varnish]# vim /etc/sysconfig/varnish   
//修改运行文件数使其在在内核允许的文件数目内,如下图

这里写图片描述

[root@server1 varnish]# vim /etc/security/limits.conf 
 //修改系统所允许varnish运行的参数文件

这里写图片描述

[root@server1 varnish]# /etc/init.d/varnish start      //打开vanishi服务
Starting Varnish Cache:   

这里写图片描述

三、配置相关服务

3.1、配置一个后端服务器

首先创建一个server2虚拟机,修改静态网络 主机名。
server2主机上:


server2
[root@server2 ~]# yum install httpd -y     //安装apache服务
Loaded plugins: product-id, subscription-manager
This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.
Setting up Install Process
Resolving Dependencies
--> Running transaction check
[root@server2 ~]# /etc/init.d/httpd start    //开启服务
Starting httpd: httpd: Could not reliably determine the server fully qualified domain name, using 172.25.2.2 for ServerName    
                                                         [  OK  ]
[root@server2 ~]# cd /var/www/html/      //发布一个网页
[root@server2 html]# vim index.html
[root@server2 html]# cat index.html  
www.westos.org

server1主机上:

[root@server1 varnish]# vim default.vcl         //修改配置文件

这里写图片描述

[root@server1 varnish]# /etc/init.d/varnish reload    //刷新配置
Loading vcl from /etc/varnish/default.vcl
Current running config name is boot
Using new config name reload_2018-07-28T14:28:17
VCL compiled.

available       0 boot
active          0 reload_2018-07-28T14:28:17

Done

浏览侧测试
这里写图片描述
可以访问则成功!

3.2、查看cdn缓存状况

物理机:


[root@foundation2 ~]# vim /etc/hosts      //设置域名解析

这里写图片描述

[root@foundation2 ~]# curl -I www.westos.org   //查看访问http的响应信息
HTTP/1.1 200 OK
Server: Apache/2.2.15 (Red Hat)
Last-Modified: Sat, 28 Jul 2018 06:32:29 GMT
ETag: "ff42b-f-5720964726cf0"
Content-Type: text/html; charset=UTF-8
Content-Length: 15
Accept-Ranges: bytes
Date: Sat, 28 Jul 2018 06:43:25 GMT
X-Varnish: 1831760976
Age: 0                 //缓存时长,因为第一次cdn是通过服务器去拿信息,所以缓存时长为0   
Via: 1.1 varnish
Connection: keep-alive

[root@foundation2 ~]# curl -I www.westos.org
HTTP/1.1 200 OK
Server: Apache/2.2.15 (Red Hat)
Last-Modified: Sat, 28 Jul 2018 06:32:29 GMT
ETag: "ff42b-f-5720964726cf0"
Content-Type: text/html; charset=UTF-8
Content-Length: 15
Accept-Ranges: bytes
Date: Sat, 28 Jul 2018 06:43:38 GMT
X-Varnish: 1831760977 1831760976
Age: 12                //直接拿自己的缓存信息而不访问服务器,缓存时长为12
Via: 1.1 varnish 
Connection: keep-alive

3.3、查看缓存命中情况

【缓存命中情况函数】
sub vcl_deliver {
if (obj.hits > 0) {
set resp.http.X-Cache = “HIT from westos cache”; //击中
}
else {
set resp.http.X-Cache = “MISS from westos cache”; //未击中
}
return (deliver);
}

实验:

server1主机上:

[root@server1 varnish]# vim default.vcl   //修改配置文件

这里写图片描述

[root@server1 varnish]# /etc/init.d/varnish reload   //刷新配置
Loading vcl from /etc/varnish/default.vcl
Current running config name is reload_2018-07-28T14:28:17
Using new config name reload_2018-07-28T14:53:51
VCL compiled.

available       0 boot
available       2 reload_2018-07-28T14:28:17
active          0 reload_2018-07-28T14:53:51

Done

物理机上:

[root@foundation2 ~]# curl -I www.westos.org
HTTP/1.1 200 OK
Server: Apache/2.2.15 (Red Hat)
Last-Modified: Sat, 28 Jul 2018 06:32:29 GMT
ETag: "ff42b-f-5720964726cf0"
Content-Type: text/html; charset=UTF-8
Content-Length: 15
Accept-Ranges: bytes
Date: Sat, 28 Jul 2018 06:56:14 GMT
X-Varnish: 1831760981
Age: 0
Via: 1.1 varnish
Connection: keep-alive
X-Cache: MISS from westos cache      //未命中(第一次)

[root@foundation2 ~]# curl -I www.westos.org
HTTP/1.1 200 OK
Server: Apache/2.2.15 (Red Hat)
Last-Modified: Sat, 28 Jul 2018 06:32:29 GMT
ETag: "ff42b-f-5720964726cf0"
Content-Type: text/html; charset=UTF-8
Content-Length: 15
Accept-Ranges: bytes
Date: Sat, 28 Jul 2018 06:56:21 GMT
X-Varnish: 1831760982 1831760981
Age: 7
Via: 1.1 varnish
Connection: keep-alive
X-Cache: HIT from westos cache   //命中(120s内)

3.4、定义多个不同域名站点的后端服务器

【函数】
backend web1 {
.host = “192.168.0.188”;
.port = “80”;
}
backend web2 {
.host = “192.168.0.189”;
.port = “80”;
}
//当访问 www.westos.org 域名时从 web1 上取数据,访问 bbs.westos.org 域名时到 web2 取数据,访问其他页面报错。
sub vcl_recv {   //接收函数,任何请求从此处接收,再判断是否符合函数要求
if (req.http.host ~ “^(www.)?westos.org”) {
set req.http.host = “www.westos.org”; //将任何以www开头的域名转换为www.westos.org
set req.backend = web1;
} elsif (req.http.host ~ “^bbs.westos.org”) {
set req.backend = web2;
} else {error 404 “westos cache”; //将任何以bbs开头的域名转换为www.westos.org
}
}

实验:
server3: //新建一个server3虚拟机

[root@server3 ~]# yum install httpd -y    //安装apache
Loaded plugins: product-id, subscription-manager
This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.
rhel-source                                                        | 3.9 kB     00:00     
rhel-source/primary_db                                 
[root@server3 ~]# /etc/init.d/httpd start  //打开服务
Starting httpd: httpd: Could not reliably determine the servers fully qualified domain name, using 172.25.2.3 for ServerName
                                                           [  OK  ]
[root@server3 ~]# cat /var/www/html/index.html   //发布一个网页
bbs.westos.org

server1:

[root@server1 varnish]# vim default.vcl       //修改配置文件

这里写图片描述

[root@server1 varnish]# /etc/init.d/varnish reload   //刷新配置
Loading vcl from /etc/varnish/default.vcl
Current running config name is reload_2018-07-28T15:29:27
Using new config name reload_2018-07-28T15:29:30
VCL compiled.

available       0 boot
available       0 reload_2018-07-28T14:28:17
available       2 reload_2018-07-28T14:53:51
available       0 reload_2018-07-28T15:29:27
active          0 reload_2018-07-28T15:29:30

Done

物理机上:

[root@foundation2 ~]# cat /etc/hosts    //解析域名
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
172.25.2.1  www.westos.org   bbs.westos.org
[root@foundation2 ~]# curl -I bbs.westos.org   //查看http访问的响应信息
HTTP/1.1 200 OK
Server: Apache/2.2.15 (Red Hat)
Last-Modified: Sat, 28 Jul 2018 07:16:58 GMT
ETag: "ff41a-f-5720a038a8376"
Content-Type: text/html; charset=UTF-8
Content-Length: 15
Accept-Ranges: bytes
Date: Sat, 28 Jul 2018 07:34:38 GMT
X-Varnish: 1831760995
Age: 0
Via: 1.1 varnish
Connection: keep-alive
X-Cache: MISS from westos cache                //访问server3成功

[root@foundation2 ~]# curl -I bbs.westos.org
HTTP/1.1 200 OK
Server: Apache/2.2.15 (Red Hat)
Last-Modified: Sat, 28 Jul 2018 07:16:58 GMT
ETag: "ff41a-f-5720a038a8376"
Content-Type: text/html; charset=UTF-8
Content-Length: 15
Accept-Ranges: bytes
Date: Sat, 28 Jul 2018 07:34:39 GMT
X-Varnish: 1831760996 1831760995
Age: 1
Via: 1.1 varnish
Connection: keep-alive
X-Cache: HIT from westos cache                 //访问server3成功

3.5、定义健康检查

【函数】
probe healthcheck {
.url = “/index.html”; /哪个 url 需要 varnish 请求
.interval = 5s; //检查的间隔时间
.timeout = 1s; //等待多长时间探针超时
.window = 5; //维持 5 个 sliding window 的结果
.threshold = 3; //至少有三次 window 是成功的,就宣告 bachend 健康
}
backend web1 {
.host = “192.168.0.2”;
.port = “80”;
.probe = healthcheck;
}
backend web2 {
.host = “192.168.0.3”;
.port = “80”;
.probe = healthcheck;
}

3.6、定义负载均衡

【函数】
director lb round-robin {
//lb为夫在均衡名,可任意选取,round-robin使用轮叫策略
{.backend = web1;}
{.backend = web2;}
}
//把多个后端聚合为一个组,并检测后端健康状况
sub vcl_recv {
if (req.http.host ~ “^(www.)?westos.org”) {
set req.http.host = “www.westos.org”;
set req.backend = lb;
return (pass);
//为了测试方便,不进行缓存,直接从服务器抓取。
} elsif (req.http.host ~ “^bbs.westos.org”) {
set req.backend = web2;
} else {
error 404 “westos cache”;
}
}

实验:
server3:

[root@server3 ~]# vim /etc/httpd/conf/httpd.conf  //修改配置文件,定义发布文件

这里写图片描述
这里写图片描述

[root@server3 ~]# mkdir /wwwl
[root@server3 ~]# cd /wwwl
[root@server3 wwwl]# vim index.html
[root@server3 wwwl]# cat index.html   //发布网页
www.westos.org   - server3
[root@server3 wwwl]# /etc/init.d/httpd restart   //重启服务
Stopping httpd:                                            [  OK  ]
Starting httpd: httpd: Could not reliably determine the servers fully qualified domain name, using 172.25.2.3 for ServerName
                                                           [  OK  ]

[root@server3 wwwl]# vim /etc/hosts   //解析域名

这里写图片描述


[root@server3 wwwl]# curl www.westos.org  //测试
www.westos.org   - server3
[root@server3 wwwl]# curl bbs.westos.org
bbs.westos.org           //成功

为了方便我们将www.westos.org域名在不同主机上的文件内容作一个标记,再发布网页上标注上主机名
server1:

[root@server1 varnish]# vim default.vcl  //修改配置文件

这里写图片描述

[root@server1 varnish]# /etc/init.d/varnish reload   //刷新配置
Loading vcl from /etc/varnish/default.vcl
Current running config name is reload_2018-07-28T15:29:30
Using new config name reload_2018-07-28T16:04:21
VCL compiled.

available       0 boot
available       0 reload_2018-07-28T14:28:17
available       0 reload_2018-07-28T14:53:51
available       0 reload_2018-07-28T15:29:27
available       2 reload_2018-07-28T15:29:30
active          0 reload_2018-07-28T16:04:21

Done

测试:

通过 varnishadm 手动清除缓存
1. varnishadm ban.url .*$
//清除所有

2.varnishadm ban.url /index.html
//清除 index.html 页面缓存

3 varnishadm ban.url /admin/$
//清除 admin 目录缓存

真机:
[root@foundation2 ~]# curl  www.westos.org/index.html   //访问
www.westos.org  - server2   //此时从server2主机上获取的文件
server1:
[root@server1 varnish]# varnishadm ban.url /index.html   //清楚index.html目录下的缓存
真机:
[root@foundation2 ~]# curl  www.westos.org/index.html   
www.westos.org  - server3    //此时从server3主机上获取的文件
server1:
[root@server1 varnish]# varnishadm ban.url /index.html    //清楚index.html目录下的缓存
真机:
[root@foundation2 ~]# curl  www.westos.org/index.html
www.westos.org  - server2     //此时从server2主机上获取的文件 

server2:
[root@server2 html]# /etc/init.d/httpd stop      //关闭服务
Stopping httpd:                                            [  OK  ]
server1:
[root@server1 varnish]# varnishadm ban.url /index.html  //清楚index.html目录下的缓存
真机:
[root@foundation2 ~]# curl  www.westos.org/index.html
www.westos.org  - server3        //此时从server3主机上获取的文件
server1:
[root@server1 varnish]# varnishadm ban.url /index.html    //清楚index.html目录下的缓存
真机:
[root@foundation2 ~]# curl  www.westos.org/index.html
www.westos.org  - server3     //此时仍从server3主机上获取的文件,因为server2 的服务以坏掉

这里写图片描述

猜你喜欢

转载自blog.csdn.net/yifan850399167/article/details/81267195