在 nginx 中配置静态资源缓存加速,核心是启用 proxy_cache 并设置缓存路径、过期时间和键规则。通过 proxy_cache_path 定义磁盘存储位置,利用 expires 或 add_header cache-control 控制浏览器与代理缓存的有效期,即可实现动静分离下的快速响应。

如何定义缓存存储路径和基础参数
使用 proxy_cache_path 指令在 Nginx 主配置块中指定缓存目录及内存共享区域大小。该指令必须放在 http 块内,且需确保 Nginx 进程用户对指定目录有读写权限。例如,设置 /var/cache/nginx/static 为物理路径,static_cache 为内存中的键值对共享区名称,max_size=1g 限制磁盘占用上限,inactive=60m 表示非活跃 60 分钟后删除缓存文件。
proxy_cache_path /var/cache/nginx/static levels=1:2 keys_zone=static_cache:10m max_size=1g inactive=60m use_temp_path=off;
上述配置中,levels=1:2 决定子目录层级结构,use_temp_path=off 避免跨文件系统移动文件的开销。若未设置 keys_zone,后续 proxy_cache 将无法引用该缓存区域。此步骤仅完成存储规划,尚未生效于具体请求。
如何在 location 块中启用缓存并设置过期策略
在 location 块中通过 proxy_cache 引用已定义的共享区,并结合 proxy_cache_valid 和 expires 控制缓存行为。对于静态资源如图片、CSS、JS,通常设置较长的有效期。同时需配置 proxy_cache_key 以确保不同 URL 生成独立缓存项。
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
proxy_pass http://backend_server;
proxy_cache static_cache;
proxy_cache_key $scheme$proxy_host$request_uri;
proxy_cache_valid 200 304 30d;
add_header X-Cache-Status $upstream_cache_status;
expires 30d;
}
其中 $upstream_cache_status 变量可返回 HIT、MISS 或 EXPIRED,便于调试。当客户端请求匹配扩展名时,Nginx 先检查本地缓存:命中则直接返回并标记 HIT;未命中则向后端获取,存入缓存后返回 MISS。若后端返回 304 Not Modified,Nginx 会更新缓存时间戳但仍视为有效内容。注意 proxy_cache_valid 仅影响代理层缓存,expires 影响浏览器缓存,两者配合可实现双层加速。
基于 proxy_cache_key 冲突导致缓存错乱的具体问题
当多个不同路径的静态资源因 proxy_cache_key 设计不当产生相同哈希值时,会出现缓存错乱现象。例如,若 proxy_cache_key 仅使用 $request_uri 而未包含 $scheme 或 $proxy_host,在反向代理多域名场景下,不同域名的相同 URI 可能共享同一缓存条目,导致用户访问 A 域名时错误返回 B 域名的资源。
# 错误示例:缺少主机标识 proxy_cache_key $request_uri; # 正确示例:完整唯一键 proxy_cache_key $scheme$proxy_host$request_uri;
验证方法:启动两个后端服务分别监听 8080 和 8081 端口,部署相同路径但不同内容的静态文件。配置上述错误 key 后,首次请求 localhost:8080/test.js 将 MISS 并缓存;随后请求 localhost:8081/test.js 将 HIT 同一缓存,返回错误内容。修正 key 后,两者独立缓存,行为正常。因此,proxy_cache_key 必须包含足以区分不同逻辑来源的字段,避免哈希碰撞引发数据污染。


















