一、代理缓存配置 (Proxy Cache)
1. 基础配置模板
nginx
http {
# 定义缓存路径和参数
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m
inactive=60m max_size=1g use_temp_path=off;
server {
location / {
proxy_pass http://backend;
# 启用缓存
proxy_cache my_cache;
# 缓存有效状态码和时长
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
# 缓存键定义(关键参数)
proxy_cache_key "$scheme$request_method$host$request_uri$arg_user";
# 跳过缓存条件
proxy_cache_bypass $http_pragma;
proxy_no_cache $http_authorization;
# 显示缓存状态头(调试用)
add_header X-Cache-Status $upstream_cache_status;
}
}
}
2. 核心参数解析
- keys_zone:定义共享内存区(10MB可存储约8,000个键)
- levels:目录层级结构(推荐 1:2 平衡查找效率)
- inactive:未访问缓存保留时间(与 max_size 共同作用)
- max_size:磁盘缓存最大占用空间
- use_temp_path=off:避免临时文件导致的性能损耗
3. 多场景配置案例
场景1:动静分离缓存
nginx
location ~* \.(jpg|png|css|js)$ {
proxy_cache static_cache;
proxy_cache_valid 200 7d;
proxy_cache_lock on; # 缓存锁防止惊群
proxy_ignore_headers Set-Cookie; # 忽略后端设置的Cookie
}
location /api/ {
proxy_cache dynamic_cache;
proxy_cache_valid 200 5s; # 动态内容短缓存
proxy_cache_use_stale updating error timeout;
}
场景2:分设备缓存
nginx
map $http_user_agent $device_type {
~*mobile "mobile";
default "desktop";
}
proxy_cache_key "$device_type$request_uri";
场景3:缓存排除策略
nginx
# 排除POST请求
if ($request_method = POST) {
set $no_cache 1;
}
# 排除特定URL
location /private/ {
proxy_no_cache 1;
proxy_cache_bypass 1;
}
二、浏览器缓存控制
1. 基础配置
nginx
location ~* \.(js|css|png|jpg)$ {
expires 365d;
add_header Cache-Control "public, no-transform";
etag on;
}
location /dynamic-content {
expires -1;
add_header Cache-Control "no-store, must-revalidate";
}
2. 高级控制策略
指纹资源长期缓存
nginx
location ~* \.(?<hash>[a-f0-9]{20})\.(js|css)$ {
expires max;
add_header Cache-Control "public, immutable";
}
条件缓存控制
nginx
map $http_cookie $cache_zone {
~*sessionid $host-nocache;
default $host;
}
Vary头处理
nginx
location /compressed/ {
gzip on;
add_header Vary Accept-Encoding;
}
三、易错点与解决方案
1. 缓存失效问题
-
问题现象:内容更新后仍返回旧缓存
-
解决方案 :
nginx# 添加版本号到缓存键 proxy_cache_key "$request_uri$http_accept$http_user_agent$arg_v";
2. 内存溢出
-
问题现象 :
keys_zone
内存不足导致503错误 -
解决方案 :
nginx# 每个key约占用110字节,按需调整 keys_zone=my_cache:100m; # 可存储约900,000个键
3. 缓存穿透
-
问题现象:大量请求绕过缓存直达后端
-
解决方案 :
nginxproxy_cache_lock on; # 启用缓存锁 proxy_cache_background_update on; # 后台更新
4. 磁盘I/O瓶颈
-
问题现象:高并发时磁盘负载过高
-
解决方案 :
nginxproxy_cache_path /dev/shm/nginx_cache levels=1:2 keys_zone=ram_cache:512m max_size=2g;
四、实战调试技巧
1. 状态监控
bash
# 查看缓存内存使用
$ nginx -T 2>&1 | grep keys_zone
# 实时监控缓存状态
$ tail -f /var/log/nginx/access.log | grep X-Cache-Status
2. 缓存清理
nginx
# 使用purge模块(需单独编译)
location ~ /purge(/.*) {
proxy_cache_purge my_cache "$scheme$request_method$host$1";
}
3. 性能调优
nginx
# 调整文件描述符
proxy_temp_file_write_size 64k;
open_file_cache max=10000 inactive=30s;
五、场景案例集
案例1:电商网站商品图片
nginx
location ~ /products/(.*)\.(jpe?g|png)$ {
proxy_cache product_images;
proxy_cache_valid 200 302 30d;
proxy_cache_use_stale error timeout invalid_header updating;
expires 30d;
add_header Cache-Control "public";
}
案例2:实时股票API
nginx
location /stock/ {
proxy_cache_methods GET HEAD;
proxy_cache_valid 200 10s;
proxy_cache_lock_timeout 5s;
add_header X-Cache-Expires $upstream_http_expires;
}
案例3:多CDN回源
nginx
proxy_cache_key "$http_x_forwarded_for$request_uri";
proxy_cache_min_uses 3; # 至少3次请求才缓存
通过合理配置代理缓存和浏览器缓存,结合业务场景进行精细化控制,可实现性能提升50%以上。建议每次配置变更后使用工具(如siege
或wrk
)进行压力测试,并通过$upstream_cache_status
监控缓存命中率。