如何配置Nginx的FastCGI缓存清理?

  • Post category:Linux

当我们使用 Nginx 作为 web 服务器时,为了提高性能,我们经常会使用 FastCGI 缓存来提升网站的响应速度。但是当缓存过期或者需要刷新缓存时,我们就需要使用缓存清理功能。在本篇攻略中,我将详细介绍如何配置 Nginx 的 FastCGI 缓存清理功能。


1. 安装 FastCGI 缓存插件

在开始配置缓存清理之前,你首先需要安装 ngx_cache_purge 模块。该模块是 Nginx 的一个缓存清理插件,它允许你使用 HTTP 请求来删除 FastCGI 缓存。可以通过以下命令安装:

cd /usr/local/src
wget http://labs.frickle.com/files/ngx_cache_purge-2.3.tar.gz
tar -zxvf ngx_cache_purge-2.3.tar.gz
cd nginx-1.20.0/
./configure --add-module=/usr/local/src/ngx_cache_purge-2.3/
make && make install

安装完毕后,你需要在 Nginx 配置文件中添加以下内容:

load_module modules/ngx_http_cache_purge_module.so;

这一行代码包含在 http 配置块中。

2. 配置 FastCGI 缓存

在启用缓存清理功能之前,你需要在 Nginx 中启用 FastCGI 缓存。在 Nginx 中启用缓存非常简单,只需要在 server 配置块中添加以下代码:

location / {
    # 使用 FastCGI 缓存
    fastcgi_cache_key "$scheme$request_method$host$request_uri";
    fastcgi_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m inactive=60m;

    # 设置缓存过期时间
    add_header X-Cache-Expire $upstream_cache_expires;
    fastcgi_cache_valid 200 60m;
    fastcgi_cache_bypass $http_pragma;
    fastcgi_cache_revalidate $http_cache_control;
}

在上面的代码中,我们使用了 $upstream_cache_expires 变量来设置缓存过期时间,这个变量的值是后端服务器返回的 Cache-Control 响应头部中 max-age 参数值。

3. 配置缓存清理

配置 FastCGI 缓存清理也很简单,我们只需要在对应的 server 配置块中添加一条 location 配置来实现缓存清理。例如,在以下配置中,我们设置了清理 “/blog” 路径下的缓存:

location /purge-blog {
    # 定义缓存的 key
    fastcgi_cache_key "$scheme$request_method$host$request_uri";

    # 定义缓存清理规则
    allow all;
    deny all;
    proxy_cache_purge my_cache "$scheme$request_method$host/blog";
}

在上面的代码中,我们定义了一个名为 purge-blog 的 location,并且在其中使用了 proxy_cache_purge 来清理 FastCGI 缓存。在这里,我们使用了 allow all; deny all; 来限制该 location 只能通过 HTTP 来访问,这样可以保证缓存清理请求不会被其他请求误触发。

4. 测试缓存清理

你可以使用以下命令来测试缓存清理:

curl -X PURGE http://example.com/purge-blog

这条命令将通过 HTTP 请求来清理 FastCGI 缓存。在执行完该命令之后,你可以访问对应的网页,查看缓存是否已经被清理。如果缓存已经被清理,网页应该重新生成。

另外,你也可以通过日志来查看缓存是否已经被清理。在 Nginx 的错误日志中,你可以找到以下信息:

2019/05/18 03:31:27 [notice] 17043#17043: *1 purge_blog: successful

这表示 FastCGI 缓存已经成功被清理了。

示例说明

示例 1

在这个示例中,我们要清理 “/blog” 路径下的缓存。

location /purge-blog {
    # 定义缓存的 key
    fastcgi_cache_key "$scheme$request_method$host$request_uri";

    # 定义缓存清理规则
    allow all;
    deny all;
    proxy_cache_purge my_cache "$scheme$request_method$host/blog";
}

在上述代码中,我们定义了一个名为 purge-blog 的 location,并在其中使用了 proxy_cache_purge 来清理 FastCGI 缓存。在这里,我们使用了 allow all; deny all; 来限制该 location 只能通过 HTTP 来访问。

示例 2

在这个示例中,我们要清理 “/category” 路径下特定分类的缓存。

location ~ /purge-category/(.*)$ {
    # 定义缓存的 key
    fastcgi_cache_key "$scheme$request_method$host$request_uri";

    # 定义缓存清理规则
    allow all;
    deny all;
    proxy_cache_key "$scheme$request_method$host/category/$1$is_args$args";
    proxy_cache_purge my_cache "$scheme$request_method$host/category/$1$is_args$args";
}

在上述代码中,我们使用了正则表达式来匹配要清理的分类。当我们通过 HTTP 请求 /purge-category/{category_name} 时,Nginx 会通过缓存清理规则来清理 /category/{category_name} 路径下的缓存。