基于Varnish的高负载Drupal网站研究

时间:2022-09-13 09:24:14

基于Varnish的高负载Drupal网站研究

摘 要: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-),男,硕士,讲师,实验师.研究领域:计算机网络技术的研究与应用.

上一篇:农业工业化发展制度保障研究领域的新力作 下一篇:三网融合背景下媒体融合发展给广告市场带来的...