本文我們來介紹WordPress緩存插件wp-super-cache在nginx下如何配置rewrite規則,后面補充了WP Super Cache的介紹,實現WordPress提交評論的時刪除該頁面的WP-Super-Cache緩存的方法.
WordPress的緩沖插件wp-super-cache默認支持apahce的緩沖方式,在生成了靜態頁面數據后,通過.htaccess的規則直接讓apache讀取靜態文件,完全不經過PHP,可以很大的提高博客的頁面性能.
但是Nginx的改寫規則就沒這么容易讓代碼來配置了,雖然wp-super-cache的第二種緩存方式就是為這種使用環境設計,但實際上是用了PHP來提供靜態數據了,在使用apache benchmark壓力的時候,php-cgi依然占很高的CPU占有率.
通過編寫nginx的rewrite規則還是可以讓nginx直接讀取靜態文件,參考來自Code Exchange: nginx rewrite rules for WordPress + WP Super Cache,這里的配置被很多地方引用過,但實際嘗試使用過程看到那里面的代碼還需要微調.
- server {
- listen 80;
- server_name apt-blog.net;
- root /var/www/pt-sites/wordpress;
- index index.html index.htm index.php;
- location / {
- # enable search for precompressed files ending in .gz
- # nginx needs to be complied using ?-with-http_gzip_static_module
- # for this to work, comment out if using nginx from aptitude
- gzip_static on;
- # if the requested file exists, return it immediately
- if (-f $request_filename) {
- break;
- }
- set $supercache_file '';
- set $supercache_uri $request_uri;
- if ($request_method = POST) {
- set $supercache_uri '';
- }
- # Using pretty permalinks, so bypass the cache for any query string
- if ($query_string) {
- set $supercache_uri '';
- }
- if ($http_cookie ~* "comment_author_|wordpress|wp-postpass_" ) {
- set $supercache_uri '';
- }
- # !!!! IMPORTANT
- # if we haven't bypassed the cache, specify our supercache file
- if ($supercache_uri ~ ^(.+)$) {
- set $supercache_file /wp-content/cache/supercache/$http_host/$1/index.html;
- }
- # only rewrite to the supercache file if it actually exists
- if (-f $document_root$supercache_file) {
- rewrite ^(.*)$ $supercache_file break;
- }
- # all other requests go to Wordpress
- if (!-e $request_filename) {
- rewrite ^(.*)$ /index.php?q=$1 last;
- } //Vevb.com
- }
- location ~ /.php$ {
- include fastcgi_params;
- fastcgi_pass 127.0.0.1:9000;
- fastcgi_index index.php;
- fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
- }
- }
需要重點關注的是set $supercache_uri這一行,這里的路徑是wp-super-cache生成靜態文件的路徑,配置文件起作用的時候,這個路徑會和$document_root組成最終靜態文件的絕對路徑,最終輸出文件,所以如果這個路徑不對的話,最終還是交給了index.php,緩沖就不起作用了.
wp-super-cache在wordpress目錄/wp-content/cache/supercache/$http_host/下生成了各個請求url的目錄,目錄下是一個index.html靜態文件,可以在wordpress工作時候,在這個目錄下用命令watch find觀察(在緩沖不多的情況下),總之小心的把這個路徑寫好,因為估計每個博客的permanent link的樣式都不一樣,wp-super-cache生成的目錄也不一樣,需要仔細調試一下.
當然這里的規則并沒有安全包含了wp-super-cache 插件的功能,比如識別手機客戶端之類的,如果需要還得仔細根據插件生成的.htaccess規則來添加到nginx。
完成后用apache benchmark壓一下,Request per second應該很容易上百,而且php-cgi應該不會出現在top的列表前面了,CPU應該集中在nginx的子進程上,而且都是個位數CPU占有率,系統的load非常低。
Tips:發現測試結果不對時,可以嘗試刪除/wp-content/cache整個目錄,讓wp重新生成所有緩沖.
順便說一下,如果僅使用ab測試壓力,用不著安裝整個apache2,只需要apt-get install apache2-utils.
WordPress緩存插件:WP Super Cache
WP Super Cache 的基本介紹:WP Super Cache 是 WordPress 官方開發人員 Donncha 開發,是當前最高效也是最靈活的 WordPress 靜態緩存插件,它把整個網頁直接生成 HTML 文件,這樣 Apache 就不用解析 PHP 腳本,通過使用這個插件,能使得你的 WordPress 博客將顯著的提速.
WP Super Cache 的緩存機制
WP Super Cache 緩存機制有兩種,WP Cache 和 Super Cache。
WP Cache 緩存時,會在你的“wordpress 安裝文件夾/wp-content/cache/”文件夾下生成一系列wp-cache-xxxxxx.html格式的文件,Super Cache 緩存時,則在你的“wordpress 安裝文件夾/wp-content/cache/supercache/”文件夾下生成對應每一篇文章或者標簽等的目錄,名稱為xxx.html,取決于你的文章ID是怎么設置,目錄下面就是靜態的 index.html 文件.
當你一個訪問者來的你的站點,他沒有登入或者也沒有留言,這樣他得到是一個在 WordPress cache 文件夾下的 supercache 子文件夾下的純靜態文件,其實你都可以自己到上面的 supercache 目錄下去查看同樣的永久鏈接的 HTML 文件的備份.
判斷一個頁面是否已經被緩存了,查看該頁面的源代碼,如果訪問者已經登陸或者留了言,就會返回 WP Cache 函數生成的頁面,并且最后一行會有“Cached page generated by WP-Super-Cache+緩存時間”這行字,就像下面這行代碼一樣:
<!-- Cached page generated by WP-Super-Cache on 2011-02-25 15:57:24 -->
而 Super Cache 緩存會多一行如下代碼:
<!-- super cache -->
因為 Super Cache 是真正靜態的,對搜索引擎和博客的速度非常有好處,而且有效的減輕了 php 和 Mysql 的查詢壓力,這點對于大型博客來說優勢很明顯,一般的較小的博客感覺就不怎么明顯.
WP-Super-Cache 的使用設置
WP-Super-Cache 啟用前的準備工作
①前提是固定鏈接不可用默認的,上傳WP-Super-Cache插件,不要急著啟用。
②賦予以下權限:
給wp-super-cache文件夾添加寫權限。
給wp-content文件夾添加寫權限。
在wp-content文件夾下新建cache文件夾并添加寫權限。
③在網站根目錄wp-config.php文件中
先檢查是否有下面這段代碼:
define('WP_CACHE',true);//Added by WP-Cache Manager
如果沒有則在define(‘DB_NAME’的上一行(也就是添加在wp-config.php文件中語句的最前面) 添加如下代碼:
define('WP_CACHE',true);//Added by WP-Cache Manager
然后啟用插件,一般已經可以去設置了,如果還出錯再接著下面步驟.
④看wp-content目錄下面有沒有有wp-cache-config.php這個文件,如果沒有,直接把插件包里面的wp-cache-config-sample.php改名為wp-cache-config.php傳到wp-content目錄.
⑤再看wp-content目錄里面有沒有advanced-cache.php這個文件,如果沒有,同樣把插件包里面的wp-cache-phase1.php文件改名為advanced-cache.php同樣傳到wp-content目錄.
⑥最后一步在wp-content目錄下面建一個cache文件夾,再在cache文件夾下新建一個supercache文件夾.
⑦查看網站底部源代碼,如果有類似下面的文字則說明沒有開啟成功,繼續修改:
<!-- WP Super Cache is installed but broken. The path to wp-cache-phase1.php in wp-content/advanced-cache.php must be fixed! -->
⑧查看網站底部源代碼,有類似下面的文字則說明開啟成功.
- <!-- Dynamic page generated in 2.703 seconds. -->
- <!-- Cached page generated by WP-Super-Cache on 2010-11-23 11:44:28 -->
- <!-- super cache -->
注:更改了網站文件后要進入“Tester&contents”選項點擊“刪除過期文件”“刪除緩存”.
WP-Super-Cache 的設置
1.“Easy”:勾選“Caching On (Recommended)”,點擊“更新狀態”.
2.“高級選項”:(額外附加以下選項).
勾選“Compress pages so they’re served more quickly to visitors.”(開啟gzip)
勾選“Don’t cache pages for known users.”不對認識的人使用緩存(比如登錄者或發表評論者)
過期時限:0秒,0表示不啟用,但當有新文章發表時、新評論時,仍可自動更新緩存.
“Preload”那里勾選“Preload mode”
3.“Preload”:勾選“Preload mode ”
注:其它所有選項默認即可。
WP-Super-Cache 完全刪除的方法
①在后臺禁用此插件。
②刪除/wp-content/plugins/目錄的wp-super-cache目錄。
③刪除wp-content目錄下面的cache目錄。
④刪除wp-content目錄下面的wp-config.php,advanced-cache.php兩個文件。
⑤修改wp-config.php,把這一行刪掉:define(‘WP_CACHE’,‘true’);
⑥如果主機本來是用.htaccess文件的要改回來(網站根目錄與wp-content/cache都有)
實現WordPress提交評論的時刪除該頁面的WP-Super-Cache緩存的方法.
lnmp環境下的WordPress使用WP-Super-Cache插件,若要開啟mod_rewrite 緩存模式,需要在nginx里面加入一些特定的規則,具體請見舊文:《nginx下wp super cache的mod_rewrite規則》。
用過WP-Super-Cache插件的應該都知道,在高級設置里面有一項【當某頁面有新評論時,只刷新該頁面的緩存】的功能,從字面上來說,就是當有人在某篇文章發起評論時,將刪除該頁面的緩存。
但是,經過我仔細測試發現,這個功能在我的博客并沒有生效,個人猜測失敗的原因可能是使用了ajax無刷新評論導致的。也就是采用ajax評論的方式,可能無法觸發WP-Super-Cache的刪除機制,從而導致這個功能的失效!總之,不管怎么樣,反正在我的博客失效了,現在就要想辦法解決這個問題。
既然你不行,那就我來,簡單的加上幾句并不高端的PHP代碼后,就實現了這個功能,編輯主題下的comments-ajax.php文件,啟用ajax評論的博客才有,找到如下代碼:
- do_action('pre_comment_on_post', $comment_post_ID);
- do_action('pre_comment_on_post', $comment_post_ID);
然后,在這行代碼之后添加刪除緩存代碼,保存即可.
- //有人評論將自動刪除已存在緩存
- $post_data = get_post($post->ID, ARRAY_A);
- $slug = $post_data['post_name'];
- $cache_s = WP_CONTENT_DIR."/cache/supercache/".$_SERVER['SERVER_NAME']."/".$post->ID.".html/index.html";
- $cache_sd = WP_CONTENT_DIR."/cache/supercache/".$_SERVER['SERVER_NAME']."/".$post->ID.".html";
- $cache_p = WP_CONTENT_DIR."/cache/supercache/".$_SERVER['SERVER_NAME']."/".$slug."/index.html";
- $cache_pd = WP_CONTENT_DIR."/cache/supercache/".$_SERVER['SERVER_NAME']."/".$slug;
- if (file_exists($cache_s)) {
- unlink($cache_s);
- rmdir($cache_sd);
- }
- if (file_exists($cache_p)) {
- unlink($cache_p);
- rmdir($cache_pd);
- }
- //有人評論將自動刪除已存在緩存
- $post_data = get_post($post->ID, ARRAY_A);
- $slug = $post_data['post_name'];
- $cache_s = WP_CONTENT_DIR."/cache/supercache/".$_SERVER['SERVER_NAME']."/".$post->ID.".html/index.html";
- $cache_sd = WP_CONTENT_DIR."/cache/supercache/".$_SERVER['SERVER_NAME']."/".$post->ID.".html";
- $cache_p = WP_CONTENT_DIR."/cache/supercache/".$_SERVER['SERVER_NAME']."/".$slug."/index.html";
- $cache_pd = WP_CONTENT_DIR."/cache/supercache/".$_SERVER['SERVER_NAME']."/".$slug;
- if (file_exists($cache_s)) {
- unlink($cache_s);
- rmdir($cache_sd);
- }
- if (file_exists($cache_p)) {
- unlink($cache_p);
- rmdir($cache_pd);
- }
現在有人提交評論時,將會判斷是否存在該頁緩存,如果存在就刪除,從而實現了我要的功能,本來想用 is_page() 和 is_single()來判斷頁面內容,從而簡化代碼的,可惜不生效,至少用上面的笨方法了,反正能實現就可以了.
新聞熱點
疑難解答
圖片精選