Nginx 缓存深度配置指南
一、基础缓存配置
1. 缓存目录定义
http {
# 定义缓存存储路径、层级、大小等
proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=STATIC_CACHE:100m inactive=7d max_size=50g;
# 参数解析
# /data/nginx/cache : 缓存存储的物理路径
# levels=1:2 : 目录层级结构(1级目录含2个十六进制字符)
# keys_zone=STATIC_CACHE:100m : 共享内存区名称及大小(100MB存储元数据)
# inactive=7d : 非活跃数据过期时间(7天未访问即删除)
# max_size=50g : 磁盘最大占用空间(达到阈值后触发LRU清理)
}
2. 缓存策略配置
server {
location / {
# 启用缓存并指定配置
proxy_cache STATIC_CACHE;
# 缓存响应状态码(默认200 301 302)
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
# 缓存键定义(默认包含$scheme$proxy_host$request_uri)
proxy_cache_key $host$request_uri$is_args$args;
# 缓存穿透防护(空结果缓存5秒)
proxy_cache_lock on;
proxy_cache_lock_timeout 5s;
proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
}
}
二、高级缓存策略
1. 动态内容缓存
location /api/ {
# 启用PURGE方法(需配合auth模块)
proxy_cache_methods GET HEAD PURGE;
# 动态内容缓存配置
proxy_cache_valid 200 206 304 20s;
proxy_cache_key "$host$request_uri$cookie_user"; # 结合Cookie实现用户级缓存
# 缓存验证机制
proxy_cache_revalidate on;
proxy_cache_background_update on; # 后台更新过期缓存
}
2. 缓存清理机制
# 手动清理指定URL缓存
location /purge {
allow 192.168.1.0/24; # 限制访问IP
deny all;
proxy_cache_purge STATIC_CACHE $host$request_uri$is_args$args;
}
# 自动清理策略(需配合Lua模块)
http {
lua_shared_dict purge_locks 10m;
init_by_lua_block {
require("resty.lock").new("purge_locks")
}
}
3. 缓存穿透防护
# 空结果缓存(防止大量穿透请求)
proxy_cache_valid any 5s; # 非200/301/302状态码缓存5秒
# 布隆过滤器集成(需第三方模块)
bloom_filter_load /etc/nginx/bloom.dat;
bloom_filter_check $request_uri;
三、性能优化配置
1. 磁盘I/O优化
# 启用磁盘预读
open_file_cache max=10000 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 2;
# SSD优化配置
proxy_cache_path /ssd_cache/ keys_zone=SSD_CACHE:50m loader_threshold=300;
2. 内存管理
# 调整内核参数
sysctl -w vm.overcommit_memory=1
sysctl -w vm.swappiness=10
# Nginx工作进程内存限制
worker_rlimit_core 500M;
working_directory /var/cache/nginx/;
3. 压缩与加密
# 缓存内容压缩
proxy_cache_min_uses 1;
proxy_cache_convert_head on;
gzip_static on; # 预压缩文件优先
# 缓存加密存储(需第三方模块)
proxy_cache_encrypt on;
proxy_cache_encrypt_key "your-secret-key";
四、监控与维护
1. 状态监控
# 启用缓存状态统计
location /cache_status {
stub_status on;
allow 127.0.0.1;
deny all;
}
# 输出示例:
# Active: 1.2G (12582912 bytes)
# Max size: 50G
# Current items: 152368
2. 日志分析
# 缓存命中率统计
log_format cache_log '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'$upstream_cache_status';
# 日志字段说明:
# $upstream_cache_status:
# - HIT: 缓存命中
# - MISS: 未命中
# - BYPASS: 绕过缓存
# - EXPIRED: 缓存过期
# - STALE: 使用陈旧缓存
3. 自动化维护
# 定期清理过期缓存
0 3 * * * /usr/sbin/nginx -s expire 7d
# 缓存目录健康检查
0 0 * * 0 find /data/nginx/cache -type f -mtime +7 -delete
五、典型场景配置模板
1. 图片/静态资源缓存
location ~* \.(jpg|jpeg|png|gif|css|js)$ {
proxy_cache STATIC_CACHE;
proxy_cache_valid 200 304 365d;
proxy_cache_revalidate on;
expires 365d; # 浏览器端缓存
add_header Cache-Control "public";
}
2. API响应缓存
location /api/data {
proxy_cache API_CACHE;
proxy_cache_valid 200 10m;
proxy_cache_key "$host$uri$args";
proxy_cache_lock on;
# 缓存穿透防护
proxy_cache_min_uses 3;
proxy_cache_background_update on;
}
3. 混合内容缓存
location / {
set $cache_key "$host$request_uri$cookie_user";
if ($request_method = POST) {
proxy_pass http://backend;
break;
}
proxy_cache HYBRID_CACHE;
proxy_cache_valid 200 302 5m;
proxy_cache_valid 404 1m;
proxy_cache_key $cache_key;
}
六、故障排查指南
1. 常见问题
- 缓存未生效:
- 检查
proxy_cache
是否启用 - 验证
proxy_cache_valid
配置状态码 - 确认
proxy_pass
指令存在
- 检查
- 缓存命中率低:
- 检查
proxy_cache_key
是否唯一 - 调整
proxy_cache_min_uses
阈值 - 监控
$upstream_cache_status
日志
- 检查
2. 调试技巧
- 启用调试日志:
error_log /var/log/nginx/cache_debug.log debug;
- 使用
curl
验证缓存:curl -I http://example.com/resource # 观察X-Cache-Status响应头
3. 性能瓶颈定位
- 使用
ngxtop
分析日志:ngxtop -l /var/log/nginx/access.log --print $upstream_cache_status
- 监控工具推荐:
- Prometheus + Nginx Exporter
- Grafana缓存看板
- Dynatrace APM集成
通过精细化配置Nginx缓存,可显著提升网站性能,降低后端负载。建议根据实际业务场景进行压测调优,并持续监控关键指标(命中率、响应时间、缓存大小)以确保系统高效运行。