ngx_cache_purge 正如其名是一個用來清除 nginx 快取的模組,它為免費版的 nginx 提供了清除 FastCGI、proxy、SCGI 和 uWSGI 快取的功能 。
安裝
ngx_cache_purge 最先是由 Frickle 開發,可以在它的 官網 或是 GitHub 上找到,不過已經很久沒有更新而且需要重新編譯來使用模組功能。所幸 nginx-modules 繼續維護並提供了動態編譯的安裝方式,今天就是要使用 nginx-modules 所提供的 ngx_cache_purge 來進行介紹。
下載 ngx_cache_purge 原始碼
這步驟可以選擇下載 releases 裡的壓縮檔,或是直接 git clone 原始碼
git clone https://github.com/nginx-modules/ngx_cache_purge
下載 nginx 原始碼
下載的版本要和你目前使用的 nginx 版本相同
查看 nginx 版本
nginx -v
下載原始碼(這裡以 1.18.0 作為範例,請將 1.18.0 改為自己的版本號)
curl -O http://nginx.org/download/nginx-1.18.0.tar.gz
解壓縮原始碼(一樣記得更換版本號)
tar -xzf nginx-1.18.0.tar.gz
安裝編譯套件
Ubuntu 20.04
sudo apt install build-essential libpcre3-dev zlib1g-devel
開始編譯
切換到原始碼目錄 (一樣記得更換版本號)
cd nginx-1.18.0
編譯設定
./configure --add-dynamic-module=../ngx_cache_purge --with-compat
../ngx_cache_purge 為剛剛下載的 ngx_cache_purge 原始碼路徑,如果路徑不同一樣要自己更改
編譯
make modules
使用 make modules 可以只針對模組進行編譯,而不用大費周章連 nginx 都重新編譯一次
編譯好後會在 objs 目錄下產生我們需要的動態庫 ngx_http_cache_purge_module.so
複製動態庫到模組目錄
查找 module-path
nginx -V 2>&1 | grep modules-path
這段指令會顯示出編譯時的參數,其中 –modules-path= 就是我們要找的路徑
複製到 modules-path (記得改成自己的 modules-path)
sudo cp objs/ngx_http_cache_purge_module.so /usr/lib/nginx/modules/
Nginx 設定
以 FastCGI 為例
載入模組
在 /etc/nginx/modules-enabled/ 新增 .conf 檔或是直接在 /etc/nginx/nginx.conf 寫入
load_module modules/ngx_http_cache_purge_module.so;
使用方法
使用方法分為兩種:
-
由請求 method 來刪除 cache
語法: fastcgi_cache_purge on|off|<method> [purge_all] [from all|<ip> [.. <ip>]]
可用範圍: http、server、location範例:
在接受到來自 127.0.0.1 的 PURGE 請求時清除「所有」 cache
fastcgi_cache_purge PURGE purge_all from 127.0.0.1;
-
由 key 來刪除對應的快取
語法: fastcgi_cache_purge zone_name key
可用範圍:location範例:
依據 /purge/ URL 請求刪除對應快取
/purge/536/ngx_cache_purge-clear-nginx-cache 刪除 /536/ngx_cache_purge-clear-nginx-cache 的快取(記得 fastcgi_cache_purge 後面的參數要依照自己的情形設定)
location ~ /purge(/.*) {
allow 127.0.0.1;
deny all;
fastcgi_cache_purge WORDPRESS "$scheme$request_method$host$1";
}
建議加上 IP 限制讓 localhost 和 你的連外 IP 可以存取就好,不然阿貓阿狗都可以隨時清光伺服器的快取。
中文網址要注意(有特殊字元被編碼過的可能都是如此),我在使用方法2時,全英文/數字網址都很順利,但帶有中文網址時請求都無法成功(回傳412,當前 key 沒建立過快取也會回傳412),如果遇到相同問題建議會被快取的網址使用全英文數字
。