WordPress 大概是这个星球上使用得最多的博客程序了,甚至很多资讯、社区等非博客网站也在使用 WordPress。据统计,在全球排名 100 万以内的网站中,约有 14.7% 是利用 WordPress 程序搭建。令人震惊的是,维护整个 WordPress 运营和升级的团队核心成员,不足 20 人。大量的志愿者在为这个生态系统贡献精美的主题、实用的插件。

然而,为了保证灵活的可扩展性,Wordpress 牺牲了性能,它因为速度低下而广受诟病,很多空间商也为此头疼 —— 当访问量很大的时候,臃肿的 WordPress 站点消耗了服务器太多CPU和内存资源。我曾经总结过提高网站性能的方法,其中最有效的手段就是静态化了。

使用 WP Super Cache 插件可以帮助 WordPress 网站实现页面静态化,可惜的是 supercache 默认没有提供对 Ngnix 服务器的支持。

按照插件作者的说法,每当他尝试为他的网站使用 Nginx 替代 Apache 时总会出现稀奇古怪的问题,最终他放弃了……不管怎样,他还是好心地提供了一份 Nginx 服务器的参考配置,让 Super Cache 插件可以工作。但是各位看官请注意,这篇文章发布于 2009 年,到现在插件已经升级 N 多版本,增加支持 wp-touch 手机版等 N 多新功能了,这个配置文件已经过时。

不过不用担心,经过研究,老衲已经将插件生成的 .htaccess 配置文件彻底翻译为 Nginx rewrite 规则了!完美支持 WP Super Cache 的配置文件闪亮登场 ——

 location / {
           # 如果请求的文件已存在,直接返回
           if (-f $request_filename) {
               break;
           }
           set $supercache_file '';
           set $supercache_uri $request_uri;
           set $supercache 1;
           set $ihttp_host '';
 
           if ($request_method = POST) {
               set $supercache 0;
           }
 
           # 仅在访问文章永久链接时使用静态文件,请求中带参数则不使用静态缓存
           set $qs 0;
           if ($query_string) {
               set $qs 1;
           }
 
           # 不过从 twitter, facebook, feedburner 链接点过来的,总是带参数,这些访问仍然可以使用静态文件
           if ($query_string ~* "^utm_source=([^&]+)&utm_medium([^&]+)&utm_campaign=([^&]+)(&utm_content=([^&]+))?$") {
               set $qs 0;
               set $supercache_uri $document_uri;
           }
           #deactivate on high load
           if ($qs = 1) {
               set $supercache 0;
           }
           # 针对已登录用户(发表过评论),可以不静态化。在访问量高峰时可注释掉
           if ($http_cookie ~* "comment_author_|wordpress|wp-postpass_" ) {
               set $supercache 0;
           }
 
           # 支持移动设备,访问移动版本的网页缓存
           if ($http_user_agent ~* '(iphone|ipod|aspen|incognito|webmate|android|dream|cupcake|froyo|blackberry9500|blackberry9520|blackberry9530|blackberry9550|blackberry 9800|webos|s8000|bada)') {
                set $ihttp_host '-mobile';
           }
 
           # 指定静态缓存文件的路径
           if ($supercache = 0) {
                set $supercache_uri '';
           }
           if ($supercache_uri ~ ^(.+)$) {
               set $supercache_file /wp-content/cache/supercache/$http_host$1/index${ihttp_host}.html;
           }
 
           # 只有当缓存文件存在时,才进行 rewrite
           if (-f $document_root$supercache_file) {
               #rewrite ^(.*)$ $supercache_file break;
               rewrite ^ $supercache_file last;
           }
 
           # 所有其他请求,转给 wordpress 处理
           if (!-e $request_filename) {
               rewrite . /index.php last;
           }
}

需要注意的是 set $supercache_file 这一行,指定静态缓存文件的路径。这里的路径是 wp-super-cache 生成的静态文件目录,如果这个路径不对的话,最终还是交给了 index.php,静态缓存就不起作用了。因为每个网站的永久链接设置都不太一样,插件生成的缓存目录也不一样,需要仔细调试一下。

在生成了静态页面后,通过上面的规则直接让 Nginx 读取静态文件,完全不经过 PHP,可以很大的提高博客的页面性能。www.lovelucy.info博客实测,停掉 php-fpm 后台后,网站仍然可以访问,除了不能添加评论,其他一切正常。再也不怕抓站的爬虫把网站搞挂了……