欢迎光临济南雪聪网
详情描述
Nginx缓存清理实现方式

1. nginx_cache_purge模块(官方推荐)

安装模块

# 重新编译Nginx添加模块
./configure --add-module=../ngx_cache_purge-X.X
make && make install

配置示例

http {
    # 定义缓存路径
    proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m;

    server {
        location / {
            proxy_pass http://backend;
            proxy_cache my_cache;
        }

        # 清理缓存配置
        location ~ /purge(/.*) {
            allow 127.0.0.1;
            allow 192.168.0.0/16;
            deny all;

            proxy_cache_purge my_cache $scheme$proxy_host$1$is_args$args;
        }
    }
}

清理方式

# 清理特定URL缓存
curl -X PURGE http://example.com/purge/api/data

# 清理带参数的URL
curl -X PURGE "http://example.com/purge/api/data?id=123"

2. 使用proxy_cache_bypass指令

配置示例

server {
    location / {
        proxy_pass http://backend;
        proxy_cache my_cache;

        # 通过特定header绕过缓存
        proxy_cache_bypass $http_cache_purge;
    }
}

清理方式

# 添加header强制刷新缓存
curl -H "Cache-Purge: 1" http://example.com/api/data

3. 删除缓存文件(物理删除)

手动清理

# 查找缓存文件
find /var/cache/nginx -type f -name "*" | grep "example.com"

# 删除特定域名的缓存
find /var/cache/nginx -type f -name "*example.com*" -delete

# 清空整个缓存目录
rm -rf /var/cache/nginx/*

自动清理脚本

#!/bin/bash
# purge_cache.sh

CACHE_DIR="/var/cache/nginx"
PURGE_URL=$1

# 根据URL生成缓存key
CACHE_KEY=$(echo -n $PURGE_URL | md5sum | awk '{print $1}')

# 构建缓存文件路径
CACHE_FILE="${CACHE_DIR}/$(echo $CACHE_KEY | cut -c1-2)/$(echo $CACHE_KEY | cut -c3-4)/$CACHE_KEY"

# 删除缓存文件
if [ -f "$CACHE_FILE" ]; then
    rm -f "$CACHE_FILE"
    echo "Purged: $PURGE_URL"
else
    echo "Cache not found: $PURGE_URL"
fi

4. 使用Lua模块(OpenResty)

配置示例

location /purge {
    internal;
    content_by_lua_block {
        local cache = ngx.shared.cache_dict
        local key = ngx.var.arg_key

        if key then
            cache:delete(key)
            ngx.say("Purged: " .. key)
        else
            ngx.say("Error: key parameter required")
        end
    }
}

location /api {
    # 正常缓存配置
    proxy_cache my_cache;
    proxy_cache_key $uri$args;
}

5. 完整生产配置示例

http {
    proxy_cache_path /data/nginx/cache levels=1:2 
                     keys_zone=api_cache:100m 
                     max_size=10g 
                     inactive=24h 
                     use_temp_path=off;

    upstream backend {
        server 127.0.0.1:8080;
    }

    server {
        listen 80;
        server_name example.com;

        # API接口缓存
        location ~ ^/api/ {
            proxy_pass http://backend;
            proxy_cache api_cache;
            proxy_cache_key "$scheme$request_method$host$request_uri";
            proxy_cache_valid 200 302 10m;
            proxy_cache_valid 404 1m;

            add_header X-Cache-Status $upstream_cache_status;
        }

        # 缓存清理接口(受保护)
        location ~ /admin/purge(/.*) {
            # 访问控制
            allow 127.0.0.1;
            allow 10.0.0.0/8;
            deny all;

            # 使用purge模块
            proxy_cache_purge api_cache "$scheme$request_method$host$1$is_args$args";

            # 或者使用Lua
            # content_by_lua_file /usr/local/nginx/lua/purge.lua;
        }

        # 批量清理
        location /admin/purge-all {
            allow 127.0.0.1;
            deny all;

            content_by_lua_block {
                os.execute("find /data/nginx/cache -type f -delete")
                ngx.say("All cache purged")
            }
        }
    }
}

6. 使用第三方工具

Nginx缓存管理器

  • ngx_cache_manager:Python编写的管理工具
  • nginx-cache-purge:PHP实现的Web界面
  • Cache Purge API:RESTful API接口

7. 最佳实践建议

访问控制:清理接口必须严格限制IP访问 日志记录:记录所有清理操作 批量清理:实现正则匹配批量清理 预热缓存:清理后自动预热常用数据 监控报警:监控缓存命中率和清理频率
# 安全清理示例
#!/bin/bash
# 只允许从管理服务器调用
if [ "$REMOTE_ADDR" != "10.0.0.100" ]; then
    exit 1
fi

# 清理并记录日志
PURGE_URL=$1
echo "$(date): Purged $PURGE_URL" >> /var/log/nginx/purge.log
curl -s "http://localhost/admin/purge$PURGE_URL"

选择哪种方式取决于:

  • 是否需要精确控制
  • 安全要求级别
  • 是否已安装特定模块
  • 自动化需求程度

对于生产环境,推荐使用ngx_cache_purge模块+Lua脚本的组合方式,既能保证安全性,又能提供灵活的清理策略。

相关帖子
带薪年休假期间的工资,是按照基本工资还是平均工资来计算?
带薪年休假期间的工资,是按照基本工资还是平均工资来计算?
刮大风导致窗外物品坠落,物主是否能够免除或减轻责任?
刮大风导致窗外物品坠落,物主是否能够免除或减轻责任?
这些新兴团队运动在促进社交、释放压力方面有哪些独特优势?
这些新兴团队运动在促进社交、释放压力方面有哪些独特优势?
2026年,为子女购买住房,父母是否可以提取自己的住房公积金使用?
2026年,为子女购买住房,父母是否可以提取自己的住房公积金使用?
自驾去乡村游玩,如何快速查询那些新修建的、导航尚未收录的“村村通”小路?
自驾去乡村游玩,如何快速查询那些新修建的、导航尚未收录的“村村通”小路?
产后哺乳期禁食什么?哺乳期可以化妆吗
产后哺乳期禁食什么?哺乳期可以化妆吗
持居住证积分达到标准后,申请保障性租赁住房的优先级如何确定?
持居住证积分达到标准后,申请保障性租赁住房的优先级如何确定?
购买首套房时,如何通过公开渠道有效核实房屋的产权状态与历史信息?
购买首套房时,如何通过公开渠道有效核实房屋的产权状态与历史信息?
坚持每天锻炼两小时,在运动过程中应该如何正确监测自身心率与状态?
坚持每天锻炼两小时,在运动过程中应该如何正确监测自身心率与状态?
村民操办红白事时,使用村委会广场等公共资源,其合理范围是什么?
村民操办红白事时,使用村委会广场等公共资源,其合理范围是什么?
工会组织的职工疗休养活动通常如何安排,参与资格和流程在近年有何变化?
工会组织的职工疗休养活动通常如何安排,参与资格和流程在近年有何变化?
通过“带押过户”方式交易,需要缴纳的税费和传统交易方式有什么不同吗?
通过“带押过户”方式交易,需要缴纳的税费和传统交易方式有什么不同吗?
对于心智障碍者,2026年有哪些数字工具或设计方法可以帮助他们理解复杂信息?
对于心智障碍者,2026年有哪些数字工具或设计方法可以帮助他们理解复杂信息?
AI怎么画简笔画竹笋? ai快速手绘山竹笋形状图案的技巧
AI怎么画简笔画竹笋? ai快速手绘山竹笋形状图案的技巧
小体量博主在2026年应关注哪些比流量更重要的核心成长指标?
小体量博主在2026年应关注哪些比流量更重要的核心成长指标?
患者的病历资料中,是否包含所有检查报告、医嘱记录和手术过程记录?
患者的病历资料中,是否包含所有检查报告、医嘱记录和手术过程记录?
ClickHouse使用MySQL数据库引擎的实现
ClickHouse使用MySQL数据库引擎的实现
在2026年,自由职业者或平台骑手如何为自己配置类似工伤保险的保障?
在2026年,自由职业者或平台骑手如何为自己配置类似工伤保险的保障?