Nginx用proxy_cache做静态资源边缘缓存的关键是“缓得准、留得住、清得稳”:需在http块定义cache_path,location中按后缀精准启用并分级设置有效期,显式配置cache_key去噪,添加X-Cache-Status头监控命中状态。

直接用 proxy_cache 做静态资源边缘缓存,核心不是“能不能缓”,而是“缓得准、留得住、清得稳”。它本质是让 Nginx 充当一个轻量级反向代理缓存层,把后端(比如源站或应用服务器)返回的静态响应提前存下来,下次相同请求就跳过回源,本地快速响应。
一、缓存区域必须提前定义清楚
缓存路径和内存索引区(keys_zone)要在 http 块顶层声明,不能放在 server 或 location 里:
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=static_cache:128m max_size=20g inactive=3d use_temp_path=off;-
/var/cache/nginx需手动创建,并确保 Nginx 进程(如www-data或nginx)有读写权限 -
levels=1:2表示两级子目录结构,防止单目录文件爆炸 -
keys_zone=static_cache:128m中的 128MB 内存可支撑约百万级缓存 key,静态资源多时建议 ≥64m -
use_temp_path=off强制写入缓存目录,避免临时中转,提升 I/O 效率
二、精准命中静态资源并控制缓存生命周期
在 location 块中启用缓存,重点在于匹配范围窄、状态码区分细、有效期合理:
⚠️ 已弃用 — 该技能已拆分为两个独立技能,以提升模块化程度:**webchat-https-proxy**(HTTPS/WSS 反向代理)和 **webchat-voi...**
- 只对明确的静态后缀启用:
location ~* \.(js|css|png|jpg|gif|webp|woff2|ttf)$ - 指定回源地址:
proxy_pass http://origin_server;(建议用 upstream 定义后端) - 按状态码分级缓存:
proxy_cache_valid 200 301 302 1d;、proxy_cache_valid 404 1m; - 允许客户端通过
Cache-Control: no-cache跳过缓存:proxy_cache_bypass $http_cache_control; - 后端异常时仍可返回旧缓存:
proxy_cache_use_stale error timeout updating http_500;
三、缓存键(cache key)要兼顾一致性与去噪
默认 key 可能导致重复缓存或漏命中。推荐显式定义,排除干扰参数:
- 基础写法:
proxy_cache_key "$scheme$request_method$host$uri$is_args$args"; - 若 URL 含跟踪参数(如
?utm_source=xxx或&sid=abc123),应过滤掉:proxy_cache_key "$scheme$request_method$host$uri$is_args$arg_foo$arg_bar"; - 多域名共用同一缓存区时,
$host必须保留,否则不同域名资源会相互覆盖 - 避免包含
$cookie_*或$http_user_agent等易变字段,否则缓存碎片化严重
四、可观测性与运维保障不可少
上线后必须能确认是否真在缓存、缓存是否有效、异常时能否降级:
- 加响应头标记命中状态:
add_header X-Cache-Status $upstream_cache_status;(值为HIT/MISS/BYPASS/EXPIRED) - 忽略后端返回的
Cache-Control和Expires(防止源站乱设):proxy_ignore_headers Cache-Control Expires; - 启用缓存锁防击穿:
proxy_cache_lock on;,同一 key 的首个请求回源,其余等待而非并发回源 - 定期清理无效缓存:
find /var/cache/nginx -name "*" -type f -mtime +3 -delete(配合inactive参数双重保险)


















