Linux 下Varnish 服务的部署
varnish 简介:
Varnish 是一款高性能、开源的反向代理服务器和缓存服务器。Varnish 使用内存缓存文件来减少响应时间和网络带宽消耗。这个项目是由挪威的一家报纸 Verdens Gang 的网络分支起始的,其架构设计和开发总监 Poul-Henning Kamp 是FreeBSD 核心的开发人员之一,最初项目的管理与基础设施及额外开发由挪威一家 Linux咨询公司 Linpro提供。
说到varnish,squid 就不得不提及。squid 算得上是古老的缓存服务器。由于varnish先进的设计理念,性能要比squid高上许多 Verdens Gang 使用3台Varnish代替了原来的12台Squid,性能比以前更好。,varnish还可以通过端口进行管理,使用正则语句做到清除指定缓存的功能,这些squid都做不到。但是varnish在高并发的情况下,资源消耗较高,而且varnish服务进程一旦崩溃,重启,内存中的缓存数据将全部丢失。
varnish官方网站:https://www.varnish-cache.org/
Varish 的工作流程
Varnish处理HTTP请求的过程大致分为如下几个步骤:
Receive状态,也就是请求处理的入口状态,根据VCL规则判断该请求应该Pass或Pipe,还是进入Lookup(本地查询)。
Lookup状态,进入此状态后,会在hash表中查找数据,若找到,则进入Hit状态,否则进入miss状态。
Pass状态,在此状态下,会进入后端请求,即进入Fetch状态。
Fetch状态,在Fetch状态下,对请求进行后端获取,发送请求,获得数据,并进行本地存储。
Deliver状态, 将获取到的数据发送给客户端,然后完成本次请求。
图中椭圆形部分称为varnish的状态节点,又称为状态引擎,还有种叫法为varnish的内置函数。
图中红色的线条:没有查询缓存/缓存中数据过期/缓存中没有数据 情况下的流程
图中橙黄色的线条:直接将匹配数据通过内置函数vcl_pipe送往后台主机的流程
图中绿色的线条:查询缓存数据命中且数据没有过期/经后台主机返回的数据经被缓存后返回给客户流程
图中蓝色的线条:数据没有命中缓存向后台主机发出查询的流程 图中黑色的线条:数据从后台主机返回给varnish缓存的流程
Varnish 的基本配置
Varish 安装
准备安装包进行安装 执行命令进行安装
[root@Server1 mnt]# cd /mnt/
[root@Server1 mnt]# ls # 此目录下有 varnish 所需安装包
varnish-3.0.5-1.el6.x86_64.rpm varnish-libs-3.0.5-1.el6.x86_64.rpm
[root@Server1 mnt]# rpm -ivh varnish-* # 通过 rpm 命令进行安装
进行配置
Varnish 的主要配置文件,及其说明
NFILES=131072 --->打开的最大文件数,varnish 自动调整该值
MEMLOCK=82000 --->内存中共享日志空间的大小
NPROCS="unlimited" --->单个用户运行的线程数
RELOAD_VCL=1 --->设置为1 ,表示随着varnish的重启自动状态vcl策略配置文件
VARNISH_VCL_CONF=/etc/varnish/default.vcl --->默认vcl策略文件的位置
VARNISH_LISTEN_PORT=80 --->varnish监听的端口,默认为 6081
VARNISH_ADMIN_LISTEN_ADDRESS=127.0.0.1 --->varnish提供telnet管理端口监听的地址
VARNISH_ADMIN_LISTEN_PORT=6082 --->varnish提供telnet管理端口监听的端口 VARNISH_SECRET_FILE=/etc/varnish/secret --->varnish为管理端口提供的共享密钥文件
VARNISH_MIN_THREADS=50 --->varnish启动时启动最少的线程数
VARNISH_MAX_THREADS=1000 --->varnish启动时启动最多的线程数 VARNISH_THREAD_TIMEOUT=120 --->varnish线程数的空闲时间,超过该时间自动销毁线程
VARNISH_STORAGE_MEM=100M --->使用内存为存储设备时使用的空间大小
VARNISH_STORAGE="malloc,${VARNISH_STORAGE_MEM}"
--->当varnish后端存储的配置,使用内存用来缓存数据,大小为100M
VARNISH_TTL=120
DAEMON_OPTS="-a ${VARNISH_LISTEN_ADDRESS}:${VARNISH_LISTEN_PORT} \
-f ${VARNISH_VCL_CONF} \
-T ${VARNISH_ADMIN_LISTEN_ADDRESS}:${VARNISH_ADMIN_LISTEN_PORT} \
-t ${VARNISH_TTL} \
-w ${VARNISH_MIN_THREADS},${VARNISH_MAX_THREADS},${VARNISH_THREAD_TIMEOUT} \
-u varnish -g varnish \
-S ${VARNISH_SECRET_FILE} \
-s ${VARNISH_STORAGE}"
对Varnish 进行配置
/etc/sysconfig/varnish 中规定了
NFILES=131072 # 打开的最大文件数
MEMLOCK=82000 # 内存中共享日志空间的大小
NPROCS=”unlimited” # 单个用户运行的线程数
将这些数据写入/etc/security/limits.conf 中
/etc/security/limits.conf 这个文件主要是用来限制用户对系统资源的使用,具体的使用方法 man 5 limits.conf,里面便给出了详细的用法
[root@Server1 mnt]# vim /etc/security/limits.conf
内容如下:
在文件最后添加:
#End of file
varnish - nofile 131072
varnish - memlock 82000
varnish - nproc unlimited
编辑 /etc/sysconfig/varnish
将varnish监听的端口从6081 改为80
[root@Server1 mnt]# vim /etc/sysconfig/varnish
编辑第 66 行
65 # VARNISH_LISTEN_ADDRESS=
66 VARNISH_LISTEN_PORT=80
67 #
68 # # Telnet admin interface listen address and port
编辑 /etc/varnish/default.vcl
编辑此文件 添加 Apache 服务器,和进行 vcl 规则配置
[root@Server1 mnt]# vim /etc/varnish/default.vcl
编辑如下:
# 编辑后段服务器:
7 backend default {
8 .host = "172.25.21.2"; # 服务器 ip
9 .port = "80";
10 }
11
# 查看缓存命中情况
12 sub vcl_deliver {
13 if (obj.hits > 0) {
14 set resp.http.X-Cache = "HIT from test cache";
15 }
16 else {
17 set resp.http.X-Cache = "MISS from test cache";
18 }
19 return (deliver);
20 }
配置完成,重启服务,并加载varnish 规则
[root@Server1 mnt]# /etc/init.d/varnish restart # 重启服务
[root@Server1 mnt]# /etc/init.d/varnish reload # 重新加载规则
进行apacha 服务器的安装配置
执行命令进行httpd 服务的安装
[root@Server2 ~]# yum install httpd - y # httpd 服务安装
[root@Server2 ~]# vim /var/www/html/index.html
# 编辑默认发布文件
在服务端进行测试
修改服务端本地域名解析
[root@foundation21 ~]# vim /etc/hosts
编辑内容如下:
172.25.15.1 www.test.com nba.test.com # 将 varnish 服务器的域名加上
在服务器端进通过浏览器访问 Apache 服务器
访问 Apache 服务器的 ip
我们的 varnish 服务器上是没有安装 Apache 服务的,而我们可以通过访问 varnish 服务而访问到 172.25.15.2 Apache 服务器的内容,这就是varnish 的作用之一,进行转发
我们可以通过 crul 命令来查看通过 varnish 对 HTTP 服务器内容的cache效果
执行:
[root@foundation21 ~]# curl www.test.com -I 通过 varnish 服务器的域名进行访问
HTTP/1.1 200 OK
Server: Apache/2.2.15 (Red Hat) # 服务器
Last-Modified: Sat, 28 Jul 2018 08:04:44 GMT
ETag: "9fa0b-20-5720aae603b9e"
Content-Type: text/html; charset=UTF-8 # 文本类型
Content-Length: 32 # 文本长度
Accept-Ranges: bytes
Date: Sat, 28 Jul 2018 08:59:26 GMT
X-Varnish: 653942394 # varinsh 服务器
Age: 0 # 有效时间
Via: 1.1 varnish # 版本
Connection: keep-alive # 连接情况
X-Cache: MISS from test cache # cache情况
# 由于是第一次进行cache,需要从http 服务器端获取数据
多个不同域名站点的后端服务器的配置
新建第二个 Apache 服务器
执行命令进行httpd 服务的安装
[root@Server3 ~]# yum install httpd -y # httpd 服务安装
[root@Server3 ~]# vim /var/www/html/index.html
# 编辑默认发布文件
在varnish 服务器进行配置
编辑 /etc/varnish/default.vcl
[root@Server1 mnt]# vim /etc/varnish/default.vcl
编辑内容如下:
8 backend web1 { # 第一个后端服务器
9 .host = "172.25.21.2";
10 .port = "80";
11 }
12 backend web2 { # 第二个后端服务器
13 .host = "172.25.21.3";
14 .port = "80";
15 }
16
17
18
19
#当访问 www.test.com 域名时从 web1 上取数据,访问 nba.test.com 域名时到 web2 取数据,
#访问其他页面报错。
20 sub vcl_recv {
21 if (req.http.host ~ "^(www.)?test.com") {
22 set req.http.host = "www.test.com";
23 set req.backend = web1;
24
25 } elsif (req.http.host ~ "^nba.test.com") {
26 set req.backend = web2;
27 } else {
28 error 404 "test cache";
29 }
30 }
编辑完成重新加载varnish配置
[root@Server1 mnt]# /etc/init.d/varnish restart
[root@Server1 mnt]# /etc/init.d/varnish reload
在客户端进行测试
修改服务端本地域名解析
[root@foundation21 ~]# vim /etc/hosts
编辑内容如下:
172.25.21.1 www.test.com nba.test.com # 将 varnish 服务器的域名加上
进行测试
[root@foundation21 ~]# curl www.test.com # 对服务器1进行访问
<h1>www.test.com - server2<h1/> # 默认发布文件内容
[root@foundation21 ~]# curl nba.test.com # 对服务器2进行访问
nba.test.com # 默认发布文件内容
[root@foundation21 ~]# curl sss.test.com # 对未知服务器进行访问
<html>
<head><title>302 Found</title></head>
<body bgcolor="white">
<center><h1>302 Found</h1></center>
<hr><center>nginx/1.13.12</center>
</body>
</html>
健康检查与负载均衡
varnish可以对后端主机进行健康检测,动态进行移除或恢复后端主机调度列表
.probe:定义健康状态检测方法
.url:检测时请求的URL,默认为”/”;
.request:发出的具体请求;
.request =
“GET /.healthtest.html HTTP/1.1”
“Host: www.magedu.com”
“Connection: close”
.window:基于最近的多少次检查来判断其健康状态;
.threshhold:最近.window中定义的这么次检查中至有.threshhold定义的次数是成功的;
.interval:检测频度;
.timeout:超时时长;
.expected_response:期望的响应码,默认为200;
负载均衡
英文名称为Load Balance,其意思就是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。
varnish 的负载均衡可浅显的理解为,将一个服务器上的信息分摊到多个服务器上,防止一个服务器崩溃导致无法进行数据访问
具体操作如下:
在 varnish 端
配置 /etc/varnish/default.vcl
[root@Server1 mnt]# vim /etc/varnish/default.vcl
编辑如下:
probe healthcheck {
.url = "/index.html"; # 哪个 url 需要 varnish 请求
.interval = 5s; # 检查的间隔时间
.timeout = 1s; # 等待多长时间探针超时
.window = 5; # 维持 5 个 sliding window 的结果
.threshold = 3; # 至少有三次 window 是成功的,就宣告bachend 健康
}
backend web1 {
.host = "172.25.151.2";
.port = "80";
.probe = healthcheck;
}
backend web2 {
.host = "172.25.151.3";
.port = "80";
.probe = healthcheck;
}
director test round-robin { # 把多个后端聚合为一个组
{ .backend = web1; }
{ .backend = web2; }
}
sub vcl_recv {
if (req.http.host ~ "^(www.)?test.com") {
set req.http.host = "www.test.com";
set req.backend = test;
return(pass); # 为了测试方便,不进行缓存
}
elsif (req.http.host ~ "^nba.test.com") {
set req.backend = web2;
}
else {
error 404 "test cache";
}
}
编辑完成,进行重新加载
[root@Server1 mnt]# /etc/init.d/varnish reload
编辑完成,进行重新加载
在第二个http服务器进行配置
开启虚拟主机
编辑配置文件
[root@Server3 ~]# vim /etc/httpd/conf/httpd.conf
第 990 行 NameVirtualHost *:80 # 开启虚拟主机
......省略......
<VirtualHost *:80>
DocumentRoot /var/www/html
ServerName nba.test.com
</VirtualHost>
<VirtualHost *:80>
DocumentRoot /www2
ServerName www.test.com
</VirtualHost>
建立虚拟主机的家目录与默认发布文件
[root@Server3 ~]# mkdir /www2 # 创建目录
[root@Server3 ~]# vim /www2/index.html # 编辑默认发布文件
[root@Server3 ~]# /etc/init.d/httpd restart # 重启服务
在客户端进行测试
[root@foundation151 images]# curl www.test.com # 访问指定域名
<h1>www.test.com - server2 <h1/> # 默认发布目录
[root@foundation151 images]# curl www.test.com
www.test.com - server3
由于在配置文件中加上了 return(pass) 不进行缓存,所以会直接切换到不同的服务器,这样更直观了看出了负载均衡的作用,要是在一台服务器宕掉的情况下,还是可以访问到相应信息的