您的位置:首页 >Nginx缓存机制是什么
发布于2026-05-02 阅读(0)
扫一扫,手机访问
说到Nginx的缓存,其实可以把它理解为一个双层防御体系。第一层是服务端缓存,Nginx自己充当“中间仓库”,利用proxy_cache、fastcgi_cache这些模块,把上游服务器的响应结果存到本地磁盘。下次遇到相同请求,直接从这里发货,不仅大大减轻了后端服务器的压力,连首字节到达时间(TTFB)都能明显缩短。第二层则是客户端缓存,也就是我们常说的浏览器缓存,通过Cache-Control、ETag这些HTTP头,让浏览器自己去决定是强缓存还是协商缓存。
想知道服务端缓存到底有没有生效?关键要看$upstream_cache_status这个变量。它的返回值就像一份清晰的“体检报告”,HIT(命中)、MISS(未命中)、BYPASS(绕过)、EXPIRED(过期)……每一个状态都揭示了缓存系统的运行状况。

这个“中间仓库”是怎么运作的呢?流程其实相当精妙:
$scheme$proxy_host$request_uri这个组合,但你完全可以根据业务需要,用proxy_cache_key指令加入Cookie或特定参数来定制。keys_zone的共享内存区域快速查一下。如果找到了有效条目,恭喜,直接命中返回;如果没找到,那就只能向上游服务器发起请求了。proxy_cache_valid规则,要么听源头服务器的,看它的Cache-Control或Expires头。存储时,文件会按类似levels=1:2这样的分层目录结构存放,海量文件管理起来就轻松多了。max_size时,cache manager进程会启动,按照LRU(最近最少使用)策略清理旧缓存。另外,Nginx启动时,cache loader进程会把磁盘上已有的缓存元数据逐步加载到内存,避免一次性加载对系统造成冲击。proxy_cache_lock,让第一个请求去回源,后面的请求等着,避免“惊群效应”把上游服务器压垮。理论说完了,来看看具体怎么配置。一个典型的缓存配置大概是下面这个样子:
http {
proxy_cache_path /var/cache/nginx
levels=1:2
keys_zone=my_cache:10m
max_size=10g
inactive=60m
use_temp_path=off;
server {
location / {
proxy_cache my_cache;
proxy_pass http://backend;
proxy_cache_key "$host$request_uri$is_args$args";
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_revalidate on;
proxy_cache_min_uses 3;
proxy_cache_lock on;
add_header X-Proxy-Cache $upstream_cache_status;
}
}
}
这里面有几个要点值得拎出来说说:
keys_zone只存放缓存键和元数据,大小要规划好,经验上1MB大概能存8000个键。max_size才是限制缓存数据总量的。inactive这个参数很有意思,它控制的是“一段时间没被访问”的缓存能保留多久,这和缓存过期是两码事。设置use_temp_path=off则能减少一次磁盘文件拷贝,提升效率。proxy_cache_use_stale提升可用性;proxy_cache_revalidate在缓存过期后,会用If-Modified-Since头去验证,节省带宽;proxy_cache_min_uses可以过滤掉那些只被访问一两次的“冷内容”;proxy_cache_lock则是前面提到的抑制并发回源的利器。add_header X-Proxy-Cache $upstream_cache_status这行配置,把缓存命中状态加到响应头里,无论是调试还是做监控,都一目了然。缓存虽好,但不是什么内容都适合缓存,也不是所有时候都要走缓存。Nginx提供了一套细致的控制机制:
proxy_ignore_headers Cache-Control; proxy_ignore_headers Set-Cookie;,然后配合proxy_cache_valid来强制设定有效期。proxy_cache_methods GET HEAD POST;就能搞定。proxy_cache_bypass指令(比如检查特定cookie或URL参数)满足条件就直接回源,不读缓存;而proxy_no_cache指令满足条件则根本不把这次响应写入缓存。ngx_cache_purge了,它允许你通过发送一个PURGE请求来清除匹配的缓存条目。配置上线了,怎么知道它工作得好不好?接下来就是监控和调优。
$upstream_cache_status。把它的值(HIT, MISS, EXPIRED…)记录到访问日志,或者通过响应头输出,你就能清晰地看到命中率、回源压力集中在哪,这是调优的第一步。keys_zone大小要适中,太小影响查找效率,太大浪费内存;目录层级levels=1:2是经过验证的通用最佳实践。max_size和inactive需要一起考虑,共同决定缓存容量和留存时间。再结合业务内容的更新频率,来设定proxy_cache_valid。proxy_cache_lock。对于变化不频繁但需要验证的内容,开启proxy_cache_revalidate能有效节省带宽。Cache-Control: public, max-age;对于动态接口,则建议缩短缓存时间,或者配合ETag、Last-Modified使用协商缓存策略。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
9