Nginx 缓存配置详解:代理缓存与静态资源缓存策略
缓存是提升 Web 服务性能的关键技术,Nginx 作为高性能代理服务器,通过代理缓存(Proxy Cache)和客户端缓存(Expires)减少后端服务器压力,加速资源响应。本文详细讲解 Nginx 缓存的工作原理、核心配置及实战案例,帮助构建高效的缓存体系。
缓存的三种类型与 Nginx 定位
在 Web 架构中,缓存按存储位置可分为三类:
缓存类型 | 存储位置 | 作用 |
---|---|---|
服务端缓存 | 后端服务器(如 Redis、Memcached) | 缓存数据库查询结果、业务数据等 |
代理缓存 | 代理服务器(如 Nginx) | 缓存后端返回的静态资源或 API 响应,减少后端重复处理 |
客户端缓存 | 浏览器本地 | 缓存静态资源(如图片、CSS),减少网络请求 |
Nginx 的角色:主要实现代理缓存,同时通过expires
指令控制客户端缓存策略,是连接后端服务与客户端的 “中间缓存层”。
Nginx 代理缓存(Proxy Cache):减少后端请求
Nginx 代理缓存将后端服务器的响应数据存储在本地磁盘或内存中,当后续有相同请求时,直接返回缓存内容,无需转发至后端。
核心配置指令
代理缓存的配置需两步:先在http
块定义缓存存储路径和参数(proxy_cache_path
),再在location
块启用缓存(proxy_cache
)。
指令 | 作用 | 适用块 |
---|---|---|
proxy_cache_path |
定义缓存存储路径、内存区域、有效期等 | http |
proxy_cache |
启用缓存,指定关联的内存区域 | http /server /location |
proxy_cache_key |
定义缓存的唯一标识(key) | 同上 |
proxy_cache_valid |
对不同状态码设置缓存有效期 | 同上 |
proxy_cache_min_uses |
最少请求次数达到后才缓存 | 同上 |
基础配置示例
1 | http { |
缓存命中逻辑与状态码
- 缓存命中(HIT):请求的
key
在缓存中存在,且未过期,直接返回缓存内容; - 缓存未命中(MISS):
key
不存在或已过期,转发请求到后端,并存入缓存; - 不缓存(BYPass):因配置规则(如
proxy_no_cache
)跳过缓存。
通过X-Cache-Status
响应头可查看缓存状态,便于调试。
缓存排除:无需缓存的场景
部分请求(如登录、购物车等动态内容)不应缓存,可通过proxy_no_cache
排除:
1 | location / { |
客户端缓存控制:expires
指令
expires
指令通过设置响应头的Expires
或Cache-Control
,告诉浏览器缓存静态资源(如图片、CSS),减少重复请求。
基础配置
1 | server { |
客户端缓存与 304 状态码
当浏览器缓存的资源过期时,会发送请求验证资源是否更新,验证方式有两种:
- Last-Modified:浏览器发送
If-Modified-Since
头,后端检查资源最后修改时间,未修改则返回304 Not Modified; - ETag:浏览器发送
If-None-Match
头,后端比对资源唯一标识(如哈希值),未修改则返回 304。
Nginx 会自动处理这两种验证,无需额外配置,304 响应不返回实体内容,仅告知浏览器使用本地缓存。
静态资源缓存实战配置
针对静态资源(如图片、JS、CSS),结合代理缓存和客户端缓存,实现 “双层缓存”:
1 | http { |
缓存优化与注意事项
- 缓存 key 设计:
- 动态内容:
$host$uri$is_args$args
(包含参数,确保不同参数请求不冲突); - 静态资源:
$uri
(忽略参数,如/img/logo.png?version=1
和?version=2
应视为不同资源,需包含参数)。
- 动态内容:
- 缓存清理:
- 手动删除缓存文件:
rm -rf /var/nginx/cache/*
(需重启 Nginx 或发送reload
信号); - 使用第三方模块(如
ngx_cache_purge
)实现 URL 级别的缓存清理。
- 手动删除缓存文件:
- 避免缓存动态内容:
- 对
POST
请求默认不缓存(可通过proxy_cache_methods
修改,但不推荐); - 带用户认证的请求(如
Authorization
头)应排除缓存。
- 对
- 内存与磁盘平衡:
keys_zone
大小需足够存储缓存 key(1M 约存 8000 个 key);max_size
不应超过磁盘可用空间,避免缓存写入失败。
v1.3.10