首页 > Tech > 面向新手的 WordPress 优化指南

面向新手的 WordPress 优化指南

写在前面

近期由于原先的 shared hosting plan 到期,将这个博客移动到了一个 virtual private server 上。选择 virtual private server 的原因主要有两个:一个是之前的 shared hosting 速度实在不敢恭维,另一个则是 virtual server 提供更大的自由度(毕竟是独立主机——尽管是虚拟的)。由于 WordPress 本身相当耗费资源,蜗牛一般的页面读取速度成为了困扰很多用户(尤其是使用 shared environment 的用户)的一大难题。

在移动这个博客的时候,我花了一些时间研究了优化 WordPress 效率的方法。整个优化过程比较琐碎,涉及到的 components 比较多。于是我决定利用这篇博文,对这个优化过程作一个比较详细的梳理。

Disclaimer: 以下的内容主要基于个人经验,并不保证适用于任何硬件/软件环境。在调整系统参数的时候,请作好相应的备份工作。

1. 优化 WordPress

我们先讨论一下在没有 root 权限、无法直接修改 web server 设置的情况下,如何利用插件使 WordPress 运行得更流畅。

1.1 基本优化

  1. 关闭无用的插件:多使用一个插件往往意味着多执行一些 php 代码。所以尽可能减少插件的使用对性能是有帮助的——当然,也有能够大大提高性能的插件。后面我们会提到。
  2. 关闭 Post Revision:在开启 Post Revision 的时候,每次更新一个 post,系统并不会覆盖以前的版本,而是会新增一个 revision。尽管这样大大降低了误操作的风险,但是也带来了不小的 overhead。要关闭这个功能,可以在 wp-config.php 中加入:define('WP_POST_REVISIONS', false);

1.2 优化数据库

推荐插件 WP-DBManager。该插件支持定期对 WordPress 的数据库进行优化和备份,也能手动 empty/drop tables,或是执行给定的 SQL 指令。总之是很省心的一款插件。

1.3 Caching

一般而言,一个博客网站大多数时候都是静态的,只有在新的博文/回复出现的时候,才会动态的改变出现。因此,用静态页面对博客进行缓存、仅在博客内容更新的时候对缓存进行相应的更新,能够大大减轻服务器的负担,提高页面读取速度。

推荐插件 WP Total Cache (或者类似的 WP Super Cache)。这款插件功能相当强大,下面作一个简要的说明。

  1. 安装 WP Total Cache 之后,Wordpress 的 dashboard 菜单中会多出“performance”这一项。点击进入之后,可能会看到若干个 warning。这些 warning 说的基本都是某些目录/文件的权限不正确,并且附有相当详细的解决方法。按部就班地修改若干设置即可。值得一提的是,WP Total Cache 会自动生成(或修改) /.htaccess 文件。如果博客使用的 web server 不支持 Override,WP Total Cache 依然能够运行,但是某些缓存可能无法起到作用。
  2. 解决所有 warning 之后,可以进行 compatibility check。WP Total Cache 会检查 web server 上各类 module/extension 的安装情况,从而决定哪些优化是可能的。

接下来简单介绍一下 WP Total Cache 支持的几种优化:

  1. Page Cache: 对博客各页面进行缓存。支持不同的缓存方式,在 shared web hosting 下建议使用 disk (enhanced),在 private server 上可以使用 Opcode cache (例如我使用的 APC,后文会提到),或者 memcache extension。速度提升最为明显,强烈推荐使用
  2. Minify: 简化 html/css/javascript 代码(例如移除注释、空白符等)。并能通过合并多个脚本文件来减少 HTTP request 的数量。推荐使用
  3. Database Cache: 缓存 database objects。很多 shared hosting (例如 godaddy)的一大软肋便是数据库服务器响应缓慢。因此这个优化还是非常有用的(同样可以使用 disk,Opcode cache 或者 memcache),推荐使用
  4. Object Cache: 对内存对象进行进一步的缓存。不过似乎只有对于使用了 Object Cache API 的页面才会有比较明显的效果。在 shared hosting 环境下尝试使用 disk cache,结果速度不升反降,不推荐;使用 Opcode cache 时速度似乎略有提升,可以保留
  5. Content Delivery Network: 将静态数据的多个拷贝保存在一个网络上(例如 Amazon S3),降低 web server 的带宽压力(同时提高数据的 availability),加快页面读取速度。没有尝试过,感觉在没有大量静态数据(例如图片)的情况下,用处不大
  6. Browser Cache: 通过合理设置 HTTP header 中的 expire time 来利用用户浏览器自身的缓存功能,降低服务器负担。同时可以通过 HTTP compression 降低对带宽的消耗。不错的功能,对提高低带宽用户的体验很有帮助,推荐使用

此外,WP Total Cache 还提供了一个 preview mode 来测试上述各项功能。不过我没有用过(偷懒 :P)。

2. 优化 server

下面的内容主要面向可以对 server 进行直接设置(最好是拥有 root 权限)的用户。另外,我用的 virtual private server 配置是 1G cpu, 512M memory。操作系统是 ubuntu 10.04,使用 web server: Apache2,以及 database server: mysql。下面列出的具体方案是针对以上配置进行优化的。

2.1 优化 Apache 配置

Apache 是很耗内存的(更准确地说使用 prefork multi-processing module 时占用内存较多。但是 php5 module 和更省内存的 worker module 并不兼容,因此 prefork 是大多数人的选择),而其默认设置并不太适合内存较小的 virtual private servers。把以下内容加入 Apache 的配置文件(ubuntu 下默认是 /etc/apache2/apache2.conf)可以更好地适应 512M 内存的服务器。

KeepAliveTimeout 1
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 150
MaxRequestsPerChild 1000

此外,为了确保 WP Total Cache 能够正常工作,需要将 WordPress 所在目录设置为 AllowOverride all,还需要 enable 几个 module:header, expires(需要的 module 列表在 compatibility check 里面可以看到)。

2.2 APC 的安装和配置

Alternative PHP Cache (APC) 是一个相当不错的 opcode cache。为了在 debian/ubuntu 下安装 APC,需要用 apt-get install 安装以下几个 packages: php-pear, php5-dev, apache2-dev。完成之后,输入
pecl install apc
即可完成 APC 的安装。安装完成之后,还需要添加一个配置文件(在 ubuntu 下默认是 /etc/php5/apache2/conf.d/apc.ini),内容为:

extension=apc.so
apc.enabled=1
apc.ttl=7200
apc.user_ttl=7200
apc.shm_segments=1
apc.shm_size="32M"

为了测试 APC 是否已经正常运行,可将 APC 安装时附带的 apc.php 放到某个 virtual host 上,之后访问这个页面就可以查看内存占用,cache hit rate 等信息。

2.3 优化 mysql 配置

除了 web server,优化 database server 配置也是很重要的。把以下的内容加入配置文件(在 ubuntu 中是 /etc/mysql/my.cnf)可以优化 mysql 在 VPS 上的性能。

[mysqld]
max_connections = 300
key_buffer = 32M
myisam_sort_buffer_size = 32M
join_buffer_size = 1M
read_buffer_size = 1M
sort_buffer_size = 2M
table_cache = 4000
thread_cache_size = 286
interactive_timeout = 25
wait_timeout = 7000
connect_timeout = 10
max_allowed_packet = 16M
max_connect_errors = 10
query_cache_limit = 2M
query_cache_size = 12M
query_cache_type = 1
tmp_table_size = 16M
skip-innodb
[mysqld_safe]
open_files_limit = 8192
[mysqldump]
quick
max_allowed_packet = 16M
[myisamchk]
key_buffer = 64M
sort_buffer = 64M
read_buffer = 16M
write_buffer = 16M
[mysqlhotcopy]
interactive-timeout

3. 其他

3.1 性能测试

如果想了解各种优化/配置的实际效果,性能测试是一种很直观的办法。在 ubuntu 下可以使用 ab 工具(需安装 package apache2-utils):ab -t30 -c5 http://myblog.com/。这个命令会在 30 秒内用 5 个线程不断连接给定的地址,并会生成一个很详细的统计报告,相当好用。

Bibliography

  1. VPS Optimization Guide: http://www.earnersblog.com/vps-optimization-guide
  2. WordPress Optimization Bible: http://www.prelovac.com/vladimir/wordpress-optimization-guide
  1. Wing 4月 9th, 2011 @ 01:56 | #-49

    太技术了,直接沙发。。。

  2. DannyT 4月 12th, 2011 @ 20:40 | #-48

    顶技术帖!

评论提交中, 请稍候...

留言

可以使用的标签: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>
Trackbacks & Pingbacks ( 0 )
  1. 还没有 trackbacks