WordPress + Memcached 部署以及一些关于缓存的看法

一直努力提高自己在 Linode VPS 上的 WordPress 网站的性能,所以缓存技术便是少不了要考虑的。最近帮朋友配置服务器,又恰好有网友留言提到 memcached 之类的缓存方法,于是查阅了一些网络上的文章希望了解和试用一下。做了不少记录,可惜因为大意以及 Windows 10 的莫名其妙的问题而丢失了那些记录。下面是凭记忆做的一些记录。

这里不准备添加很多引用来源,实在没心思重新查阅和编辑一遍了。只是把重要的一点操作以及个人看法记录下来方便以后有时间有机会再来回顾。

安装及部署 memcached

如果网站采用的是类似水景一页的基于 CentOS 7 的 LAMP 上运行 WordPress,部署 memcached 还是非常简单的。这里有比较详细的介绍。

  1. memcached 服务器:指的是提供缓存服务的守护进程,对于动态网络应用来说,包括动态网站,可以通过在内存中缓存对象来减少数据库的负载。
  2. php-pecl-memcache:这是一个 PHP 扩展,提供方便的面向对象和程序化接口来与 memcached 协同工作。
  3. php-pecl-memcached:另一个 PHP 扩展,与上面一个类似。
  4. WordPress memcached object cache 插件:该插件为 WordPress 对象缓存提供了一个后端支持。这个插件虽然有不少年头没更新了,但是并没有什么问题。

下面是安装记录。

memcached

首先需要 EPEL 安装源。如果没有安装 EPEL 源,可以按照这里的提示进行安装使用。

然后就可以直接 yum 安装 memcached 了,

# yum -y install memcached

修改 memcached 服务器配置参数,

# vi /etc/sysconfig/memcached

一般如下配置即可,

PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="64"
OPTIONS="-l 127.0.0.1"

参数含义,

  • PORT: 监听的 TCP 端口号为 11211,这是默认值。如非必要,不用修改。
  • USER: 使用 memcached 用户来运行 memcached 服务。
  • MAXCONN: 最大同时连接数,默认为 1024。
  • CACHESIZE: 最大使用的内存数。默认是 64MB。注意单位是 MB(兆字节)。
  • OPTIONS=”-l 127.0.0.1″: 监听的网络地址 127.0.0.1。这个地址的变数比较多。如果是单台服务器,用 127.0.0.1 没问题;如果是多台服务器,就用内网地址,比如 10.10.1.2;如果要通过互联网连接,当然就得用公网 IP 了。放在内网的好处是可以避免网络攻击该 memcached 服务器。

启用该服务,运行并设置为系统服务(开机自动启动)

systemctl start memcached && systemctl enable memcached

查看 memcached 的效果可以使用 memcached-tool。如,

# memcached-tool 127.0.0.1:11211 stats
# memcached-tool 127.0.0.1:11211 display
# memcached-tool 127.0.0.1:11211 dump

PHP 扩展

PHP 扩展也少不了。对于 WP 的 memcached object cache 插件来说,有 php-pecl-memcache 就可以了。但是对于 W3 Total Cache 插件来说,同时还需要 php-pecl-memcached。所以视需要修改下面的命令行,

# yum -y install php-pecl-memcached php-pecl-memcache

然后重启 Apache 服务器即可生效,

systemctl restart httpd

WordPress 插件

假设使用最简单有效的 Memcached Object Cache,安装很简单。到这里下载插件后解压,修改其中的 object-cache.php 文件,将 memcached 服务器及端口填入即可,如下,

$buckets = array('127.0.0.1:11211');

默认的值就是上面这个。如果不一致才需要修改。

然后将此文件放到 WordPress 站点的 wp-content/ 目录下即可。千万不要将插件文件夹上传到 plugins 目录,这是与其它插件不同的地方。

W3 Total Cache 也挺好,就是太臃肿了。

关于 cache 的一些看法

顺便记录下自己的一些看法。不一定正确。

服务器上提供给 WordPress 的缓存一般就这么几个:

  • 数据库缓存:可以加快获取数据的速度,包括,
    • mysql query cache:这个在 MySQL/MariaDB 等数据库软件本身可设置,缓存某些查询结果。
    • memcached:缓存一个打包的数据库查询结果,也就是对象。
  • PHP 操作码缓存:如 Zend Opcache,可以加速 PHP 程序的运算。
  • 网页缓存:如 WP Super Cache 等插件,将最终生成的 HTML 页面缓存起来,这就包含了数据库查询和 PHP 运行的所有结果;通常,缓存结果是存在硬盘上而不是内存里,不过 W3 Total Cache 提供了使用 memcached 在内存中缓存静态化页面的选项;但是,如果服务器内存足够,Linux 系统本身是会将常用的文件缓存在内存中的,所以如果内存足够就不需要特意安排了。如果内存并不是非常富余,那么恐怕要优先考虑的也就不是缓存了。

由此看来,如果网站本身对动态化的需求不高,比如并不会根据访客的特征如 IP、设备/操作系统、浏览器、访问时间等改变页面内容,完全可以将页面静态化下来,只是定期更新一下静态化的页面即可。即使是页面中有些内容,比如阅读计数等,会实时改变,由于它不重要,也可以让他隔一段时间更新一下就行了。此时选用网页静态化缓存显然是最合适的。应该是比较适用于一些博客网站的。

目前水景一页就是采取了静态缓存,使用了 WP Super Cache。并且缓存的内容基本上是无限期,也就是说,偶尔看情况重新生成一次缓存。但是有新文章/新评论发布的话会自动更新部分相关页面。

如果网站对动态化有较高的要求,此时数据库缓存就显得非常重要了。因为数据库查询本身是个比较大的开销,特别是组合查询。

而不管是可以使用静态化还是对动态要求较高,PHP 操作码缓存都是应该采用的。因为一般情况下网站上的页面模板并不多,不会占用太多的缓存空间,而其加速效果却是非常明显。

好吧,暂时就只能想到这么多了。欢迎大家留言讨论。©

本文发表于水景一页。永久链接:<http://cnzhx.net/blog/wordpress-memcached-and-other-cache-methods/>。转载请保留此信息及相应链接。

18 条关于 “WordPress + Memcached 部署以及一些关于缓存的看法” 的评论

    • WP是有点臃肿,不过优化服务器不是因为它,而是因为对任意动态应用,服务器都有个较优的配置方案。

  1. memcached 对象缓存还是比较通行的方案,毕竟很多空间或服务器的压力都在数据库这头,对象缓存可以明显改善。即使是那些无限美国主机,Cpanel也对资源有负载限制的。

  2. 感谢博主分享,学习了很多。
    最近也在VPS上折腾wordpress,遇到了一个不解的事情:

    我从phpMyAdmin里跑SQL语句,把图片http链接换成https链接,替换成功后,正常情况下数据应该已经更改掉了。打开网页看源码,也确实更改掉了。

    但是,wp管理后台进去打开编辑文章时,文本格式下出现的代码居然是更改前的http。这样保存之后,数据又变成改之前的http链接了。

    研究了好几天,也没研究明白。
    今天突然看到这篇文章,请问,是否是因为有数据缓存的原因?

    也就是说虽然phpMyAdmin里做了更改,但后台编辑文章时查询的数据还是之前缓存的旧的数据。
    有没有这个原因呢?
    如果是,该如何解决呢?
    非常感谢!


    SEOIMO

    • 这个的确有些不合常理的地方。有可能是因为缓存吧。但是除非你配置得很特殊,不然的话过了几天了早该更新缓存了。
      检查的方法很简单,根据你使用的缓存方式清空缓存后编辑文章就知道了。具体的清空方法请自行搜索。

      • 确实和Memcached缓存有关。
        我把安装的MemcacheD is your friend插件删了,并清空缓存,然后显示正常了。
        命令:
        telnet 127.0.0.1 11211
        flush_all

雁过留声,人过留名

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

特别提示:与当前文章主题无关的讨论相关但需要较多讨论求助信息请发布到水景一页讨论区的相应版块,谢谢您的理解与合作!请参考本站互助指南
您可以在评论中使用如下的 HTML 标记来辅助表达: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>