简介
Varnish可以有效降低web服务器的负载,提升访问速度。根据官方的说法,Varnish是一个cache型的HTTP反向代理。
按照HTTP协议的处理过程,web服务器接受请求并且返回处理结果,理想情况下服务器要在不做额外处理的情况下,立即返回结果,但实际情况并非如此。本文将分析在web服务器处理请求的过程中,Varnish能起到什么作用。
web服务器的实现千差万别,但典型的处理过程是相同的,都要经过一系列的步骤来处理接收到的每个请求。有可能需要启动一个进程来处理请求,有可能需要从磁盘上载入文件,或者启动内部线程来编译执行一些脚本。在执行脚本的过程中,还会有进行很多别的动作,比如进行数据库查询,读取文件等等。当成百上千个请求并发访问时,服务器的负载会很快上升,出现系统资源不够的情况。一种更糟的情况是,很多请求是重复的,但web服务器无法记住曾经作出的响应,还会重复上面复杂的处理过程。当把Varnish部署上之后,web请求的处理过程会有一些变化。客户端的请求将首先被Varnish接受。Varnish将分析接收的请求,并将其转发到后端的web服务器上。后端的web服务器对请求进行常规的处理,并将依次将处理结果返回给Varnish。
但Varnish的功能并非仅限于此。Varnish的核心功能是能能将后端web服务器返回的结果缓存起来,如果发现后续有相同的请求,Varnish将不会将这个请求转发到web服务器,而是返回缓存中的结果。这将有效的降低web服务器的负载,提升响应速度,并且每秒可以响应更多的请求。Varnish速度很快的另一个主要原因是其缓存全部都是放在内存里的,这比放在磁盘上要快的多。诸如此类的优化措施使得Varnish的相应速度超乎想象。但考虑到实际的系统中内存一般是有限的,所以需要手工配置一下缓存的空间限额,同时避免缓存重复的内容。
下面来看一下Varnish的安装过程。
varnish安装
https://packagecloud.io/varnishcache/varnish63/packages/el/7/varnish-6.3.2-1.el7.x86_64.rpm
https://pkgs.org/ 找包工具(jemalloc-3.6.0-1.el7.x86_64.rpm)依赖包
找不到的同学可在我的资源进行下载。
下载好后直接安装就可以
服务配置(每次修改都需要重启)
- 修改varnish用户限制文件
[root@server2 ~]# vim /usr/lib/systemd/system/varnish.service
# Maximum number of open files (for ulimit -n)
LimitNOFILE=131072 #打开文件数
# Locked shared memory - should suffice to lock the shared memory log
# (varnishd -l argument)
# Default log size is 80MB vsl + 1M vsm + header -> 82MB #内存锁定
# unit is bytes
LimitMEMLOCK=85983232
查看当前系统配置可打开文件数
[root@server2 ~]# sysctl -a | grep file
fs.file-max = 200904 #如果小于varnish需求就增加内存
fs.file-nr = 896 0 200904
fs.xfs.filestream_centisecs = 3000
修改系统限制文件
# End of file
varnish - nofile 131072
varnish - memlock 82000
- 修改varnish服务端口
[root@server2 ~]# vim /usr/lib/systemd/system/varnish.service
ExecStart=/usr/sbin/varnishd -a :80 -T localhost:6081 -f /etc/varnish/default.vcl -s malloc,256m
- 配置后端web服务器
- 告知varnish
[root@server2 ~]# cat /etc/varnish/default.vcl
backend default {
.host = "172.25.254.3";
.port = "80";
}
- 测试:
[root@server2 ~]# curl 172.25.254.1
server3
varnish的cache
[root@server2 ~]# vim /etc/varnish/default.vcl
sub vcl_deliver { #在缓存数据将要发送到客户端时调用
if (obj.hits > 0){
set resp.http.X-Cache = "Hit from server2 cache";
}
else{
set resp.http.X-Cache = "Miss from server2 cache"; #resp.http由varnish响应给客户端的报文首部
}
return (deliver);
}
- 测试
[root@server4 ~]# curl -I bbs.westos.org
HTTP/1.1 200 OK
Date: Wed, 19 Feb 2020 10:36:28 GMT
Server: Apache/2.4.6 (Red Hat Enterprise Linux)
Last-Modified: Wed, 19 Feb 2020 06:32:06 GMT
ETag: "17-59ee7f279264f"
Content-Length: 23
Content-Type: text/html; charset=UTF-8
X-Varnish: 32773 32771
Age: 7
Via: 1.1 varnish (Varnish/6.3)
X-Cache: Hit from server2 cache
Accept-Ranges: bytes
Connection: keep-alive
- 清除varnish缓存
[root@server2 ~]# varnishadm ban req.url "~" / #再次测试报文头部为MISS
[root@server2 ~]# varnishadm ban req.url "~" /index.html
varnish多个后端
[root@server2 ~]# vim /etc/varnish/default.vcl
backend web1 {
.host = "172.25.254.3";
.port = "80";
}
backend web2 {
.host = "172.25.254.4";
.port = "80";
}
sub vcl_recv {
if (req.http.host ~ "^(www.)?westos.org") {
set req.http.host = "www.westos.org";
set req.backend_hint = lb.backend();
} elsif (req.http.host ~ "^bbs.westos.org") {
set req.backend_hint = web2;
} else {
return (synth(405));
}
}
vcl_recv
vcrl_recv是http请求到达后的第一个状态,在这个状态中,可以对请求进行以下的一些处理
1.修改client请求,以减少缓存决策时的差异性
2.根据client请求决定缓存策略
3.重定向请求
4.决定请求的backend
在缓存数据将要发送到客户端时调用
- 测试(先要在测试主机进行本地解析)
[root@server4 ~]# curl bbs.westos.org
server4
[root@server4 ~]# curl www.westos.org
server3
- varnish多个后端之间实现负载均衡
在server4上配置虚拟主机
[root@server4 ~]# vim /etc/httpd/conf.d/vhost.conf
<VirtualHost *:80>
DocumentRoot /www
ServerName www.wetos.org
</VirtualHost>
<Directory "/www">
Require all granted
</Directory>
<VirtualHost *:80>
DocumentRoot /bbs
ServerName bbs.wetos.org
</VirtualHost>
<Directory "/bbs">
Require all granted
</Directory>
[root@server4 ~]# cat /www/index.html
server4:www.westos.org
[root@server4 ~]# cat /bbs/index.html
server4:bbs.westos.org
配置varnish
[root@server2 ~]# vim /etc/varnish/default.vcl
vcl 4.1;
import directors from "/usr/lib64/varnish/vmods/libvmod_directors.so";
sub vcl_init {
new lb = directors.round_robin(); #轮询
lb.add_backend(web1);
lb.add_backend(web2);
}
sub vcl_recv {
# Happens before we check if we have this in cache already.
#
# Typically you clean up the request here, removing cookies you don't need,
# rewriting the request, etc.
if (req.http.host ~ "^(www.)?westos.org") {
set req.http.host = "www.westos.org";
set req.backend_hint = lb.backend();
} elsif (req.http.host ~ "^bbs.westos.org") {
set req.backend_hint = web2;
} else {
return (synth(405));
}
}
- 测试(先关闭缓存)
[root@server2 ~]# vim /etc/varnish/default.vcl
sub vcl_recv {
if (req.http.host ~ "^(www.)?westos.org") {
set req.http.host = "www.westos.org";
set req.backend_hint = lb.backend();
return (pass);
} elsif (req.http.host ~ "^bbs.westos.org") {
set req.backend_hint = web2;
} else {
return (synth(405));
}
}
[root@server4 ~]# curl www.westos.org
server3
[root@server4 ~]# curl www.westos.org
server4:www.westos.org
[root@server4 ~]# curl www.westos.org
server3
[root@server4 ~]# curl www.westos.org
server4:www.westos.org
varnish cdn 推送管理
yum insatll php -y
unzip bansys.zip -d /var/www/html/
mv /var/www/html/bansys/* /var/www/html/
cd /var/www/html/
vim config.php
更改apache端口为8080
更改varnish配置
acl westos {
"127.0.0.1";
"172.25.254.0"/24;
}
sub vcl_recv {
if (req.method == "BAN") {
if (!client.ip ~ westos){
return(synth(405,"Not allowed"));
}
ban("req.url ~ " + req.url);
return(purge);
}
}
重启服务
- 测试
[root@server4 ~]# curl -I www.westos.org
HTTP/1.1 200 OK
Date: Thu, 20 Feb 2020 03:24:57 GMT
Server: Apache/2.4.6 (Red Hat Enterprise Linux)
Last-Modified: Wed, 19 Feb 2020 03:11:21 GMT
ETag: "8-59ee52486b54d"
Content-Length: 8
Content-Type: text/html; charset=UTF-8
X-Varnish: 10 32777
Age: 4
Via: 1.1 varnish (Varnish/6.3)
X-Cache: Hit from server2 cache
Accept-Ranges: bytes
Connection: keep-alive
[root@server4 ~]# curl -I www.westos.org
HTTP/1.1 200 OK
Date: Thu, 20 Feb 2020 03:25:35 GMT
Server: Apache/2.4.6 (Red Hat Enterprise Linux)
Last-Modified: Wed, 19 Feb 2020 03:11:21 GMT
ETag: "8-59ee52486b54d"
Content-Length: 8
Content-Type: text/html; charset=UTF-8
X-Varnish: 14
Age: 0
Via: 1.1 varnish (Varnish/6.3)
X-Cache: Miss from server2 cache
Accept-Ranges: bytes
Connection: keep-alive