linux进阶之旅(一)& varnish

本文介绍Varnish缓存服务器的安装配置与高级应用,包括与Squid的对比、缓存机制详解及负载均衡策略。通过实战案例演示如何搭建高性能反向代理服务器。

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

之前我们介绍过squid服务器,这里我们再讲一个更高性能的服务器:varnish

简介

Varnish是一款高性能且开源的反向代理服务器和http加速器。与传统的Squid相比,Varnish具有性能更高、速度更快、管理更方便等诸多优点。Varnish采用全新的软件体系架构,和现在的硬件提交配合紧密。

Varnish 的创造者Poul-Henning Kamp是FreeBSD的内核开发者之一,他认为现在的计算机比起1975年已经复杂许多。在1975年时,储存媒介只有两种:内存与硬盘。但现在计算机系统的内存除了主存外,还包括了CPU内的L1、L2,甚至有L3快取。硬盘上也有自己的快取装置,因此Squid Cache自行处理物件替换的架构不可能得知这些情况而做到最佳化,但操作系统可以得知这些情况,所以这部份的工作应该交给操作系统处理,这就是 Varnish cache设计架构。

VCL 处理流程图

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

Varnish与Squid的对比

相同点:

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

Varnish的优点:

  • Varnish的稳定性很高。
  • Varnish访问速度更快,所有缓存数据都直接从内存读取,而squid是从硬盘读取,因而Varnish在访问速度方面会更快。
  • Varnish可以支持更多的并发连接。
  • Varnish可以通过管理端口,使用正则表达式批量的清除部分缓存,而Squid是做不到的。
  • squid属于是单进程使用单核CPU,但Varnish是通过fork形式打开多进程来做处理,所以是合理的使用所有核来处理相应的请求。

Varnish的缺点:

varnish进程一旦挂起、崩溃或者重启,缓存数据都会从内存中完全释放,此时所有请求都会发送到后端服务器,在高并发情况下,会给后端服务器造成很大压力。


varnish 服务配置

一、基础环境配置

1,封装虚拟机,配置三台

两台作为后端服务器 server2 : 172.25.77.2 , server3 : 172.25.77.3
一台作为varnish缓存服务器 server1 : 172.25.77.1
主机为客户端clients : 172.25.77.250

注 : 操作系统为 rhel6.5

2,配置varnish服务器(server1)

1).安装varnish

yum install varnish-3.0.5-1.el6.x86_64.rpm varnish-libs-3.0.5-1.el6.x86_64.rpm -y

2).配置

配置一个后端服务器 配置文件 : /etc/varnish/default.vcl

//文件中本身除了此处全部是注释掉的

在文件中 添加设置使可以查看缓存命中情况:

# vim /etc/varnish/default.vcl  
##添加文本
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);

配置 varnish 服务端口 配置文件 : /etc/sysconfig/varnish

...
 7 # Maximum number of open files (for ulimit -n)
 8 NFILES=65535
注 :
    1)NFILES = xxx 要修该的话,需要查看操作系统和内核限制,其中内核限制 > 操作系统限制 ,每个限制都相关,所以都需要修改
    2)生产环境中,如果出现系统显示处理文件处理不过来的现象,多半就是这个问题

 9 
10 # Locked shared memory (for ulimit -l)
11 # Default log size is 82MB + header
12 MEMLOCK=64000
13 
14 # Maximum number of threads (for ulimit -u)
15 NPROCS="unlimited"   ##无限制线程程实际上是1024,这是默认的上限

主要的更改 : 
66 VARNISH_LISTEN_PORT=80  ##将监听端口修改为80,这是apache的默认端口

95 VARNISH_TTL=120  ##TTL 值是缓存时间,也相当于为服务器提供保护

3) .开启varnish

两种开启的方法:
/etc/init.d/varnish start "开启" | reload "重新读取"

service varnish start / reload
3 ,配置后端的httpd服务
server2 (172.25.77.2)

编辑apache主页面 /var/www/html/index.html

<title>server2</title>
<h1> www.westos.org </h1>

重启apache服务 : /etc/init.d/httpd restart

server3 (172.25.77.3)

编辑apache主页面 /var/www/html/index.html

<title> server3 </title>
<h1> www.westos.org </h1>

另外发布一个页面 /bbs/index.html

<title> sever3 </h1>
<h1> bbs.westos.org </h1>

因为发布两个页面,所以需要开启虚拟主机 在rhel6.5版本中,虚拟主机的配置都综合在主配置文件
/etc/httpd/conf/httpd.conf

...
 990 NameVirtualHost *:80   ##开启虚拟主机,使用的端口为80

1010 <VirtualHost *:80>     ##编辑第一个主页面 www.westos.org
1011     DocumentRoot /var/www/html
1012     ServerName www.westos.org
1013 </VirtualHost>
1014 <VirtualHost *:80>     ##编辑第二个页面 bbs.westos.org
1015     DocumentRoot /bbs
1016     ServerName bbs.westos.org
1017 </VirtualHost>

重启apache服务生效: /etc/init.d/httpd restart

4,测试

在客户端测试,编辑本地的解析文件 /etc/hosts

命中测试:

//其中的Age 为TTL值,,第一次因为没有缓存所以未命中,第二次就成功命中了,同时也在读取TTL值


二、varnish更多功能

通过 varnishadm 手动清除缓存

varnishadm ban.url .*$           //清除所有'

varnishadm ban.url /index.html    //清除 index.html 页面缓存

varnishadm ban.url /admin/$      //清除 admin 目录缓存
1、定义多个不同域名站点的后端服务器
backend server2 {
.host = "172.25.77.2";
.port = "80";
}
backend server3 {
.host = "172.25.77.3";
.port = "80";
}
2、当访问 www.westos.org 域名时从 server2 上取数据,访问 bbs.westos.org 域名时到 web3 取数据,访问其他页面报错。
sub vcl_recv {
    if (req.http.host ~ "^(www.)?westos.org") {
    set req.http.host = "www.westos.org";
    set req.backend = server2;
} elsif (req.http.host ~ "^bbs.westos.org") {
    set req.backend = server3;
    } else { error 404 "westos cache"; }
}
这个设置之后,在curl命中直接加ip就显示不了了

# service varnish reload    重新读取配置生效


//搜索ip无法显示


//active 中为0显示为正确

3、定义负载均衡
  • 定义健康检查:
probe healthcheck {
.url = "/index.html"; # 哪个 url 需要 varnish 请求
.interval = 5s; #检查的间隔时间
.timeout = 1s; #等待多长时间探针超时
.window = 5; #维持 5 个 sliding window 的结果
.threshold = 3; #至少有三次 window 是成功的,就宣告 bachend 健康
}
  • 把多个后端聚合为一个组,并检测后端健康状况:
director westos round-robin {   //round-robin : 轮询机制'
    { .backend = server2; }
    { .backend = server3; }
}

sub vcl_recv {
if (req.http.host ~ "^(www.)?westos.org") {
    set req.http.host = "www.westos.org";
    set req.backend = westos;   //实现lb套件
    return (pass);      //为了测试方便,不进行缓存。
} elsif (req.http.host ~ "^bbs.westos.org") {
    set req.backend = server3;
    } else {
        error 404 "westos cache";
        }
}

# service varnish reload

这里 return(pass) 和在注配置文件中设置 TTL = 0 效果效果相同,但是意义却不一样。
TTL设置的是dns缓存,如果设置为 0 , 那么这个varnish缓存服务器的存在也没有必要了,将 return(pass) 添加的意义是临时为了实验效果,真实环境不会使用。
真实环境会将TTL 设置为长时间,然后需要时再单独清空缓存。


三、varnish cdn 推送平台

1、开启apache服务,设置httpd服务监听端口为8080


//因为vanish占用的是80端口,所以需要重新改变端口,不然服务也起不来

2、需要安装 php 支持
yum install unzip -y

unzip bansys.zip -d /var/www/html/#解压到指定目录

yum install php -y
3、配置服务

vim /var/www/html/bansys/config.php ##只保留如下设置,其余注释掉

4、bansys 有两种工作模式,分别是:telnet 和 http 模式

telnet 模式需要关闭 varnish 服务管理端口的验证,注释掉/etc/sysconfig/varnish 文件中的 “ -S $ {VARNISH_SECRET_FILE}”这行,重启 varnish 服务即可。

如果是 http 模式需要对 varnish 做以下设置:

# vi /etc/varnish/default.vcl
#设置acl访问控制
acl list {  ##注意list名称不要和之前定义的名称重叠,不然会出错
"172.25.77.1";
"172.25.77.0"/24;
}


sub vcl_recv {  ##这个函数值之前定义过,加在里面就好
if (req.request == "BAN") {
    if (!client.ip ~ list) { error 405 "Not allowed."; }
    ban("req.url ~ " + req.url);
    error 200 "ban added";
}
}
# service varnish reload    重新读取varnish配置生效
5、测试

原始访问的界面是server3:

网页访问 网址 : 172.25.77.1:8080

//实现点对点的刷新指定界面


//点击确认提交成功

刷新界面:

//因为设置了轮询机制,所以是刷新成功了


tips:

  • 在真实生产环境中,可能设置的缓存时间为一个月甚至更久,这里就需要推送平台了,因为如果用varnish刷新的命令,需要管理员的权限,这显然是非常不安全的,用平台就可以避免这个问题,另外还可以对指定的界面进行刷新,非常的实用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值