Drupal性能优化—通过Varnish提升Drupal性能

Drupal开发中,一个大项目开发完成,客户会提到部署、维护、性能提升等需求。Varnish是一款高性能且开源的反向代理服务器和http加速器。它可以大幅提升web访问速度。作者Poul-Henning Kamp是FreeBSD的内核开发者之一。Varnish采用全新的软件体系架构,和现在的硬件提交配合紧密。在1975年时,储存媒介只有两种:内存与硬盘。但现在计算 机系统的内存除了主存外,还包括了cpu内的L1、L2,甚至有L3快取。硬盘上也有自己的快取装置,因此squid cache自行处理物件替换的架构不可能得知这些情况而做到最佳化,但操作系统可以得知这些情况,所以这部份的工作应该交给操作系统处理,这就是 Varnish cache设计架构。


一、Varnish特点:

  1. 基于内存进行缓存,重启后数据将消失

  2. 利用虚拟内存方式,I/O性能好

  3. 支持设置0~60秒的精确缓存时间

  4. VCL配置管理比较灵活

  5. 32位机器上缓存文件大小最大为2G

  6. 具有强大的管理功能,例如top、stat、admin、list等

  7. 状态机设置巧妙,结构清晰

  8. 利用二叉堆管理缓存文件,可达到积极删除目的

  9. Varnish的稳定性很高。

  10. Varnish访问速度更快,Varnish采用了“Visual Page Cache”技术,所有缓存数据都直接从内存读取。

  11. Varnish可以支持更多的并发连接。

  12. Varnish可以通过管理端口,使用正则表达式批量的清除部分缓存。

  13. squid属于是单进程使用单核CPU,但Varnish是通过fork形式打开多进程来做处理,所以是合理的使用所有核来处理相应的请求。

当然,Varnish也是有缺点的,如下:

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

在varnish使用中如果单个url的请求通过HA/F5(负载均衡)每次请求不同的varnish服务器中,被请求varnish服务器都会被穿透到后端,而且同样的请求会在多台服务器上缓存,也会造成varnish的缓存的资源浪费,也会造成性能下降。


二、配置

安装 Varnish

各个平台的详细安装说明请参考 Varnish 官方文档。因为我使用的是 Debian Wheezy,所以我会遵循 Debian 部分的说明。一旦 Varnish 安装完成,终端中就会输出下面这段话,提示你安装成功了:

[ ok ] Starting HTTP accelerator: varnishd.


Apache 默认监听来自 80 端口的请求。这个端口接收请求,所以为了配合 Varnish 置于 Apache 之前的布局,需要修改端口,让 Varnish 监听 80 端口,同时将 Apache 的端口修改为一个与之不同的值——一般来说是 8080。然后在 Varnish 中配置相关信息,让 Varnish 连通 Apache。

重新配置 Apache

为了修改 Apache 当前的监听端口,需要使用 root 权限打开 /etc/apache2/ports.conf 文件,找到下面这两行:

NameVirtualHost *:80
Listen 80
//修改为:
NameVirtualHost *:8080
Listen 8080
//如果看到了下面这两行,只需要修改 80 为 8080 即可:
NameVirtualHost 127.0.0.1:80
Listen 80
//然后保存该文件并打开默认的虚拟主机文件,该文件应该在 /etc/apache2/sites-available。在这个文件中,找到下面这一行:
<VirtualHost *:80>
<VirtualHost *:8080>
//当然,你也需要修改其他用到的虚拟主机。



配置 Varnish

打开 /etc/default/varnish 文件,将页面滚动到没有注释、以 DAEMON_OPTS 开头的部分。将这一部分编辑如下,使 Varnish 监听 80 端口:


DAEMON_OPTS="-a :80 
-T localhost:1234 
-f /etc/varnish/default.vcl 
-S /etc/varnish/secret
-s malloc,256m"



打开 /etc/varnish/default.vcl 文件,检查默认的后台端口并设置为 8080,用来连通 Apache :


backend default {
  .host = "127.0.0.1";
  .port = "8080";
}


在 root 权限下,使用如下命令重启 Apache 和 Varnish

service apache2 restart
service varnish restart


检查先前的测试页面是否仍然可以连接。如果可以,那么你可能想知道如何测试网站是否已经被缓存到了 Varnish 上。事实上有好几种方式,最简单的是使用 cURL。请在命令行中输入以下命里:


curl http://yoursite.com --head



此时获得响应应该类似于 Via: 1.1 varnish。


你也可以查看由 Varnish 生成的静态资源。在终端中,输入 varnishstat,然后在浏览器中刷新页面,就会看到点击率逐渐增加。如果是由 Varnish 提供的资源,那么会标识为 hit;如果由 Apache 或其他后台提供,标识为 miss。


另一个有用的工具是 varnish-top。首先在命令行中输入 varnishtop -i txurl,然后在浏览器中刷新页面。这个工具将会显示哪些页面是由 Varnish 提供的。


清除缓存


当页面被缓存之后,当你改动 HTML 或者 CSS 文件,并不会立即看到更新的部分。这经常让我出差错。虽然我知道在 Apache 之前有个缓存服务器,但还是经常会犯傻“刚刚我的修改哪去了?”在命令行输入 varnishadm "ban.url ." 即可清除全部的缓存。


你也可以通过 HTTP 控制 Varnish。这方面有很多插件,比如服务于 WordPress 的 Varnish HTTP Purge,可以直接通过管理界面清除缓存。