WordPress 使用快取的方式有很多種,相關外掛數量也是琳琅滿目,要安裝那一種快取,端看你能控制主機到哪種地步,不是每一種都能去啟用。不過前提若是你的主機性能相當優越,每日訪客數量不多,其實可以不用做快取,而且有的主機商是有提供他們的快取機制,你根本無需動手。
內容大綱
前言
先用一張圖簡單說一下當你開啟網頁後的整個循環(流程),請看下方流程圖。
當 client 端點擊一個網址之後發生 request,Server 收到並命令對應的程式,從資料庫撈出資料,PHP 再編譯出 html 內容,respone 給 client。而以上每一個關卡都有機會做成快取,理論上快取做在越前面,回應速度越快,像 FastCGI 就是這樣的一個機制。
建立目錄 – 快取檔案的資料夾
一般我們會使用 /var/run/nginx-cache(如果 nginx-cache 不存在或是想要命名其他名稱,可自行新增)來存放快取檔案,這裡還有一個地方要注意的是,若是主機不只一個網站要使用快取,請另外建立各自的資料夾。
修改 Nginx 的主 config 檔案
檔案位置預設是在 /etc/nginx/nginx.conf,但有時候為了配合多站台使用不同的配置,還會 include 各自站台的 conf 檔,這個要自己查一下看看是什麼情況,再來配合修改。而我的情況是多站台,通通要啟用 FastCGI,因此某些設定是共用的。
共用的部份,編輯 /etc/nginx/nginx.conf 檔,先找到 http{} 區塊,並加入下列語法:
#省略內容
fastcgi_cache_path /var/run/nginx-cache/site1 levels=1:2 keys_zone=SITE1:16m inactive=7d max_size=1G;
fastcgi_cache_path /var/run/nginx-cache/site2 levels=1:2 keys_zone=SITE2:16m inactive=7d max_size=1G;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
fastcgi_cache_use_stale error timeout invalid_header http_500;
fastcgi_ignore_headers Cache-Control Expires Set-Cookie;
#省略內容
上面要注意的是 fastcgi_cache_path,不同站台指定不同的資料夾,keys_zone 也要區隔不同的站台來命名。
修改各自站台的 config 檔案
你或許可以看到在你的 /etc/nginx/nginx.conf 檔案內容看到這些 include 敘述
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
這需要你自己判別哪一支才是你的網站設定檔案(通常是以網址命名),並打開他找到 server{} 區塊來編輯。
set $skip_cache 0;
#哪些條件下不做快取
if ($request_method = POST) {
set $skip_cache 1;
}
if ($query_string != "") {
set $skip_cache 1;
}
if ($request_uri ~* "/wp-admin/|/xmlrpc.php|wp-.*.php|/feed/|index.php|sitemap(_index)?.xml") {
set $skip_cache 1;
}
if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in") {
set $skip_cache 1;
}
location ~ [^/]\.php(/|$)
{
try_files $uri =404;
fastcgi_pass unix:/tmp/php-cgi-74.sock;
fastcgi_index index.php;
include fastcgi.conf;
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
fastcgi_cache_bypass $skip_cache;
fastcgi_no_cache $skip_cache;
fastcgi_cache SITE1;
add_header X-Cache "$upstream_cache_status From $host";
add_header Cache-Control max-age=0;
add_header Nginx-Cache "$upstream_cache_status";
add_header Last-Modified $date_gmt;
etag on;
fastcgi_cache_valid 200 301 302 1d;
}
#清除快取
location ~ /purge(/.*) {
allow 127.0.0.1;
allow '你的主機ip';
deny all;
fastcgi_cache_purge SITE1 "$scheme$request_method$host$1";
}
儲存之後記得重新啟動 Nginx。
驗證結果
兩個方法:
1. 我們有設定儲存快取檔案的資料夾,因此只要被快取過的頁面,就會生成一支檔案在這個資料夾內。
2. 另外可以用開發人員工具,看看該網頁回應的標頭是否有這串文字 x-cache: HIT From xxxxxx
使用外掛清除快取
雖然我們已經在上面寫了外掛清除的命令,但那是必須自己去呼叫相關網址,例如: https://www.abc.com/purge/hello-world,這樣是一件非常費時的方法,還好有這個 Nginx Helper 外掛,在文章變動時,他會自動把相關的頁面快取通通清除掉。