Nginx缓存策略概述
Nginx缓存是通过将后端响应或静态资源存储在本地(磁盘/内存),减少重复请求对后端的压力,提升响应速度的核心性能优化手段。其核心逻辑包括缓存键生成(标识缓存项)、缓存存储(路径/大小管理)、缓存有效期控制(存活时间)及缓存命中处理(直接返回/回源)。
通过proxy_cache_path指令配置缓存存储的核心参数,是启用缓存的前提:
proxy_cache_path /path/to/cache:缓存文件的存储目录(如/var/cache/nginx);levels=1:2:缓存目录的层级结构(1级目录数量:2级目录数量,避免单目录文件过多导致I/O瓶颈);keys_zone=my_cache:10m:共享内存区域的名称(my_cache)和大小(10MB,用于存储缓存键的元数据,不影响缓存文件的总大小);max_size=1g:缓存文件的最大总大小(超过后会自动清理最近最少使用的文件);inactive=60m:缓存项在未被访问60分钟后失效(即使未过期也会被删除)。在location或server块中,通过以下指令启用缓存并控制有效期:
proxy_cache my_cache:指定使用的缓存区域(需与keys_zone名称一致);proxy_cache_valid:定义不同HTTP状态码的缓存时间(如200 302 10m表示200/302状态码缓存10分钟,404 1m表示404状态码缓存1分钟)。针对JS、CSS、图片等不常变化的静态资源,设置较长的缓存时间(如1年),并通过immutable指令告知浏览器资源不会修改,避免重复验证:
location ~* \.(js|css|png|jpg|jpeg|gif|ico|woff2|ttf)$ {
expires 365d; # 缓存1年
add_header Cache-Control "public, immutable"; # 公共缓存,不可变
access_log off; # 关闭日志减少I/O
}
此策略可显著减少静态资源的重复请求,提升页面加载速度。
针对API、动态页面等频繁变化的内容,设置较短的缓存时间(如5-10分钟),并允许使用过期缓存(stale)减少后端压力:
location /api/ {
proxy_cache my_cache;
proxy_cache_key "$scheme$request_method$host$request_uri"; # 缓存键(包含请求参数)
proxy_cache_valid 200 5m; # 200状态码缓存5分钟
proxy_cache_use_stale error timeout updating http_500 http_502; # 缓存失效时可使用过期缓存(如后端错误、超时)
proxy_pass http://backend;
}
此策略平衡了动态内容的实时性与后端负载。
结合CDN、浏览器缓存和Nginx代理缓存,构建多级缓存体系,减少回源次数:
proxy_pass https://cdn.example.com),CDN节点缓存30天;expires和Cache-Control指令让浏览器缓存静态资源;通过以下方式主动控制缓存更新:
nocache=1)或Cookie(如sessionid)时,跳过缓存:proxy_cache_bypass $cookie_sessionid $arg_nocache; # 有sessionid或nocache参数时,不缓存
proxy_no_cache $cookie_sessionid $arg_nocache; # 同上,不缓存且不回源
PURGE方法或管理接口删除指定URL的缓存(需配置map指令和proxy_cache_purge模块)。通过proxy_cache_use_stale指令,在缓存更新(如后端错误、超时)时,继续使用旧缓存响应,避免用户等待:
proxy_cache_use_stale error timeout updating http_500 http_503; # 缓存失效时可使用过期缓存
此策略可提升用户体验,尤其在缓存更新期间。
通过自定义proxy_cache_key,将缓存按用户角色(如cookie_user)或请求参数(如$arg_type)分区,避免不同用户的缓存互相干扰:
proxy_cache_key "$scheme$request_method$host$request_uri$cookie_user"; # 包含用户cookie
此策略适用于个性化内容(如用户中心页面)的缓存。
通过proxy_cache_background_update on指令(需商业版或第三方模块),在缓存过期时后台更新,不影响当前请求的响应速度:
proxy_cache_background_update on; # 后台更新缓存
此策略可提升缓存的实时性,同时保持高并发性能。
通过stub_status模块或add_header指令,监控缓存命中情况:
location块中添加add_header X-Cache-Status $upstream_cache_status;,响应头会返回HIT(缓存命中)、MISS(未命中)、EXPIRED(过期)等信息;stub_status模块,通过/nginx_cache_status路径查看缓存的命中率、大小等信息。