对于读多写少的业务,合理配置 Nginx proxy_cache 能显著降低后端负载,但直接启用默认配置存在缓存敏感数据或击穿风险。优化重点在于区分动静内容、配置防击穿锁及设置合理的过期与清理策略。
核心结论:缓存优化不仅是开启功能,更需兼顾安全与稳定性。
- 安全隔离:必须配置 proxy_cache_bypass 排除 Cookie 和授权头,防止隐私泄露
- 稳定防护:启用 proxy_cache_lock 防止缓存击穿,配置 proxy_cache_use_stale 保障后端故障时服务可用
- 运维闭环:明确缓存目录权限,建立缓存清理或失效机制
生产环境配置示例
以下配置包含了缓存路径、内存区、有效期、安全 bypass 规则及高可用策略,适用于大多数反向代理场景:
http {
# 定义缓存路径,levels 优化文件检索,inactive 自动清理未访问缓存
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m use_temp_path=off;
server {
location / {
proxy_pass http://backend;
proxy_cache my_cache;
# 不同状态码设置不同有效期,错误页面短缓存
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
# 安全策略:带 Cookie 或 Authorization 头不缓存,防止用户数据泄露
proxy_cache_bypass $http_cookie $http_authorization;
proxy_no_cache $http_cookie $http_authorization;
# 防击穿:同一时刻只允许一个请求回源更新缓存
proxy_cache_lock on;
proxy_cache_lock_timeout 5s;
# 高可用:后端错误时返回 stale 缓存
proxy_cache_use_stale error timeout http_500 http_502 http_503 http_504;
# 调试头,生产环境建议通过条件判断添加
add_header X-Cache-Status $upstream_cache_status;
}
}
}目录权限与初始化
配置生效前需确保缓存目录存在且 Nginx 进程有写入权限,否则会导致启动失败或缓存写入错误:
# 创建目录
sudo mkdir -p /var/cache/nginx
# 修改所有者为 Nginx 运行用户(常见为 nginx 或 www-data)
sudo chown -R nginx:nginx /var/cache/nginx
# 检查语法并重载
sudo nginx -t
sudo nginx -s reload验证缓存生效
使用 curl 查看响应头确认缓存状态,首次请求通常为 MISS,第二次应为 HIT:
curl -I https://your-domain.com/static/image.png观察 X-Cache-Status 字段:
HIT:命中缓存,未请求后端MISS:未命中,请求了后端并写入缓存BYPASS:触发了 bypass 规则,直接请求后端
同时配合 access.log 分析 upstream 请求量变化,确认后端压力是否降低。
缓存清理与更新
后端内容更新后,需主动清理缓存避免数据不一致:
- 手动清理:直接删除缓存目录文件,需谨慎操作避免影响正在服务的进程。
sudo rm -rf /var/cache/nginx/* - 模块清理:若编译了 ngx_cache_purge 模块,可通过特定 URL 清理。
location ~ /purge(/.*) { allow 127.0.0.1; deny all; proxy_cache_purge my_cache $scheme$host$1; } - 版本控制:静态资源建议通过文件名哈希(如 app.v1.js)强制刷新,避免依赖缓存清理。
常见风险排查
- 磁盘空间占满:未设置 max_size 或 inactive 可能导致磁盘写满。需监控磁盘使用率,配合 cron 定期清理。
- 缓存敏感数据:务必检查 proxy_cache_bypass 是否覆盖了所有包含用户态信息的 Header。
- 内容不一致:若发现缓存未更新,检查 proxy_cache_valid 时间是否过长,或后端是否返回了 Cache-Control: no-cache 头。