时间:2022-09-13 09:24:14
摘 要:Drupal是使用PHP语言编写的开源内容管理框架(CMF),它由内容管理系统(CMS)和PHP开发框架(Framework)共同构成。而Varnish是一款优秀的反向服务器,本文就Varnish的基本使用方法配合Drupal网站做出了详细的阐述分析。
关键词:varnish;VCL;grace mode;saint mode
中图分类号:TP311.52 文献标识码:A
1 引言
网站实现以Drupal为框架开发是一个较好的选择,若要实现高负载Varnish是一个不错的选择,通过其部署相关运行环境,才能使得网站运营更加正常高效。
2 Varnish基本结构
/etc/varnish/ 存放varnish VCL配置文件
/etc/sysconfig/varnish 【CentOS】 存放varnish服务器运行的参数
/etc/default/varnish 【Ubuntu】 存放varnish服务器运行的参数
/usr/sbin/varnishd varnish服务器执行文件
/etc/init.d/varnish 运行程序
3 Varnish的相关命令
本文用到了以下几个主要的varnish管理命令[1]。
varnishadm 管理Varnish后端的工具 telnet。
varnishhist 查看Varnish命中的工具 运行可以看到一张柱状描绘图,|表示缓存命中,#表示未命中,横向代表时间。
varnishlog 实时显示varnish的请求日志。
varnishncsa 以Apache标准的格式combined输出日志。
varnishstat 查看状态、参数等。
varnishtop 类似top工具,查看varnish相关进程的资源、运行等状况。
varnishncsa 将Varnish的log以Apache的格式输出,varnishlog以原始方式显示Varnish的日志。
管理varnish以及清除内存等操作虽然可以使用varnishadm,但是本文使用telnet,一个交互的管理界面。
示例: telnet 127.0.0.1 6082之后,输入help会显示所有可用命令。
help [command]
ping [timestamp]
status
start
stop
stats
vcl.load
vcl.inline
vcl.use
vcl.discard
vcl.list
vcl.show
param.show [-l] []
param.set
quit
purge.url
purge.hash
purge [&& ]...
purge.list
重新加载Varnish配置文件
telnet 127.0.0.1 6082
vcl.load newconfig /data/app/varnish/etc/varnish/default.vcl
vcl.use newconfig
注意:varnish 的CLI可能需要认证,最简单的办法就是在varnish启动的时候取掉相应的参数。
4 Varnish的缓存方式
Malloc (malloc) 通过malloc获取内存,简单,速度快。
Mmap file (file) 创建文件缓存。
这是varnish缓存的两种方式,可以在启动的时候通过参数指定。
5 Varnish处理流程
首次请求时过程如下[2]:
recv->hash->miss->fetch->deliver
缓存后再次请求:
recv->hash->hit->deliver;fetch的过程没了,这就是我们要做的,把要缓存的页面保存下来。
直接交给后端pass的情况:
recv->hash->pass->fetch->deliver;直接从后端获取数据后发送给客户端,此时Varnish相当于一个中转站,只负责转发。
6 Varnish负载均衡
通过把多台backends聚合成一个组,这些组被叫做directors。这样可以增强性能和弹力[3]。本文定义多个backends和多个group在同一个directors。
backend server1 {
.host = "192.168.0.1" ;
.port = "8080" ;
}
backend server2 {
.host = "192.168.0.2" ;
.port = "8080" ;
}
director drupal001 round-robin {
{ .backend = server1; }
{ .backend = server2; }
}
sub vcl_recv {
if (req.http.host !~ "www\.drupal001\.com$"){
error 404 "Unknown HostName!";
}
set req.backend = drupal001;
}
在之前的两个后端服务器上加上健康检查。
backend server1 {
.host = "192.168.0.1" ;
.port = "8000" ;
.probe = {
.url = "/"; #哪个 url需要varnish请求。
.interval = 5s; #检查的间隔时间。
.timeout = 1 s; #等待多长时间探针超时。
.window = 5; #维持5个sliding window的结果。
.threshold = 3; #至少有三次window是成功的,就宣告bachend健康。
}
}
7 VCL以及基本对象
request 从客户端进来。
responses 从后端服务器过来。
object 存储在cache中。
8 VCL使用语言
req 请求目标,当varnish接收到一个请求,这时req object就被创建了,你在vcl_recv中的大部分工作,都是在req object上展开的。
beresp 后端服务器返回的目标,它包含返回的头信息,你在vcl_fetch中的大部分工作都是在beresp object上开展的。
obj 被cache的目标,只读的目标被保存于内存中,obj.ttl的值可修改,其他的只能读[4]。
9 Grace mode
如果后端需要很长时间来生成一个对象,这里有一个线程堆积的风险。为了避免这种情况使用Grace。当同时有多个请求过来的时候,varnish只发送一个请求到后端服务器,在“set beresp.grace = 30m; ”时间内复制旧的请求结果给客户端。
10 Saint mode
需要通知varnish使用更加优雅的方式处理它,这种方式叫神圣模式(saint mode)。Saint mode允许抛弃一个后端服务器或者另一个尝试的后端服务器或者cache中服务陈旧的内容。
sub vcl_fetch {
if (beresp.status == 500) {
set beresp.saintmode = 10s;
restart;
}
set beresp.grace = 5m;
}
Varnish
########
backend default {
.host = "192.168.0.12";
.port = "8080";
}
#现在添加一个新的backend服务器
backend test {
.host = "192.168.0.12";
.port = "8000";
}
#要定义特殊的url被发送到哪里
sub vcl_recv {
if (req.url ~ "^/abcd/") {
set req.backend = test;
} else {
set req.backend = default;
}
}
11 注意事项
(1) Varnish的不同版本的配置不同。
比如,在2.x 直接用ESI表示启用ESI,在3.x就不是了。
(2) Varnish 2.x有Cookie的问题,当Cookie过大,会产生503错误,升级varnish或者减少set_cookie的操作。
(3) 启动varnishd的时候如果选用-s file方式,每次会重新建立缓存文件,而原来的文件不会删除,因此注意清除这些遗留文件。
12 总结
至此,通过Varnish基本的布置,配合Drupal模块模式不难构建出一个高性能的网站。
参考文献
[1] 彭辉.Varnish的研究与实现[J].计算机光盘与软件,2012,2(3):22-23.
[2] 杨志成.基于Drupal协议的研究与实现[J].计算机工程与应用,2013,1(4):15-16.
[3] 吴伟易.Varnish关键技术的研究以及网站的实现[J].电脑知识与技术,2012,4(2):26-27.
[4] 林建胜.Drupal网站模式的研究与实现[J].计算机软件与发展.2012,3(2):34-36.
作者简介:
陈 浩(1979-),男,硕士,讲师,实验师.研究领域:计算机网络技术的研究与应用.