Nginx缓存是提升网站性能、减少后端负载的关键手段,优化需围绕缓存命中率、资源利用率、数据一致性三大核心目标展开。以下是具体的优化策略:
合理定义缓存路径与参数
使用proxy_cache_path指令配置缓存存储,关键参数需根据服务器资源调整:
levels=1:2:设置缓存目录层级(如/var/cache/nginx/a/b/c),避免单目录文件过多导致I/O瓶颈;keys_zone=my_cache:10m:定义缓存区域名称(my_cache)及共享内存大小(10MB,用于存储缓存键与元数据);max_size=10g:限制缓存最大容量(10GB),超过后自动清理最久未使用的缓存(LRU算法);inactive=60m:缓存项60分钟未被访问则过期(即使未达到proxy_cache_valid设置的时间)。http {
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;
}
注:
use_temp_path=off可避免缓存写入临时文件,提升I/O性能。
启用缓存并设置状态码有效期
在location块中通过proxy_cache指令启用缓存,并用proxy_cache_valid定义不同状态码的缓存时间:
server {
location /static/ {
proxy_cache my_cache;
proxy_pass http://backend;
proxy_cache_valid 200 302 1h;
proxy_cache_valid 404 1m;
add_header X-Proxy-Cache $upstream_cache_status; # 监控缓存状态
}
}
注:
$upstream_cache_status返回HIT(命中)、MISS(未命中)、EXPIRED(过期),便于排查问题。
静态资源(图片、CSS、JS、字体等)具有访问频率高、内容变化少的特点,需配置长期缓存+版本控制:
设置长期缓存时间
使用expires指令设置浏览器缓存时间(如1年),并通过Cache-Control头强化缓存策略:
location ~* \.(jpg|jpeg|png|gif|css|js|woff2|ico)$ {
expires 1y;
add_header Cache-Control "public, immutable"; # 告知浏览器资源不可变
add_header Pragma "public";
access_log off; # 减少日志I/O
}
注:
immutable表示资源内容不会改变,浏览器无需向服务器验证,进一步提升加载速度。
文件版本控制
在资源URL中添加哈希或版本号(如style.a1b2c3.css),当文件更新时修改版本号,强制浏览器重新下载新资源,避免缓存旧文件:
location ~* ^(.+)\.(?:[0-9a-f]+)\.(js|css|png|jpg)$ {
try_files $1.$2 $uri =404; # 确保文件存在
}
示例URL:https://example.com/static/style.a1b2c3.css(a1b2c3为文件哈希)。
动态内容(如API、用户个性化页面)需平衡缓存性能与数据实时性:
选择性缓存
对变更频率低的动态内容(如CMS文章页、商品详情页)设置短时间缓存(如5-10分钟):
location /article/ {
proxy_cache my_cache;
proxy_pass http://backend;
proxy_cache_valid 200 10m;
proxy_cache_use_stale error timeout updating; # 后端故障时使用陈旧缓存
}
注:
proxy_cache_use_stale允许在后端故障时返回旧缓存,提升可用性。
条件缓存
根据请求头或参数控制缓存行为,避免缓存敏感数据:
Cookie的请求(如用户登录状态):if ($http_cookie ~* "sessionid") {
proxy_no_cache 1;
proxy_cache_bypass 1;
}
GET请求(POST请求通常不缓存):proxy_cache_methods GET HEAD; # 只缓存GET和HEAD方法
缓存键优化
自定义proxy_cache_key,包含影响内容的关键变量(如$scheme、$host、$request_uri),避免不同请求返回相同缓存:
proxy_cache_key "$scheme$host$request_uri$is_args$args";
注:若URL中包含查询参数(如
?id=123),需根据业务需求决定是否加入(如商品详情页需包含id)。
缓存锁定
使用proxy_cache_lock指令防止多个相同请求同时击穿后端:
proxy_cache_lock on; # 开启缓存锁
proxy_cache_lock_timeout 5s; # 锁等待超时时间(5秒)
注:当一个请求正在获取缓存时,其他相同请求会等待,直到锁释放或超时。
主动刷新
使用proxy_cache_purge指令(需安装ngx_cache_purge模块)清理指定缓存,配合文件版本控制或后端通知实现:
location ~ /purge(/.*) {
allow 127.0.0.1; # 仅允许本地管理接口
deny all;
proxy_cache_purge my_cache "$scheme$host$1";
}
示例:访问http://localhost/purge/static/style.css可清理style.css的缓存。
自动过期
通过inactive参数设置缓存自动清理时间(如60分钟未访问则过期),结合max_size限制缓存总大小,避免磁盘空间耗尽。
监控缓存命中率
通过$upstream_cache_status变量记录缓存状态,在location块中添加响应头:
add_header X-Proxy-Cache $upstream_cache_status;
使用日志分析工具(如GoAccess、ELK)统计HIT/MISS比例,目标命中率需达到80%以上。
性能调优
sendfile(零拷贝技术):sendfile on;gzip压缩:gzip on; gzip_types text/css application/javascript;keepalive_timeout(保持连接时间):keepalive_timeout 65s;通过以上策略组合,可显著提升Nginx缓存效率,降低后端服务器负载,改善用户体验。需根据业务场景(如静态/动态内容比例、更新频率)灵活调整参数,定期监控并优化。