温馨提示×

nginx缓存策略是什么

小樊
53
2025-09-19 10:00:16
栏目: 编程语言

Nginx缓存策略概述
Nginx缓存是通过将后端响应或静态资源存储在本地(磁盘/内存),减少重复请求对后端的压力,提升响应速度的核心性能优化手段。其核心逻辑包括缓存键生成(标识缓存项)、缓存存储(路径/大小管理)、缓存有效期控制(存活时间)及缓存命中处理(直接返回/回源)。

一、基础缓存配置

1. 定义缓存路径与区域

通过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分钟后失效(即使未过期也会被删除)。

2. 启用缓存并设置有效期

locationserver块中,通过以下指令启用缓存并控制有效期:

  • proxy_cache my_cache:指定使用的缓存区域(需与keys_zone名称一致);
  • proxy_cache_valid:定义不同HTTP状态码的缓存时间(如200 302 10m表示200/302状态码缓存10分钟,404 1m表示404状态码缓存1分钟)。

二、常见缓存策略

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
}

此策略可显著减少静态资源的重复请求,提升页面加载速度。

2. 动态内容短期缓存

针对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;
}

此策略平衡了动态内容的实时性与后端负载。

3. 分层缓存(CDN+浏览器+Nginx)

结合CDN、浏览器缓存和Nginx代理缓存,构建多级缓存体系,减少回源次数:

  • CDN缓存:将静态资源配置为CDN回源到Nginx(proxy_pass https://cdn.example.com),CDN节点缓存30天;
  • 浏览器缓存:通过expiresCache-Control指令让浏览器缓存静态资源;
  • Nginx缓存:作为后端缓存,缓存动态内容和未命中CDN的静态资源。
    此策略可大幅降低源站压力,提升全球访问速度。

4. 缓存失效与清理

通过以下方式主动控制缓存更新:

  • 缓存绕过:当请求携带特定参数(如nocache=1)或Cookie(如sessionid)时,跳过缓存:
    proxy_cache_bypass $cookie_sessionid $arg_nocache;  # 有sessionid或nocache参数时,不缓存
    proxy_no_cache $cookie_sessionid $arg_nocache;     # 同上,不缓存且不回源
    
  • 主动刷新:通过Nginx的PURGE方法或管理接口删除指定URL的缓存(需配置map指令和proxy_cache_purge模块)。

三、高级缓存优化技巧

1. 使用Stale缓存

通过proxy_cache_use_stale指令,在缓存更新(如后端错误、超时)时,继续使用旧缓存响应,避免用户等待:

proxy_cache_use_stale error timeout updating http_500 http_503;  # 缓存失效时可使用过期缓存

此策略可提升用户体验,尤其在缓存更新期间。

2. 缓存分区

通过自定义proxy_cache_key,将缓存按用户角色(如cookie_user)或请求参数(如$arg_type)分区,避免不同用户的缓存互相干扰:

proxy_cache_key "$scheme$request_method$host$request_uri$cookie_user";  # 包含用户cookie

此策略适用于个性化内容(如用户中心页面)的缓存。

3. 后台更新缓存

通过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路径查看缓存的命中率、大小等信息。

0