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 後台後,網站仍然可以訪問,除了不能添加評論,其他一切正常。再也不怕抓站的爬蟲把網站搞掛了……