ngx_cache_purge 清除 Nginx 快取

講解如何使用 ngx_cache_purge 模組清除 nginx 的快取。

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),如果遇到相同問題建議會被快取的網址使用全英文數字

Built with Hugo
Theme Stack designed by Jimmy