Nginx是大厂必备技能,下面我详解Nginx缓存技术@mikechen
Nginx缓存
Nginx 缓存(Proxy Cache)是指 Nginx 将后端服务器响应的内容(如 HTML、图片、JSON 数据等)保存在本地磁盘或内存中。
当下一个相同的请求到来时,Nginx 无需再将请求转发给后端,而是直接将内存或磁盘中的缓存内容返回给客户端。

它主要解决三类问题:
降低后端压力,热点静态资源、列表页、详情页不再反复打到 Java/Node/PHP 服务。
降低响应延迟,Nginx 直接从本地磁盘返回,避免网络往返、应用计算和数据库查询。
提高可用性,后端短暂故障或超时时,可继续返回旧缓存,避免页面完全不可用。
Nginx缓存原理
Nginx 缓存的核心本质:是一个基于键值对(Key-Value)的本地文件系统缓存机制。

Nginx 处理请求的大致流程如下:
- 计算缓存键:根据请求方法、主机名、URI、查询参数等信息生成缓存标识。
- 查询缓存:Nginx 在缓存区域中查找该对象。如果缓存仍有效,则直接将缓存内容返回给客户端。
- 请求上游:如果缓存不存在、已过期或被要求绕过缓存,Nginx 就向上游服务器发起请求。
- 保存响应:当响应满足缓存条件时,Nginx 将其写入缓存,并根据配置设定有效期。
- 过期与更新:缓存到期后,Nginx 可以重新请求上游并更新内容;也可以在更新期间继续返回旧内容,避免大量请求同时涌向上游。
Nginx缓存配置
整体配置,如下:
http {
proxy_cache_path /var/cache/nginx
levels=1:2
keys_zone=api_cache:100m
max_size=20g
inactive=7d
use_temp_path=off;
upstream backend {
server 127.0.0.1:8080;
keepalive 64;
}
server {
listen 80;
server_name example.com;
location /api/ {
proxy_pass http://backend;
proxy_cache api_cache;
proxy_cache_key "$scheme$request_method$host$request_uri";
proxy_cache_valid 200 301 302 10m;
proxy_cache_valid 404 1m;
proxy_cache_valid any 30s;
# 防缓存击穿:同一 key 只允许一个请求回源
proxy_cache_lock on;
proxy_cache_lock_timeout 5s;
proxy_cache_lock_age 10s;
# 后端异常时使用旧缓存
proxy_cache_use_stale error timeout updating
http_500 http_502 http_503 http_504;
# 过期后后台更新,旧值继续服务
proxy_cache_background_update on;
# 便于观察命中率
add_header X-Cache-Status $upstream_cache_status;
proxy_http_version 1.1;
proxy_set_header Connection "";
}
}
}
proxy_cache_path 定义缓存目录、索引内存、容量和淘汰策略;
proxy_cache 在对应 location 中启用该缓存。
以上