varnish已被收录进EPEL源,故可直接利用EPEL源进行yum安装
yum install -y varnish
vim /usr/lib/systemd/system/varnish.service
限定该进程的最大句柄数,最大打开文件数
# Maximum number of open files (for ulimit -n)
LimitNOFILE=131072
内存锁定,限制我们可以使用多大内存
# Locked shared memory (for ulimit -l)
# Default log size is 82MB + header
LimitMEMLOCK=82000
满足varnish的131072,就不用改动了,如果小于varnish的最大句柄数,可以将varnish的最大句柄数,调整小一些,达到系统的要求即可
/etc/varnish/varnish.params
这里指定了varnish的配置文件
指定了varnish的默认监听端口
这里要做反向代理实验,我就把端口改成80
varnish是不提供服务的
这里配置一台后端服务器来提供服务
这里是配置好web服务
systemctl start varnish
查看varnish的进程
一个是root开启的,它会用来读取各项配置,监控子进程
一个是varnish开启的,真实处理用户请求的进程
访问varnish服务的地址,就可以看到varnish反向代理的后端服务的页面了
curl -I 192.168.xx.xx(varnish的IP地址)
查看详细信息,可以看到,是通过varnish来读取后端的数据的
这里的Age 表示缓存过期时间,默认120秒,120秒后就会将缓存清空,再次从后端获取新的数据
编辑varnish配置文件
vim /etc/varnish/default.vcl
如果,命中缓存的次数大于0,就返回一句话HIT from cache,
如果不是就返回MISS from cache
obj.hit :某个对象在缓存中命中的次数
然后重启varnish
systemctl restrat varnish
再次curl一下
curl -I 192.168.xx.xxx(varnish的IP地址)
可以看到第一次访问的时候,返回的是MISS from cache,
第一次访问的时候,CDN节点没有所请求的数据的话,需要向后端请求数据,顺便将数据缓存在CDN节点,然后返回给客户端。
当我们再次访问的时候,读取的就是varnish的缓存
命中缓存的次数大于0,就返回一句HIT from cache
清除所有的缓存(慎用)
varnishadm ban req.url "~" /
ban :表示清除
req.url :表示客户端发送给varnish的请求报文中请求的url
/:表示的是,网页默认发布目录里面的所有内容
从第二次开始有变成命中缓存
varnishadm ban req.url "~" /index.html
清除指定缓存后,再访问,Age并没有从0开始,而是持续下去了
说明清除的只是index.html的缓存,并不是全部的缓存
首先准备好两台web服务器
backend web1 {
.host = "192.168.xx.xxx1";
.port = "80";
}
backend web2 {
.host = "192.168.xx.xx2";
.port = "80";
}
sub vcl_recv {
if (req.http.host ~ "^(www.?)web1.com") {
set req.http.host = "www.web1.com";
set req.backend_hint = web1;
}
elsif (req.http.host ~ "^www.web2.com") {
set req.backend_hint = web2;
}
else {
return (synth(405));
}
}
把两台后端服务器的域名都解析到varnish
192.168.xx.xxx www.web1.com www.web2.com
然后varnish通过判断请求的域名,来决定请求的去向
4.0版本以后,定义负载均衡时候,需要导入一个模块
ls /usr/lib64/varnish/vmods/libvmod_directors.so
负载均衡器的名字叫lb
调用的算法是round_robin轮询算法
sub vcl_init {
new lb = directors.round_robin();
lb.add_backend(web1);
lb.add_backend(web2);
}
定义在此处的意义是,当请求www.web1.com这个域名的时候,对后端两台服务器进行轮询访问
访问www.web2.com这个域名的时候,只访问web2这台服务器
sub vcl_recv {
if (req.http.host ~ "^(www.?)web1.com") {
set req.http.host = "www.web1.com";
set req.backend_hint = lb.backend();
}
elsif (req.http.host ~ "^www.web2.com") {
set req.backend_hint = web2;
}
else {
return (synth(405));
}
}
当你重启varnish服务后,会发现访问web1时候,并没有出现轮询的效果,
因为它一直在访问缓存
为了达到测试的效果,此处先让它不缓存
然后重启varnish服务
再次测试,就可以实现轮询访问后端两台服务器了
谷歌开源
下载地址:https://code.google.com/archive/p/varnish-php-bansys/downloads
yum install -y php httpd unzip
解压bansys.zip到Apache的默认发布目录,然后将内容都移到至发布目录
unzip bansys.zip -d /var/www/html/
编辑配置文件
vim config.php
定义主机列表
填写varnish的主机的地址
因为varnish占用了80端口,所以Apache的端口就改成8080
保存退出
修改Apache的端口为8080
vim /etc/httpd/conf/httpd.conf
启动Apache
systemctl start httpd
重启varnish