Drupal 缓存技术串讲

有人说Drupal很慢,初始状态下承载不了多少并发,可见其性能之差,但我们又发现许多PR值很高,流量很大的网站也在用Drupal,这又如何解释呢?这是因为真正的大型Drupal站点都做了性能优化,性能优化包括方方面面,既和硬件的配置,架构,用途有关,又和所使用的服务器软件,以及所使用的Web系统有很大关系,所以说性能优化是个系统而长期的工程,做好性能优化,要建立在对大型网站架构的理解和监控上,以及对应用系统和业务逻辑的了解基础之上的,绝对不是像安装一个软件那样简单的事情。

所以,你不能说要彻底解决性能问题,但你可以根据实际情况,采用一些常用的解决方案来让网站的性能得到显著提升。我们常说的80/20理论你肯定知道,那么用20%的努力换取80%的性能提升,何乐而不为呢。

Drupal作为Web开源系统的一种,被称之为CMF(内容管理框架),拥有非常优秀的架构和扩展性,以及海量的第三方模块,现在已经被越来越多的人所熟知和采用。采用Drupal这样主流Web系统的一个好处就是有好多全世界优秀的专家投入到其中,给出各种各样的性能优化方案。我们大多数人作为使用者只要知道如何选择适合自己的优化方案,就能显著提升自己网站的性能。

前面说的都是性能优化,其实本文的重点是缓存技术,在我看来,对Drupal来说,缓存和性能优化基本就是同义词,大多数Drupal的优化技术都是使用各种各样的缓存。缓存有的是静态页面缓存,有的是动态缓存,有的是CSS,Javascript和图片的缓存。有的放在内存里,有的放数据库里,有的放磁盘上,还有的还需要配合一些服务器软件来提供。林林总总,对新手来说很可能就挑花眼了,所以本文想要在缓存这个话题上,给新手一些指引,本人学识有限,不可能面面俱到,希望读者可以批评指正。

核心缓存

作为最基本的优化手段,Drupal对缓存提供了一些基本的支持,比如外部的区块缓存,匿名用户页面缓存,内部还有比如菜单系统缓存,主题钩子注册表缓存等等。

可以说,作为一个不大的Drupal站点,使用核心内置的常规手段,性能就不会太差。多说一句,一般开发阶段是不开启缓存的,但一旦上线,区块缓存和匿名用户静态页面是必须要开的,CSS和JS也一定是要开启合并压缩的。这样一来,对于匿名用户,应该说速度就会比之前快不少。

Boost

Drupal 默认提供的匿名用户缓存是存在数据库里的,这意味着即使是缓存了的网页也要占用数据库连接和内网流量。而如果换成 Boost 模块,你的缓存都直接走静态文件,这不仅仅是不走数据库了,甚至都不经过Drupal了,所以作为页面缓存来讲 Boost 的效果极为出色。

Varnish

这里把 Varnish 模块列出来只是要告诉大家,如果你的服务器仍然有很大的内存,如果在前面使用 Varnish 服务器软件,你可以将静态网页缓存到 Varnish 开辟的内存中,可想而知速度就更快了。而且Varnish还可以帮助你缓存CSS,Javascript等静态文件。

Memcache API and IntegrationMemcache StorageRedis

匿名用户的访问已经那么快了,那如果你的网站有很多活跃的登录用户怎么办呢,之前说的大部分缓存都将失效,这可如何是好呢,对于登录用户来说,最有效的就是使用 Memcache 让许多系统的内部缓存可以从内存中读取,从而得到更好的性能,并且 Memcache 本身还是可以分布式部署的,有很好的延展性。而最后一个 Redis 同样优秀,这里不会比较它们之间的优劣,只是建议你可以先从 Memcache 开始。

Memcache API and IntegrationMemcache Storage,你只需要一个,并且较为推荐后者。

APC - Alternative PHP Cache

另一个能让登录用户感觉到快起来的技术就是 Alternative PHP Cache,也就是APC,他的作用就是让PHP文件不必每次都从磁盘加载,而是可以缓存到内存,并且是缓存的编译中间代码,所以对PHP语言的复杂系统来说优化效果很明显。这可以说是所有PHP网站必装的一个组件,当然他还有其他竞争者,比如eAccelerator, XCache以及最新的Zend Opcache等组件。不过再Zend Opcache组件没出现之前,APC在Linux系统上的表现略强于其他,而新出的Zend Opcache据说可以比APC还强上一些(10%以下),但同样,这里不做比较,只是建议你可以从 APC 开始。这里有一篇文章可以作为你的延伸读物。

另外,如果我们紧紧是使用APC的代码文件Opcode缓存特性,是不需要APC这个模块的,这个模块提供的是存一些额外的数据缓存到APC,这样我们就能够做到一部分不经常改变的cache表放到APC,经常改变的cache表放到Memcache,另外一些大的缓存表则需要放到数据库中。

Entity cache

接下来要做什么呢,因为本文是基于 Drupal 7 的,Drupal 7 引入了 Entity 的概念之后,Drupal中就有了各种类型的 Entity,所以这个模块提供的缓存支持,会让你的登录用户感觉到快了一点点,并且无需配置,且对几乎所有的Drupal站点都生效。

另外,像这种和Drupal内核机制以及常用第三方模块相关的模块在官网还是有不少的。拿Views举例,比如Views Row Cache模块和Views content cache都为Views提供了不同逻辑的缓存机制。我们可以根据实际情况取舍这种类型的模块,毕竟模块装多了也慢。

Authenticated User Page Caching (Authcache)

然后,我们就要说说更理想的登录用户缓存问题了,如果页面是动态生成的,我们再怎么做缓存,性能上也比不过直接缓存成静态页面,那么有办法么? Authcache 模块可以在一定程度上帮到你,但要注意的是,登录用户缓存的情况非常复杂,我们在采用 Authcache 模块之前要想好适不适合自己。

举个例子,如果你做一个SNS网站,你觉得登录用户的页面不够快,如果你开启了 Authcache 模块。你就要想那些页面对用户来说是完全一样的,这样一定可以缓存,哪些页面大部分一样,只有一小部分是根据用户的不同而不同,这种对于Authcache的处理来说就要复杂一些。那么如果是像新鲜事这样的页面,你也要缓存,这对每个用户来说都是不一样的,那就意味着你要缓存页面的数量级是用户ID乘以URL数再乘以角色数,想想这样产生的缓存会占用多大的空间,真的可行吗?。

关于 Authcache 模块说了这么多,就是要提醒大家,选择 Authcache 要非常慎重,不是它不好,而是有可能不适合你。

CDN

页面的打开速度和很多因素有关,其中一个很重要的因素就是CSS和Javascript文件的下载速度。而用户与服务器之间线路的物理距离又会对此产生很大的影响,所以我们需要CDN(内容分发网络)技术的帮助,让用户可以就近访问网站资源文件的缓存版本。CDN不仅让你的网站打开速度变快,由于其还为你的网站分担了流量和连接数,所以你的网站可以支持更大的并发访问了。

CDN模块可以帮你配置,让你的CDN生效,注意一般对CSS和图片使用CDN完全没有问题,但Javascript则要注意,如果所有的Javascript代码都用CDN,可能会产生安全隐患以及用户体验等问题。

Cache Warmer

最后,再说一说缓存重建的问题,既然是缓存,那么最开始的时候是没有的,是随着用户的访问,一点点的生成的,所以用户首次访问的时候,就会觉得网站仍然很慢,假设你的网站页面非常的多,那么就会有很多用户觉得你的网站慢,甚至不再访问第二个页面就流失掉了,所以在每次清缓存之后(实际上Drupal清缓存的频率是很高的,尤其是长期迭代开发和运营的Drupal站点)我们需要为重要入口页面重建缓存,以提高访客的停留时间,降低跳出率。

Cache Warmer就是这样的技术,和爬虫的思路相比,其更有目的性,比如重要的入口页面,网站新增内容,网站热门内容等等。不过使用这一技术要注意量力而行,别在重建缓存的时候自己把自己的网站弄瘫痪了。

小结

总而言之,Drupal的模块极多,所以和缓存相关的模块也是海量的,这里不可能一一提到,也不是每个都那么有用,要根据你项目的实际情况调研和使用。本文按照由浅入深,从易到难的顺序为大家介绍了Drupal网站的各种常用缓存技术,可以让大家对Drupal的缓存技术有一个大致完整的认知,这不仅是对缓存的认知,也是对性能优化的认知。当然性能优化不是那么简单的几句话就能说清楚的。欢迎关注好友的博客:Drupal与高性能网站架构,了解更多性能优化相关的技术。