更新日期:2023-07-31

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 外掛,在文章變動時,他會自動把相關的頁面快取通通清除掉。