写在前面
近期由于原先的 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 基本优化
- 关闭无用的插件:多使用一个插件往往意味着多执行一些 php 代码。所以尽可能减少插件的使用对性能是有帮助的——当然,也有能够大大提高性能的插件。后面我们会提到。
- 关闭 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)。这款插件功能相当强大,下面作一个简要的说明。
- 安装 WP Total Cache 之后,Wordpress 的 dashboard 菜单中会多出“performance”这一项。点击进入之后,可能会看到若干个 warning。这些 warning 说的基本都是某些目录/文件的权限不正确,并且附有相当详细的解决方法。按部就班地修改若干设置即可。值得一提的是,WP Total Cache 会自动生成(或修改) /.htaccess 文件。如果博客使用的 web server 不支持 Override,WP Total Cache 依然能够运行,但是某些缓存可能无法起到作用。
- 解决所有 warning 之后,可以进行 compatibility check。WP Total Cache 会检查 web server 上各类 module/extension 的安装情况,从而决定哪些优化是可能的。
接下来简单介绍一下 WP Total Cache 支持的几种优化:
- Page Cache: 对博客各页面进行缓存。支持不同的缓存方式,在 shared web hosting 下建议使用 disk (enhanced),在 private server 上可以使用 Opcode cache (例如我使用的 APC,后文会提到),或者 memcache extension。速度提升最为明显,强烈推荐使用。
- Minify: 简化 html/css/javascript 代码(例如移除注释、空白符等)。并能通过合并多个脚本文件来减少 HTTP request 的数量。推荐使用。
- Database Cache: 缓存 database objects。很多 shared hosting (例如 godaddy)的一大软肋便是数据库服务器响应缓慢。因此这个优化还是非常有用的(同样可以使用 disk,Opcode cache 或者 memcache),推荐使用。
- Object Cache: 对内存对象进行进一步的缓存。不过似乎只有对于使用了 Object Cache API 的页面才会有比较明显的效果。在 shared hosting 环境下尝试使用 disk cache,结果速度不升反降,不推荐;使用 Opcode cache 时速度似乎略有提升,可以保留。
- Content Delivery Network: 将静态数据的多个拷贝保存在一个网络上(例如 Amazon S3),降低 web server 的带宽压力(同时提高数据的 availability),加快页面读取速度。没有尝试过,感觉在没有大量静态数据(例如图片)的情况下,用处不大。
- Browser Cache: 通过合理设置 HTTP header 中的 expire time 来利用用户浏览器自身的缓存功能,降低服务器负担。同时可以通过 HTTP compression 降低对带宽的消耗。不错的功能,对提高低带宽用户的体验很有帮助,推荐使用。
此外,WP Total Cache 还提供了一个 preview mode 来测试上述各项功能。不过我没有用过(偷懒 )。
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
- VPS Optimization Guide: http://www.earnersblog.com/vps-optimization-guide
- WordPress Optimization Bible: http://www.prelovac.com/vladimir/wordpress-optimization-guide
太技术了,直接沙发。。。