开启Nginx HTTP代理缓存可减轻后端压力、提升响应速度,适用于读多写少的API;需合理配置缓存键、有效期、层级及清理逻辑,并仅缓存GET、public响应、无用户依赖、低频更新的接口。

开启Nginx HTTP代理缓存,能显著减少后端服务压力,加快接口响应速度,尤其适用于读多写少、内容变化不频繁的API场景。关键不是简单加几行配置,而是要合理设置缓存键、有效期、缓存层级和缓存清理逻辑。
明确哪些接口适合缓存
并非所有HTTP接口都适合缓存。应优先缓存:
- GET请求(幂等、无副作用)
- 响应头中包含Cache-Control: public, max-age=XXX或Expires的接口
- 不依赖用户身份、Cookie或动态Header的接口(如公开数据查询、静态配置获取)
- 后端响应体稳定、更新频率低(如城市列表、字典项、公告信息)
避免缓存含敏感信息、个性化内容或实时性要求高的接口(如用户订单详情、实时股价)。
基础代理缓存配置示例
在http块中定义缓存区:
proxy_cache_path /var/cache/nginx/api_cache levels=1:2 keys_zone=api_cache:10m max_size=1g inactive=60m use_temp_path=off;
在location中启用缓存:
location /api/v1/ {
proxy_pass http://backend;
proxy_cache api_cache;
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
proxy_cache_lock on;
proxy_cache_lock_timeout 5s;
add_header X-Cache-Status $upstream_cache_status;
}
说明:
proxy_cache_valid按状态码设定缓存时间;
proxy_cache_use_stale允许在后端异常时返回旧缓存;
proxy_cache_lock防止缓存穿透引发的“缓存雪崩”式并发回源。
精准控制缓存键与忽略变量
默认缓存键包含$scheme$proxy_host$request_uri,但实际中常需排除干扰项:
- 去掉变动参数:用proxy_ignore_headers Set-Cookie避免因Set-Cookie导致缓存失效
- 统一大小写或过滤URL参数:通过proxy_cache_key自定义,例如
proxy_cache_key "$scheme$host$request_uri$is_args$arg_id$arg_type";
这样只对id和type两个参数敏感,忽略其他动态参数(如t=123456789时间戳)。
验证与调试缓存是否生效
检查响应头中的X-Cache-Status字段(需配合add_header配置):
- HIT:命中缓存,直接返回
- MISS:未命中,已回源并缓存
- BYPASS:因配置(如proxy_cache_bypass)跳过缓存
- EXPIRED:缓存过期,回源更新
还可使用curl -I观察Age头判断缓存驻留时间,或直接查看/var/cache/nginx/api_cache目录下文件生成情况。










