通过 Varnish 使 WordPress 静态化

WordPress 常常被人诟病说加载速度慢,主要原因是每一次打开页面都会查询数据库,即使每次查询的结果都是一样的。WordPress 原生不支持缓存,但可以通过插件支持,比如 Super Cache。我用过一段时间 Super Cache,它本身是一个很好的插件,但协作性不强。它只能加载 WordPress 原生的内容,而我需要的是缓存经过 PageSpeed 优化过的内容,从而达到完全静态化的效果。

曾经有一段时间 KeyCDN 的表现不理想,而 Google CDN 还没有开放,我就自己搭了几台缓存服务器,来缓解源站的压力。这几台缓存服务器是通过 Varnish 实现的。当然用 Nginx 也可以,但是 Nginx 的缓存失效(Purge)功能是收费的,而且部分平台上还是自己编译。于是我选了 Varnish。

Varnish 可以做到的事情

  • 根据 URL(或其它参数)的不同来选择不同的缓存策略;
  • 修改 HTTP 请求和响应的头部内容;
  • 设定缓存时间,时间到了自动失效;
  • 可以通过一个特殊的 HTTP 请求来让一个(或一些)缓存立即失效;

好,接下来就开始配置服务器了。

安装 Varnish

以 Debian 为例,最新的 Varnish 版本是 4.0:

配置 Varnish

先创建一个新的配置文件,比如 /etc/varnish/leonax.vcl,内容如下。其中比较重要的就是三部分:vcl_recv、vcl_hash、vcl_backend_response,可以根据自己的实际情况来调整。必要的注释已经附在相应的代码旁边了。

然后来检查一下配置文件写得对不对。如果配置正确,这段命令会输出一大段处理过的代码;如果有问题,则会输出具体的错误信息。

接着,在 /etc/varnish/default.vcl 文件中,可以找到如下一段内容:

需要把 -f 的值修改为刚才创建的配置文件地址。

重启 Varnish

配置 WordPress

WordPress 的页面需要刷新的情况,无非有三种:新文章、新评论和配置修改。配置的更改一般频繁,我的做法是重新配置之后,手动重启一遍 Varnish,这样最干净。而新评论的情况,刚才在 Varnish 的配置文件中已经处理了。于是我们现在来处理一下新文章的情况。

以下代码需要写在 WordPress 中,比如 functions.php:

收工

做完以上这些,你的站点就可以达到像本站一些的加载速度啦。


17 条评论 添加

      1. 简单来说, 就是运行在 Apache 上的 wordpress, 如果使用 Varnish, 需要在服务器端做什么样的部署.
        我查了一下 DigitalOcean 的教程, 结果它只教安装, 没有任何的设置说明.
        大概想了解的话就是 Varnish 的基本配置和轻度的进阶说明.

        1. 在一台机器上配置的主机问题是 Varnish 和 Apache 不能使用同一个端口,比如 Varnish 用了 80 端口,Apache 就要用别的比如 8080。然后两个分开配置即可,Apache 可以看这个

      1. 仍然还是报错。。
        * Checking syntax varnishd [fail]
        Error:
        Message from VCC-compiler:
        Expected ',' got ')'
        (program line 473), at
        ('/etc/varnish/default.vcl' Line 88 Pos 88)
        ban("req.url == " + regsub(beresp.http.Location, "^http(s)?://example\.com(/.*/)$"))
        ---------------------------------------------------------------------------------------#-

  1. WordPress 真是慢的一逼,当初建站时就知道,不过处于可扩展性考虑,还是选择的 WP。
    数据量大了,流量起来了后,就不行了,我的站 http://www.888meinv.com 前几天访问量大,CPU天天 100%。。
    一看进程我擦,全是 php-fpm 禁用掉不必要的 WP 插件下去了一些,但一样很高,
    然后我对数据库做了分区表和索引调整,又下降一些,不会时常顶到 100% 了。但还是觉得速度有点慢,最后升级了下内存和 CPU,响应速度立马缩短到 1.5s,还是升级硬件效果最好 哈哈哈。

    打算再上 varnish,不过这要替换前端服务器,而且网上目前找到的都是前台全部缓存,并没有考虑到前台也登录的情况下不能走缓存,还得研究下。

    不过,话说回来,已经有 w3 cache 插件做页面缓存了,缓存效果还是不错的,生成缓存页面的时候,是会慢一些,这点 varnish 基于内存肯定快,不过页面多啊,几个 G 的页面,访问到的都是长尾词页面,缓存命中率估计也不高,varnish 对于这种情况效果如何,就有待测试了。

  2. 我是这么看的,不对之处请指出,

    w3 的 page cache 肯定还是要开启的,w3 其实可以配置 page cache 是存到 disk 还是 redis,memcached,不过我页面多,估计效果不理想太耗内存,而且我的磁盘是 SSD 的,所以选 disk 应该还可以的,我觉得瓶颈在于即使页面已经 disk cached,但是每次请求过来,还是要走一遍 WordPress 然后再到 w3 然后再读取再 response,于是这就慢了一些,倒是可以写个 nginx 配置,判断未登录,且这个请求的 disk 缓存存在,就返回,这样在 nginx 端就好了。

    另外 varnish 不支持 https 要反代 ???

发表评论

电子邮件地址不会被公开。 必填项已用*标注