一、什么是Nginx缓存?为什么需要它?¶
想象一下,当你去图书馆借书时,如果每次都要重新从书架最底层找书,会很浪费时间。Nginx缓存就像图书馆的“常看书架”——把用户频繁访问的内容临时存放在快速存储中(比如内存或磁盘),下次用户请求相同内容时,Nginx直接从缓存中读取,而不用重复向后端服务器(比如PHP、Java服务)请求。
为什么要用Nginx缓存?
- 加快访问速度:用户无需等待后端服务器处理,直接从缓存取数据,页面加载更快。
- 减轻服务器压力:重复请求减少,后端服务器负载降低,能支撑更多并发用户。
- 节省带宽:缓存内容无需重复传输,减少服务器到用户的流量消耗。
二、Nginx缓存的主要类型(适合初学者的简化版)¶
Nginx提供多种缓存方式,不同场景用不同类型,新手先掌握最常用的两种:
1. 代理缓存(反向代理场景)¶
适用场景:Nginx作为反向代理(比如代理后端的PHP、Python服务),缓存用户请求的静态资源或响应内容。
原理:用户请求→Nginx代理→Nginx先查缓存,有则直接返回,无则回源到后端服务器,同时把结果存入缓存。
2. 网页缓存(HTTP缓存)¶
适用场景:缓存前端资源(HTML、CSS、JS、图片等),让浏览器直接从本地缓存中加载内容,甚至不需要请求Nginx。
原理:后端服务器返回带Cache-Control头的响应(比如max-age=3600表示缓存1小时),浏览器收到后,下次请求相同资源时直接用本地缓存。
新手必记:别缓存什么?¶
- 动态内容:比如带用户登录信息的页面(
/user/profile)、实时数据(/api/weather),这类内容每次请求都不同,缓存会导致用户看到旧数据。 - 频繁变化的内容:比如商品库存、实时计数器,建议关闭缓存。
三、快速上手:配置Nginx代理缓存(最常用场景)¶
步骤1:定义缓存路径和参数¶
在nginx.conf或站点配置文件(比如/etc/nginx/sites-available/your-site)中,先定义缓存的存储位置和规则:
# 定义缓存路径:/var/cache/nginx/proxy_cache 是缓存文件存放目录
# levels=1:2 表示缓存目录层级(比如第一层a-z,第二层0-9)
# keys_zone=my_cache:10m 共享内存区域,大小10MB,用于存储缓存键和元数据
# max_size=10g 缓存磁盘最大占用10GB,超过后按LRU策略删除旧缓存
# inactive=30m 30分钟内未访问的缓存自动删除(避免“僵尸”缓存)
proxy_cache_path /var/cache/nginx/proxy_cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=30m use_temp_path=off;
注意:Nginx用户(通常是
www-data)需要对/var/cache/nginx/proxy_cache目录有读写权限,否则缓存创建失败。
步骤2:在location中启用缓存¶
假设你要缓存后端服务器(比如http://127.0.0.1:8080)的静态资源(比如图片、CSS),在对应location块中添加缓存配置:
server {
listen 80;
server_name your-site.com;
# 缓存所有以/static/开头的请求(前端静态资源)
location /static/ {
proxy_pass http://127.0.0.1:8080/static/; # 后端静态资源地址
proxy_cache my_cache; # 启用缓存,关联前面定义的缓存区域
proxy_cache_key "$scheme$request_method$host$request_uri"; # 缓存键(URL+请求方法)
proxy_cache_valid 200 304 12h; # 状态码200/304(成功/未修改)缓存12小时
proxy_cache_valid any 1m; # 其他状态码(如404)缓存1分钟
add_header X-Proxy-Cache $upstream_cache_status; # 响应头显示缓存状态(HIT/MISS/EXPIRED等)
proxy_cache_use_stale error timeout http_500 http_502 http_503; # 后端错误时用过期缓存
}
}
步骤3:验证配置并重启Nginx¶
修改完配置后,先检查语法:
nginx -t # 检查配置是否有错误
如果输出nginx: configuration file /etc/nginx/nginx.conf test is successful,则重启Nginx:
nginx -s reload
四、缓存管理:如何清理和优化?¶
1. 查看缓存状态(必学!调试用)¶
在nginx.conf中添加统计配置,查看缓存命中情况:
http {
# 缓存统计模块(需Nginx编译时包含ngx_cache_status模块,通常默认有)
proxy_cache_path /var/cache/nginx/proxy_cache ...; # 之前的缓存路径定义
log_format cache_log '$remote_addr [$time_local] "$request" '
'$status $body_bytes_sent '
'cache_status:$upstream_cache_status'; # 记录缓存状态
server {
access_log /var/log/nginx/cache_access.log cache_log; # 缓存日志路径
# ...其他配置
}
}
重启后,查看/var/log/nginx/cache_access.log,每行末尾会显示cache_status:HIT(命中)或MISS(未命中)。
2. 清理缓存(两种方法)¶
- 方法1:手动删除缓存文件
缓存文件存放在proxy_cache_path指定的目录(比如/var/cache/nginx/proxy_cache),按缓存键的哈希值(比如MD5(URL))生成子目录,直接删除目标文件或目录即可:
rm -rf /var/cache/nginx/proxy_cache/* # 清空所有缓存
- 方法2:用第三方模块快速清理(进阶)
使用ngx_cache_purge模块可通过HTTP请求直接清理缓存(比如访问/purge/URL),需先安装模块:
location ~ /purge(/.*) {
proxy_cache_purge my_cache "$scheme$request_method$host$1"; # 清理指定URL缓存
allow 127.0.0.1; # 仅允许本地或指定IP访问
deny all;
}
之后访问http://your-site.com/purge/static/xxx.jpg即可删除对应缓存。
3. 优化技巧(新手必看!)¶
- 缓存动态内容?别!:仅缓存静态资源(图片、CSS、JS),动态内容(如PHP生成的页面)需关闭缓存:
location ~ \.php$ {
proxy_pass http://backend;
proxy_cache off; # 关闭动态内容缓存
}
-
设置合理的缓存时间:静态资源(如图片)可设
12h,CSS/JS设1d,避免频繁更新的内容设10m。用proxy_cache_valid控制(见步骤2的示例)。 -
避免缓存用户特定内容:如果有用户登录后显示个性化内容,需通过
proxy_cache_key排除用户ID:
proxy_cache_key "$scheme$request_method$host$uri"; # 排除User-Agent,避免重复缓存同一URL不同参数
五、常见问题:缓存不生效?这样排查!¶
1. 缓存未命中(MISS)?¶
- 检查配置:是否在location块中添加了
proxy_cache my_cache?是否忘记proxy_pass后端地址? - 检查后端头信息:后端服务器是否返回
Cache-Control: max-age=3600?Nginx反向代理时,需确保后端返回Cache-Control头(Nginx不会自动生成)。 - 权限问题:缓存目录
/var/cache/nginx/proxy_cache是否为Nginx用户(通常是www-data)可写?用chown -R www-data:www-data /var/cache/nginx修复。
2. 缓存内容过时(用户看到旧数据)?¶
- 检查
Cache-Control头:后端是否设置max-age或Expires?比如后端返回Cache-Control: no-cache会导致Nginx不缓存。 - 手动更新缓存:执行
nginx -s reload后,缓存自动更新,但如果是长期未更新的内容,需主动清理缓存(见上文方法)。
六、总结:Nginx缓存入门关键点¶
- 核心目的:用“空间换时间”,减少重复请求,提升网站速度。
- 配置重点:只缓存静态资源,合理设置
proxy_cache_valid和缓存路径。 - 必学工具:查看缓存日志、手动/模块清理缓存、监控命中状态。
- 避坑指南:动态内容别缓存,权限问题优先排查,后端头信息要正确。
Nginx缓存配置不难,多动手试几次就能熟练!如果遇到复杂场景(如CDN结合),可以后续深入学习,但入门阶段掌握上述内容已足够解决大部分问题。