每一個可以努力的日子,都是一份厚禮。
Ngnix 配置完美支持 WordPress Super Cache 插件
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 後台後,網站仍然可以訪問,除了不能添加評論,其他一切正常。再也不怕抓站的爬蟲把網站搞掛了……
這篇文章由lovelucy於2012-09-01 16:23發表在Linux。你可以訂閱RSS 2.0 也可以發表評論或引用到你的網站。除特殊說明外文章均為本人原創,並遵從署名-非商業性使用-相同方式共享創作協議,轉載或使用請註明作者和來源,尊重知識分享。 |
批評不自由
則讚美無意義
博主,網站開啟https後WP Super Cache的這個模式好像失效了!
最近wp搬家到 VPS 上頭,裝的是軍哥的LNMP1.0一件安裝包,也裝了WP super cache,用你提供的方法,確實能正常用Mod_rewrite方式生成靜態頁面。
但是同時也遇到一個問題,分類頁面在有更新後,無法rebuild cache,主頁能夠正常rebuild。
請問,怎麼解決這個問題?
你手動刪除該分類頁的緩存,再訪問一下該頁,能 rebuild 嗎?
問個問題,用這個方案我已經是能生成出index文件了
但是我想用memcached來緩存數據,那這樣nginx的規則該怎麼寫呢?
還有就是,怎麼順便讓他支持wp-touch這個插件呢。。
求賜教
在 Super Cache 插件高級設置里勾上“移動設備支持”,然後在“插件兼容” tab 下面應該會有啟動 WPTouch 兼容的設置。
memcached 沒有研究過,Ngnix 應該有相關模塊支持
為啥首頁始終不行呢
檢查下你的 wp-content/cache/supercache/$http_host/ 目錄下有 index.html 和 index.html.gz 文件嗎?
你好,沒有index.html.gz,只有index.html
當手動刪除index.html,用手機訪問的時候會生成index-mobile.html
,電腦版的也正常
當更新緩存,電腦訪問生成index.html後手機訪問不能生成index-mobile.html
為什麼我複製進去後提示location後面的斜杠出錯呢
Mod rewrite 模塊可能未安裝
後台出現這個錯誤提示,是不是可以忽略?
嗯,可以忽略
請問這個文件里沒有需要改路徑的地方了吧·····我的好像總是沒法成功運行,
你可以先去 /wp-content/cache/supercache/ 目錄檢查一下那些緩存文件有沒有生成,配置文件中 $supercache_file 這個變量比較關鍵
還有,測試靜態緩存的辦法只有停用了php-fpm 看看還能不能訪問么?
或者查看網頁源代碼,最下面有supercache字樣即可。
需注意的是不要登陸了博客,因為supercache默認對已登陸用戶不啟用緩存。
你好,有幾個問題想請教一下
1.你是WP-SUPER-CACHE開啟的是這個么Use mod_rewrite to serve cache files. (Recommended)??
2. 如果我們用nginx,根目錄下的.htaccess 配置文件我們是完全不用理會了對吧,就算寫進了很多新規則,但我們沒有Mod rewrite。
3.你修改的這一段東西,改的應該是nginx下面的vhost里的配置文件對不對。本身 就有 location括號符的東西的,我是把你重一段複製到下面去還是放在原來的location ~ .*\.(php|php5)?$ 下面。
4.你的這段代碼最後少了一個終止括號符 “ }”
1、是的。
2、是的。
3、如果你的網站有單獨的vhost,那就是改vhost文件。複製到location ~ .*\.(php|php5)?$一段的上面。
4、確實,謝謝提醒。
我的問題已經解決了,謝謝!
我說呢,我表妹的博客用的新浪的雲商店主機,就能用這個插件,也是ngnix服務器。
Ngnix 並發能力要好些,優化後能達到 10 萬以上,所以國內很多大的網站包括網易新浪水木豆瓣,都在用它。
我這個小博客訪問量沒那麼大,只是折騰着玩罷了~
你這個折騰起來越費勁,看來WP使用起來也有局限性。
我用的 VPS 主機,所以可以隨便折騰。 😈
如果用共享虛擬空間就沒必要了,運維的工作主機商會搞定。
罈子,我在這個搜索到的博客也發現你的身影了,哈 😈