Linux之varnish代理的原理及部署

本文介绍了Varnish,一个高性能的开源缓存服务器,与Squid的对比,强调了Varnish的高速度和并发优势。详细讲解了Varnish的配置工具VCL,并展示了Varnish的部署步骤,包括设置虚拟机、调整系统参数、安装软件。此外,还探讨了Varnish的缓存命中情况、负载均衡(轮询)以及如何实现CDN推送,提供了具体的服务器配置和测试过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、varnish

1. varnish的简介

Varnish是一款高性能、开源的反向代理服务器和缓存服务器。Varnish使用内存缓存文件来减少响应时间和网络带宽消耗。挪威最大的在线报纸Verdens Gang使用3台Varnish代替了原来的12台squid,性能比以前更好。由于Varnish可以通过端口进行管理,使用正则语句做到清除指定缓存的功能,这些squid都做不到。但是varnish在高并发的情况下,资源消耗较高,而且varnish服务进程一旦崩溃,重启,内存中的缓存数据将全部丢失。Varnish与一般服务器软件类似,就是一个web缓存代理服务器,分为master(management)进程和child(woker,主要做cache的工作)进程。master进程读入命令,进行一些初始化,然后fork并监控child进程。child进程分配若干线程 进行工作,主要包括一些管理线程和很多woker线程

2. varnish与squid的区别

(1)相同点

  • 都是一个反向代理服务器
  • 都是开源软件

(2)不同点

  • varnish的稳定性很高,两者在完成相同负荷的工作时,Squid服务器发生故障的机率高于Varnish,因为使用Squid要经常重启。
  • Varnish的访问速度更快,所有缓存数据可以直接从内存读取,而squid是从硬盘读取
  • Varnish可以支持更多的并发连接,因为Varnish的TCP连接释放要比Squid快。
  • Varnish可以通过管理端口,使用正则表达式批量的清除部分缓存,而Squid是做不到的。
  • squid属于是单进程使用单核CPU,但Varnish是通过fork形式打开多进程来做处理,所以是合理的使用所有核来处理相应的请求。
  • varnish进程一旦Hang、Crash或者重启,缓存数据都会从内存中完全释放,此时所有请求都会发送到后端服务器,在高并发情况下,会给后端服务器造成很大压力。
  • 在varnish使用中如果单个url的请求通过HA/F5(负载均衡)每次请求不同的varnish服务器中,被请求varnish服务器都会被穿透到后端,而且同样的请求会在多台服务器上缓存,也会造成varnish的缓存的资源浪费,也会造成性能下降。

3. varnish中的配置缓存策略工具vcl

Varnish Configuration Language(VCL)是varnish配置缓存策略的工具,它是一种基于“域”的简单变成语言,它支持有限的算术运算和逻辑运算操作、允许使用正则表达是进行字符串匹配、允许用户使用set自定义变量、支持if判断语句,也有内置的函数和变量等。使用VCL编写的缓存策略通常保存至.vcl文件中,其需要编译成二进制的格式后才能由varnish调用

vcl处理过程:

(1)Receive 状态,也就是请求处理的入口状态,根据 VCL 规则判断该请求应该是 Pass 或Pipe,或者进入 Lookup(本地查询)。
(2)Lookup 状态,进入此状态后,会在 hash 表中查找数据,若找到,则进入 Hit 状态,否则进入 miss 状态。
(3)Pass 状态,在此状态下,会进入后端请求,即进入 fetch 状态。
(4)Fetch 状态,在 Fetch 状态下,对请求进行后端的获取,发送请求,获得数据,并进行本地的存储。
(5)Deliver 状态, 将获取到的数据发送给客户端,然后完成本次请求。

准备工作:

(1)虚拟机准备

  • 后端服务器server2(安装httpd)----> 172.25.65.2
  • 后端服务器server3(安装httpd)----> 172.25.65.3
  • 代理机server1(安装varnish)----> 172.25.65.1
  • 测试机

(2)安装相关软件

server1:

yum install varnish-4.0.5-1.el7.x86_64.rpm  jemalloc-3.6.0-1.el7.x86_64.rpm varnish-libs-4.0.5-1.el7.x86_64.rpm -y

二、varnish的部署

server1中操作

1. 修改varnish系统参数

可以通过【vim /usr/lib/systemd/system/varnish.service】命令,查看最大打开文件数和最大锁存容量

vim /etc/security/limits.conf
varnish         -       nofile          131072
varnish         -       memlock         82000
# - 表示软硬件类型 
# nofile表示最大打开文件数
# memlock最大锁存容量   

sysctl -a | grep file    #查看最大打开文件数
ulimit -n

通过以上命令可以查看最大打开文件数,可以与系统中允许打开的文件数对比,我们会发现真实打开文件的数量远远小与系统允许的,我们可以将内存(memeroy)大小调大,可以打开的文件数也会随之增大

2.  修改配置文件

vim /etc/varnish/varnish.params
VARNISH_LISTEN_PORT=80
systemctl start varnish

vim /etc/varnish/default.vcl
backend default {
    .host = "172.25.65.2";
    .port = "80";
}

server2中的操作

安装http,在默认发布目录下写入内容

yum install -y httpd
systemctl start httpd
vim /var/www/html/index.html
www.westos.org
systemctl restart httpd

测试机进行测试

curl 172.25.65.1

测试的该主机ip,看到的内容是server2中的内容

三、varnish的缓存命中情况

在上一个实验的基础上进行操作

server1

在server1中设置查看缓存命中情况的参数

vim /etc/varnish/default.conf
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);
}
systemctl restart varnish

测试机进行测试

curl -I 172.25.65.1
curl -I 172.25.65.1/index.html    #查看指定页面

 MISS表示未命中(在后端服务器中,需要代理服务器请求),HIT表示命中(代理服务器中有该页面),一般代理服务器会缓存页面120s,120s会自动清理。

清理代理服务器中的缓存server1

varnishadm ban req.url "~" /    #清除所有
varnishadm ban req.url "~" /index.html

清除缓存之后,HIT会变为MISS

四、负载均衡(轮询)+ 多台后端服务器

在之前实验的基础上进行操作

server2后端服务器之前已设置,现在开始设置servr3后端服务器

server3

yum install httpd
vim /var/www/html/index.html
bbs.westos.org
systemctl restart httpd

server1

vim /etc/varnish/default.vcl
import directors from "/usr/lib64/varnish/vmods/libvmod_directors.so";
backend web1 {
    .host = "172.25.65.2";
    .port = "80";
}
backend web2 {
    .host = "172.25.65.3";
    .port = "80";
}
sub vcl_init {
    new lb = directors.round_robin();
    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();    #负载均衡器
        return (pass);
     } elsif (req.http.host ~ "^bbs.westos.org") {
        set req.backend_hint = web2;
     } else {
        return (synth(405));
     }
}

测试机测试

vim /etc/hosts
172.25.65.1     server1 www.westos.org bbs.westos.org
curl www.westos.org     #负载均衡,每次访问的对象可能不一样
curl bbs.westos.org

五、cdn推送

server3

下载httpd,在server3中添加虚拟主机

vim /etc/httpd/conf.d/vhost.conf
<VirtualHost *:80>
        DocumentRoot /www
        ServerName www.westos.org
</VirtualHost>
<Directory "/www">
        Require all granted
</Directory>
<VirtualHost *:80>
        DocumentRoot /bbs
        ServerName bbs.westos.org
</VirtualHost>
<Directory "/bbs">
        Require all granted
</Directory>

mkdir /bbs /www

创建虚拟主机默认访问的发布目录,在目录写入默认发布文件

server1

下载cdn推送软件,进行cdn推送设置

yum install -y unzip php httpd
unzip bansys.zip -d /var/www/html
vim /var/www/html/config.php
<?php
 $var_group1 = array(
                        'host' => array('172.25.65.1'),
                                                'port' => '8080',
                    );
 $VAR_CLUSTER = array(
                         'www.westos.org' => $var_group1,
                     );
 $VAR_VERSION = "3";
?>

修改server1中的httpd端口为8080,避免与后端服务器冲突

vim /etc/httpd/conf/httpd.conf
Listen 8080
systemctl restart httpd

修改varnish默认配置文件,添加允许列表

acl westos {
"127.0.0.1";
"172.25.65.0"/24;
}
#注释掉return(pass);
if (req.method == "BAN") {
if(!client.ip ~ westos) {
return (synth(405,"Not allowed."));
}
ban("req.url ~" + req.url);
return(purge);
}

 

测试机测试

curl -I www.westos.org
curl -I www.westos.org/index.html

使用浏览器打开http://172.25.65.1:8080网页,可以看到推送页面

选择HTTP模式,在推送内容中可以写【.*】清除所有内容和【/index.html】清除指定页面,其他页面不受影响

在命令行进行测试,观察访问结果是否由HIT变为MISS

结果如下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值