Nginx是大厂必备技能,下面我详解Nginx缓存性能实战@mikechen
Nginx缓存
Nginx作为高性能反向代理和Web服务器,其内置缓存机制(proxy_cache / fastcgi_cache)是实现极致性能的核心武器。

正确配置后,能将后端负载降低90%以上,TTFB(Time To First Byte)从几百毫秒降到几毫秒。
Nginx缓存原理
Nginx缓存请求流程,如下所示:

请求到达:Nginx 接收到请求,根据定义的 proxy_cache_key 生成唯一哈希值(Key) 。
查找缓存:在共享内存中查找该 Key 对应的元数据(是否过期、文件路径等) 。
命中与回源:
命中(HIT):直接从磁盘读取内容返回给客户端 。
MISS:请求转发到后端,获取响应后将其写入本地磁盘,并更新共享内存元数据 。
失效管理:通过 inactive 时间自动清理长期未被访问的文件,或通过 max_size 限制最大磁盘占用 。
Nginx缓存实战
1. 缓存区域定义 (proxy_cache_path)
这是缓存的基石,建议在 http 块中配置 。
http {
# proxy_cache 示例(适用于反向代理后端 HTTP 服务)
proxy_cache_path /var/cache/nginx/proxy_cache
levels=1:2 # 目录层级,避免单目录文件过多导致 I/O 慢
keys_zone=my_cache:100m # 共享内存区(索引),100m 可存约 80 万条记录
max_size=10g # 最大磁盘占用,超出后 LRU 淘汰
inactive=60m # 60 分钟未访问自动清理
use_temp_path=off; # 直接写缓存目录,避免临时文件 I/O 开销
# fastcgi_cache 示例(适用于 PHP-FPM 等 FastCGI 后端)
fastcgi_cache_path /var/cache/nginx/fastcgi_cache
levels=1:2
keys_zone=php_cache:100m
max_size=5g
inactive=60m
use_temp_path=off;
}
levels=1:2:缓存文件分散到两层子目录(如 /e/7b/xxx),极大提升文件查找速度。
keys_zone:放在共享内存中,Nginx Worker 进程能快速判断 HIT/MISS,无需每次查磁盘。
use_temp_path=off:减少不必要的磁盘写入,提高性能。
2. 精细化缓存策略 (proxy_cache_valid)
决定缓存生效时间,避免缓存过久导致内容更新不及时 。
配置示例:
proxy_cache_valid 200 302 10m; proxy_cache_valid 404 1m;
原理与技巧:明确指定仅缓存 HTTP 200/302 成功响应。
不要缓存 5xx 错误,否则会导致服务瘫痪期间用户持续看到错误页面 。
3. 防止缓存击穿 (proxy_cache_lock)
在高并发场景下,如果大量请求同时 MISS,都会穿透到后端造成“缓存击穿” 。
配置示例:
proxy_cache_lock on; proxy_cache_lock_timeout 5s;
开启 lock 后,当多个相同请求同时到达时,只有一个请求能回源后端。
其余请求在 Nginx 内部等待,直到第一个请求写入缓存,这能瞬间降低后端压力 。
4.静态文件
静态文件(图片、CSS、JS)适合浏览器端 + Nginx 端双缓存,能让页面加载速度提升数倍。
server {
listen 80;
server_name example.com;
# 静态资源长缓存
location ~* \.(jpg|jpeg|png|gif|ico|css|js|svg|woff2)$ {
expires 30d; # 浏览器缓存 30 天
add_header Cache-Control "public, immutable"; # 告诉浏览器无需重新验证
access_log off; # 减少日志 I/O
try_files $uri =404;
}
}
结合 gzip 压缩,进一步减少传输量:
gzip on; gzip_vary on; gzip_min_length 1k; gzip_comp_level 6; # 平衡 CPU 与压缩率 gzip_types text/plain text/css application/javascript application/json;
然后,结合监控命中率。
在 access_log 中记录 $upstream_cache_status,或用 nginx -V 检查模块。