cdn缓存加速---varnish

2024-03-29 03:58
文章标签 加速 缓存 cdn varnish

本文主要是介绍cdn缓存加速---varnish,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

环境,
server2 172.25.254.2
server3 172.25.254.3
server4 172.25.254.4
server2作varnish服务器

varnish介绍

Varnish是一款开源的、高性能的HTTP加速器和反向代理服务器

最主要的功能就是:通过缓存来实现Web访问加速

Varnish特点是主要基于内存或者是虚拟内存进行缓存,性能好 支持设置精确的缓存时间 VCL配置管理比较灵活 后端服务器的负载均衡和健康检查

varnish安装

www.varnish-cache.org
从官网下载varnish6.3或者6.4 的rpm包
安装时提示需要jemalloc.x86_64 0:3.6.0-1.el7这个包的依赖性,这是一个用来管理内存的软件。

配置文件

他的配置文件是这些
default.vcl 我们将来用于编写vcl语法的
varnish-x86_64.conf 是配置文件
varnish是环境变量信息
在这里插入图片描述
他的启动脚本是 /usr/lib/systemd/system/varnish.service
查看启动脚本:
最大打开文件数:
在这里插入图片描述

查看我们系统中的最大打开文件数

sysctl -a |grep file

在这里插入图片描述
最大打开文件数为97764个,不够我们varnish 使用,我们可以加大内存或者更改 varnish 配置文件。

内存改为2G;
在这里插入图片描述

在这里插入图片描述
开机后发现可打开文件数增大了,满足varnish需求了。

内存锁定,运行varnish时需要折磨多内存:
在这里插入图片描述
大概82M
查看我们系统中的进程限制

ulimit -a 

在这里插入图片描述

可见最大为64M.我们需要进行设定
可并行的任务数:
在这里插入图片描述
没有限制。
默认端口:
在这里插入图片描述
更改为:
在这里插入图片描述

因为我们要用它做一个反向代理,要作缓存,而且用户不知道6081端口,所以用户直接用http访问缓存服务器。
-T 可以让我们使用命令行去管理varnish
保存退出。

然后更改 /etc/security/limits.conf
让系统允许我们的varnish以这样的内存区运行。
在这里插入图片描述
然后我们启动 varnish

启动成功且80端口打开,我们在火湖浏览器访问

在这里插入图片描述
在这里插入图片描述

说明我们的varnish正常的只是没有数据,那我们配置一些数据。

vim /etc/varnish/default.vcl

在这里插入图片描述

这里要注意 backend default 的作用是:
当你访问varnish时,会把你的请求转交给 本地的回环接口, 8080 端口
我们改为:
在这里插入图片描述

,就让在访问varnish时,把请求转交给172.25.254.3这台主机,相当于反向代理,
然后我们在这台主机上安装http 就有80端口了
我们给他创建一个index页面:
在这里插入图片描述

然后重启varnish,刷新firefox:
在这里插入图片描述

我们就看到的是172.25.254.3的内容了,可见请求已经被调度到了 172.25.254.3

ps aux

在这里插入图片描述

可以看到varnish开启了两个进程,一个manager 进程,负责读取进程的各项进程,并监控子进程
一个child进程,这个才是真实的处理用户请求的进程
查看manager进程的信息:

cat /proc/17532/status

在这里插入图片描述

threads = 1 ,可以看出只有一个线程,说明manager进程之监控子进程,没有处理用户请求,这些都由子进程来处理。

cat /proc/17542/status

在这里插入图片描述

threads = 216 ,说明子进程是用于处理的进程。

varnish命令行

varnishadm 可以进入varnish的命令行
在这里插入图片描述

缓存内容

vim /etc/varnish/default.vcl

在里面的deliver 模块进行编辑,内容如下:
在这里插入图片描述

sub vcl_deliver {
if (obj.hits > 0) {
set resp.http.X-Cache = "HIT from westos cache";        #命中缓存返回这句话
}
else {
set resp.http.x-Cache = "MISS from westos cache";		#如果不是,返回这句话
}
return (deliver);

这段代码可以让我们知道是否从缓存中获取, #vcl语法可以从官方文档中获取用法。
重启varnish,

测试:

curl -I 172.25.254.2

在这里插入图片描述

到数第三行可以看出命中了缓存。第一次会miss,因为cdn中也没有数据,第二次访问时就会从缓存中获取。
如果内容有更新时,我们需要更新缓存,这时,我们可以手动清除缓存。

varnishadm ban req.url "~" /                 表示清空所有缓存,/代表所有
varnishadm ban req.url "~" /index.html       表示清空这个页面的缓存,
# 和上面的不同,清理后curl -I 172.25.254.2 不会miss,因为并没有清空全部的缓存。
# curl -I 172.25.254.2/index.html 才会 MISS 。

表示清空我们的缓存,默认的自动晴空缓存的时间为120S。
在这里插入图片描述

看第一行和最后一行,可知已经清空了缓存。

不同域名分配不同后端

当我门的请求过多时,一台后端主机无法应付,这好似我们就可以定义多个后端进行反向代理:
在这里插入图片描述
并设置 sub vcl_recv :

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 = web1;     #www.westos.org 对应 web1
}
elsif (req.http.host ~ "^bbs.westos.org") {          
set req.backend_hint = web2;     #bbs.westos.org 对应 web1
} else {return (synth(405));
}
}
# 不同的主机设置不同的域名

重启varnish,
在物理机上做好本地解析:
在这里插入图片描述
然后在 172.25.254.3 和172.25.254.4 上建立index.html 文件

echo www.westos.com > /var/www/html/index.html          3
echo bbs.wesots.org > /var/www/html/index.html

测试访问:
在这里插入图片描述
可见内容分发给不同的后端成功。

定义负载均衡

cdn作为访问的调度点需要做负载均衡

#可以查看相关手册
man vcl 
man varnishadm
man vmod_directors

我们需要导入 /usr/lib64/varnish/vmods/libvmod_directors.so 模块才能激活负载均衡
在这里插入图片描述

vim /etc/varnish/default.vcl

写到这个位置:
在这里插入图片描述

导入后我们去man vmos_directors查询如何去写配置来激活负载均衡:
在这里插入图片描述

使用round_robin轮巡的负载均衡模式,我们负载均衡器起名为 lb ,更改 后端服务器名称web1 web2
在这里插入图片描述

然后更改 vcl_recv:在这里插入图片描述

就是当我们访问www.westos.com 时 就会轮询的去访问web1 和web2, 当访问 bbs.westos.org 时会访问web2。
重启服务,测试:
在这里插入图片描述
测试的时候访问www.westos.org 却没有轮询访问两台后端,这是为什么那?
因为我们的cdn是缓存,第一次读取后结下来的读取都是从缓存中获取,所以没有轮询访问。
那我们让缓存不生效在试一次:
在这里插入图片描述
加上return这一行表示不缓存,那我们继续测试:

在这里插入图片描述
在这里插入图片描述
每次都是MISS,就代表不从缓存读取。
这次就达到了我们的负载均衡的需求了.

或者我们每次都手动的清理一次缓存:

varnishadm ban req.url "~" /

这样清理缓存对于企业是有门槛的,所以我们可以用图形界面操作。
安装httpd 和php
安装bansys软件:

unzip bansys.zip -d /var/www/html           -d解压到目录,因为我们要发布它

在这里插入图片描述
更改 config.php,定义varnish主机:
在这里插入图片描述
配制成这个样子,因为我们没有作数据库,所以数据库的一些配置我们删除。
更改httpd的端口为8080,因为varnish占用了80端口:

在这里插入图片描述
重启httpd,测试访问:
在这里插入图片描述
可以使用。使用HTTP方式
我们需要设置一个权限,只对特定ip推送:

vim /etc/varnish/default.vcl

在这里插入图片描述在这里插入图片描述

if (req.method == "BAN") {            #判断是否要清除缓存
if (!client.ip ~ westos) {				##如果ip和westos定义的ip不匹配,告知不允许return(synth(405,"Not allowed"));
}
ban("req.url ~ " + req.url);			#否则清楚return (purge);
}

重启服务,
查看我们是否有缓存;
在这里插入图片描述
命中缓存,则有。
我们推送 .* 表示清楚所有缓存。
在这里插入图片描述
然后我们在访问:

在这里插入图片描述
就又变成了MISS 了。
我们还可以推送 index.html,他不影响整体缓存,清空后只有/index.html 是MISS form cache
在这里插入图片描述
现在两个的缓存都存在,
推送:
在这里插入图片描述
然后再次访问:
在这里插入图片描述

只有index.html MISS 了。

总结

从 varnish-book 总结流程:
在这里插入图片描述
各个模块的功能:

vcl_recv :接受用户的请求,并进行查询
vcl_hash:在recv之后被调用,用来请求创建hash值,作用是在varnish中查找key值。
  • hit函数 缓存查找成功时调用的,进入pass模块或者deliver模块
  • pass函数 进入通道模式请求的,不经过缓存,进入pass模块
  • hit-for-pass函数 进入pass模块
  • miss函数 未命中缓存,进入miss模块,在进入后端查询模块(vcl_backend_fetch)
  • purge函数 用于清空缓存
  • pipe函数 在管道模式中使用,进入vcl_pipe 模块,子进程,可以使请求直接传送到后端,通常用于大数据的传输
  • busy函数 在varnish繁忙的时侯 进入waiting模块
vcl_backend_response:接受
vcl_beresp动作:读取请求头,如果缓存没有,进入vcl_backend_error 模块,有就进入response模块,准备响应请求。
cacheabel动作:询问是否缓存数据,因为比如用户的密码是不允许缓存的
vcl_deliver:将数据结果返回给客户端
done:返回给客户端后结束

这篇关于cdn缓存加速---varnish的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/857539

相关文章

缓存雪崩问题

缓存雪崩是缓存中大量key失效后当高并发到来时导致大量请求到数据库,瞬间耗尽数据库资源,导致数据库无法使用。 解决方案: 1、使用锁进行控制 2、对同一类型信息的key设置不同的过期时间 3、缓存预热 1. 什么是缓存雪崩 缓存雪崩是指在短时间内,大量缓存数据同时失效,导致所有请求直接涌向数据库,瞬间增加数据库的负载压力,可能导致数据库性能下降甚至崩溃。这种情况往往发生在缓存中大量 k

速盾高防cdn是怎么解决网站攻击的?

速盾高防CDN是一种基于云计算技术的网络安全解决方案,可以有效地保护网站免受各种网络攻击的威胁。它通过在全球多个节点部署服务器,将网站内容缓存到这些服务器上,并通过智能路由技术将用户的请求引导到最近的服务器上,以提供更快的访问速度和更好的网络性能。 速盾高防CDN主要采用以下几种方式来解决网站攻击: 分布式拒绝服务攻击(DDoS)防护:DDoS攻击是一种常见的网络攻击手段,攻击者通过向目标网

速盾:直播 cdn 服务器带宽?

在当今数字化时代,直播已经成为了一种非常流行的娱乐和商业活动形式。为了确保直播的流畅性和高质量,直播平台通常会使用 CDN(Content Delivery Network,内容分发网络)服务器来分发直播流。而 CDN 服务器的带宽则是影响直播质量的一个重要因素。下面我们就来探讨一下速盾视角下的直播 CDN 服务器带宽问题。 一、直播对带宽的需求 高清视频流 直播通常需要传输高清视频

Redis中使用布隆过滤器解决缓存穿透问题

一、缓存穿透(失效)问题 缓存穿透是指查询一个一定不存在的数据,由于缓存中没有命中,会去数据库中查询,而数据库中也没有该数据,并且每次查询都不会命中缓存,从而每次请求都直接打到了数据库上,这会给数据库带来巨大压力。 二、布隆过滤器原理 布隆过滤器(Bloom Filter)是一种空间效率很高的随机数据结构,它利用多个不同的哈希函数将一个元素映射到一个位数组中的多个位置,并将这些位置的值置

防止缓存击穿、缓存穿透和缓存雪崩

使用Redis缓存防止缓存击穿、缓存穿透和缓存雪崩 在高并发系统中,缓存击穿、缓存穿透和缓存雪崩是三种常见的缓存问题。本文将介绍如何使用Redis、分布式锁和布隆过滤器有效解决这些问题,并且会通过Java代码详细说明实现的思路和原因。 1. 背景 缓存穿透:指的是大量请求缓存中不存在且数据库中也不存在的数据,导致大量请求直接打到数据库上,形成数据库压力。 缓存击穿:指的是某个热点数据在

PHP APC缓存函数使用教程

APC,全称是Alternative PHP Cache,官方翻译叫”可选PHP缓存”。它为我们提供了缓存和优化PHP的中间代码的框架。 APC的缓存分两部分:系统缓存和用户数据缓存。(Linux APC扩展安装) 系统缓存 它是指APC把PHP文件源码的编译结果缓存起来,然后在每次调用时先对比时间标记。如果未过期,则使用缓存的中间代码运行。默认缓存 3600s(一小时)。但是这样仍会浪费大量C

缓存策略使用总结

缓存是提高系统性能的最简单方法之一。相对而言,数据库(or NoSQL数据库)的速度比较慢,而速度却又是致胜的关键。 如果使用得当,缓存可以减少相应时间、减少数据库负载以及节省成本。本文罗列了几种缓存策略,选择正确的一种会有很大的不同。缓存策略取决于数据和数据访问模式。换句话说,数据是如何写和读的。例如: 系统是写多读少的吗?(例如基于时间的日志)数据是否是只写入一次并被读取多次?(例如用户配

PyInstaller问题解决 onnxruntime-gpu 使用GPU和CUDA加速模型推理

前言 在模型推理时,需要使用GPU加速,相关的CUDA和CUDNN安装好后,通过onnxruntime-gpu实现。 直接运行python程序是正常使用GPU的,如果使用PyInstaller将.py文件打包为.exe,发现只能使用CPU推理了。 本文分析这个问题和提供解决方案,供大家参考。 问题分析——找不到ONNX Runtime GPU 动态库 首先直接运行python程序

uniapp小程序下载缓存服务器上的图片

1. 使用uni.downloadFile,但是注意下载图片的地址里的域名,需要在微信公众平台里面的downloadFile合法域名进行配置。 export default function downloadAndCacheImage(imageUrl, name) {return new Promise((resolve, reject) => {console.log("imageUrl",

基于canal的Redis缓存双写

canal地址:alibaba/canal: 阿里巴巴 MySQL binlog 增量订阅&消费组件 (github.com)https://github.com/alibaba/canal 1. 准备 1.1 MySQL 查看主机二进制日志 show master status 查看binlog是否开启 show variables like 'log_bin' 授权