varnish的简单使用

varnish的简单使用

安装

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

通过命令查看到,当前的最大文件数为182462

满足varnish的131072,就不用改动了,如果小于varnish的最大句柄数,可以将varnish的最大句柄数,调整小一些,达到系统的要求即可

ulimit -l

查看可以锁定的物理内存的最大值为64M

将这里改成64000


配置环境信息文件

/etc/varnish/varnish.params

这里指定了varnish的配置文件

指定了varnish的默认监听端口

这里要做反向代理实验,我就把端口改成80


配置varnish反向代理

varnish是不提供服务的

这里配置一台后端服务器来提供服务

这里是配置好web服务

配置varnish

vim /etc/varnish/default.vcl

启动varnish

systemctl start varnish

查看varnish的进程

一个是root开启的,它会用来读取各项配置,监控子进程

一个是varnish开启的,真实处理用户请求的进程

访问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

/:表示的是,网页默认发布目录里面的所有内容

清除完后,再次访问,就返回MISS

从第二次开始有变成命中缓存


清除指定的缓存

varnishadm ban req.url "~" /index.html

清除指定缓存后,再访问,Age并没有从0开始,而是持续下去了

访问指定的页面时候,Age才会从0开始

说明清除的只是index.html的缓存,并不是全部的缓存


varnish配置多后端

首先准备好两台web服务器

配置多后端

vim /etc/varnish/default.vcl

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

在varnish的配置文件中这个位置导入模块

定义负载均衡调度器

负载均衡器的名字叫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服务

再次测试,就可以实现轮询访问后端两台服务器了

一直访web2,它并不会发生变化


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配置文件,定义权限控制

vcl_recv中加入以下配置

重启varnish

systemctl restart varnish

相关推荐
wclass-zhengge10 小时前
Redis篇(最佳实践)(持续更新迭代)
redis·缓存·bootstrap
Dylanioucn10 小时前
【分布式微服务云原生】探索Redis:数据结构的艺术与科学
数据结构·redis·分布式·缓存·中间件
小小娥子1 天前
Redis的基础认识与在ubuntu上的安装教程
java·数据库·redis·缓存
DieSnowK1 天前
[Redis][集群][下]详细讲解
数据库·redis·分布式·缓存·集群·高可用·新手向
PYSpring1 天前
数据结构-LRU缓存(C语言实现)
c语言·数据结构·缓存
CoderJia程序员甲1 天前
重学SpringBoot3-集成Redis(一)
java·redis·缓存·springboot
周周写不完的代码1 天前
redis-数据类型
数据库·redis·缓存
Tonvia1 天前
猫猫cpu的缓存(NW)
算法·缓存
白总Server1 天前
CNN+Transformer在自然语言处理中的具体应用
人工智能·神经网络·缓存·自然语言处理·rust·cnn·transformer
周周写不完的代码2 天前
Redis-持久化机制
数据库·redis·缓存