Varnish
了解varnish
是什么?
一款高性能的开源HTTP加速器,具有反向代理,缓存的功能,有时称为HTTP加速器或web加速器。
Varnish将文件或文件片段存储在内存中,使它们能够快速被提供。
Varnish本质上是一个键/值存储,它通常使用URL作为键。
缓存???
使用缓存有两个前提条件,一是数据访问热点不均衡,某些数据会被更频繁的访问,这些数据应该放在缓存中;二是数据在某个时间段有效,不会很快过期,否则缓存的数据就会因已经失效而产生脏读,影响结果的正确性
网站应 用中,缓存除了可以加快数据访问速度,还可以减轻松后端应用和数据存储的负载压力,这一点对网站数据库架构至关重要,网站数据库库几乎都是按照有缓存的前提进行负载能力设计的
正代与反代???
待补充
安装
得到文件压缩包
解压压缩包并进入目录
yum install -y varnish-4.0.5-1.el7.x86_64.rpm varnish-libs-4.0.5-1.el7.x86_64.rpm jemalloc-3.6.0-1.el7.x86_64.rpm -y
##el7表示版本,一定得装和系统相同的版本
rpm -qc varnish-4.0.5-1.el7.x86_64
/etc/logrotate.d/varnish ##日志文件
/etc/varnish/default.vcl ##配置文件(核心),由vcl语言编写
/etc/varnish/varnish.params ##自身参数设置文件
##注意##
/usr/lib/systemd/system/varnish.service
## 此服务文件可以看服务的一些限制!
配置服务环境
1.1)
ulimit -a ##列出每个用户对资源的限制值
ulimit -* ##根据不同参数修改限制值
ulimit -n 131072
ulimit -l 82
sysctl -a |grep net ##查看内核限制
net.core.optmem_max = 20480 #每个套接字所允许的最大缓冲区的大小
net.core.rmem_default = 212992 #网络协议栈默认接收内存
net.core.rmem_max = 212992 #网络协议栈最大接收内存
1.2)
vim /etc/security/limits.conf
varnish - nofile 131072
varnish - melock 8200
##针对varnish用户,不希望针对所有的用户,所以在配置文件中对varnish用户进行配置!
举例学习
有三台虚拟机(A,B,C),A为varnish服务器,BC为后端
varnish服务修改设置后也需要重启
systemctl restart varnish
反向代理
A
打开varnish服务
修改配置文件(/etc/varnish/default.vcl)
backend default {
.host = "172.25.2.201";
.port = "80";
}
B C
安装httpd服务并在index.html写些可区分的内容
eg:server2 server3
curl ip测试
缓存
A
打开varnish服务
修改配置文件(/etc/varnish/default.vcl)
sub vcl_deliver {
if (obj.hits>0){
# 变量的设置(已经定义的变量)
set resp.http.X-Cache = "HIT";
}
else{
set resp.http.X-Cache = "MISS";
}
# 注意:一定要return
return (deliver);
}
注意:每一行语句必须以;结尾,并且字符串必须用双引号!
测试
crul -I ip
curl -I 172.25.0.1/index.html 和curl -I 172.25.0.1 这两个命令所构建的http请求报文是不一样 的
手动清理缓存
varnishadm ban req.url "~" / #清除所有缓存
varnishadm ban req.url "~" /index.html #清除index.html页面缓存
定义不同域名站点的后端服务器
A
打开varnish服务
修改配置文件(/etc/varnish/default.vcl)
backend web1 {
.host = "172.25.2.2";
.port = "80";
}
backend web2 {
.host = "172.25.2.3";
.port = "80";
}
sub vcl_recv {
# 说明:接受客户端的url请求,进行相应的处理,然后进行请求转发
# 说明:从语法的角度-->这里属于perl的正则匹配
# 体现:varnish在安装的过程中,会安装许多perl的模块!
# vcl配置语言参考了C和perl!
if (req.http.host ~"^(www.)?westos.com"){
# (1)修改请求主机的名字-->用户体验好
set req.http.host = "www.westos.com";
# (2)交给后台服务器来处理
set req.backend_hint = web1;
}elsif (req.http.host ~"^bbs.westos.com") {
set req.backend_hint = web2;
}else {
# (3)都不匹配,认为请求的资源主机不存在!
# 405表示请求的方式不对,常见请求的方式有get、post、head、put!
# 404表示服务器响应了,但是服务器没有此资源,客户端的请求错误!
# 503表示服务器不存在,或者存在但没有开启服务!
return (synth(503));
}
}
在真机加解析
/etc/hosts
测试
crul www.westos.com
crul bbs.westos.com
负载均衡
做负载均衡时
对vcl4.0及以上,需要导入一个模块
##注意:导入时此语句必需放在 vcl4.0 下面
import directors from "/usr/lib64/varnish/vmods/libvmod_directors.so";
注意:当负载均衡时有缓存
return (pass);
##避免缓存影响负载均衡实验效果
A
打开varnish服务
修改配置文件(/etc/varnish/default.vcl)
import directors from "/usr/lib64/varnish/vmods/libvmod_directors.so";
# Default backend definition. Set this to point to your content server.
# (1)默认的后端服务器的端口
backend web1 {
.host = "172.25.2.2";
.port = "80";
}
backend web2 {
.host = "172.25.2.3";
.port = "80";
}
sub vcl_init {
# Load Balance-->负载均衡(lb的缩写)
# 注意:directors要从库中正确导入
new lb = directors.round_robin();
# 说明:负载均衡所构成的集群,或者说lb的此套件中的负载均衡的服务器
lb.add_backend(web1);
lb.add_backend(web2);
}
sub vcl_recv {
if (req.http.host ~ "^(www.)?westos.org") {
set req.http.host = "www.westos.org";
set req.backend_hint = lb.backend();
##当访问www.westos.org时,请求转到lb
return (pass); ##测试时可打开此选项,不进行缓存
} elsif (req.http.host ~ "^bbs.westos.org") {
set req.backend_hint = web2;
} else {
return (synth(405));
}
}
测试
crul www.westos.com