Appearance
缓存性能优化
优化缓存配置可以提高缓存性能,减少后端压力。
缓存路径优化
目录层级
nginx
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=proxy_cache:10m max_size=1g inactive=60m;说明:
levels=1:2:两级目录结构- 减少单个目录的文件数量
- 提高文件查找速度
使用SSD
nginx
proxy_cache_path /ssd/cache/nginx levels=1:2 keys_zone=proxy_cache:10m max_size=1g inactive=60m;说明:
- SSD读写速度快
- 显著提高缓存性能
缓存大小优化
keys_zone大小
nginx
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=proxy_cache:100m max_size=1g inactive=60m;说明:
keys_zone=100m:100MB共享内存- 可以存储更多缓存键
- 减少缓存键查找时间
max_size大小
nginx
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=proxy_cache:10m max_size=10g inactive=60m;说明:
max_size=10g:最大10GB缓存- 根据磁盘空间调整
- 避免磁盘空间不足
缓存时间优化
静态资源
nginx
location ~* \.(jpg|jpeg|png|gif|css|js)$ {
proxy_cache proxy_cache;
proxy_cache_valid 200 7d;
proxy_pass http://backend;
}API响应
nginx
location /api/ {
proxy_cache proxy_cache;
proxy_cache_valid 200 60m;
proxy_cache_valid 404 1m;
proxy_pass http://backend;
}HTML页面
nginx
location ~* \.html$ {
proxy_cache proxy_cache;
proxy_cache_valid 200 1h;
proxy_pass http://backend;
}缓存键优化
简化缓存键
nginx
proxy_cache_key "$scheme$request_method$host$request_uri";基于URL的缓存键
nginx
proxy_cache_key "$host$uri$is_args$args";基于Cookie的缓存键
nginx
proxy_cache_key "$scheme$request_method$host$cookie_user_id$request_uri";缓存控制优化
条件缓存
nginx
set $skip_cache 0;
if ($request_method = POST) {
set $skip_cache 1;
}
location / {
proxy_cache_bypass $skip_cache;
proxy_no_cache $skip_cache;
proxy_pass http://backend;
}缓存特定状态码
nginx
location / {
proxy_cache proxy_cache;
proxy_cache_valid 200 302 60m;
proxy_cache_valid 404 1m;
proxy_pass http://backend;
}使用过期缓存
nginx
location / {
proxy_cache proxy_cache;
proxy_cache_use_stale error timeout updating http_500 http_503;
proxy_pass http://backend;
}缓存锁定优化
启用缓存锁定
nginx
proxy_cache_lock on;
proxy_cache_lock_timeout 5s;说明:
- 防止缓存击穿
- 同一请求只回源一次
- 其他请求等待缓存更新
完整配置
nginx
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=proxy_cache:10m max_size=1g inactive=60m;
server {
listen 80;
server_name proxy.example.com;
location / {
proxy_cache proxy_cache;
proxy_cache_lock on;
proxy_cache_lock_timeout 5s;
proxy_cache_use_stale error timeout updating http_500 http_503;
proxy_pass http://backend;
}
}缓存最小化优化
忽略特定头
nginx
proxy_ignore_headers Set-Cookie;缓存忽略Cookie
nginx
proxy_cache_key "$scheme$request_method$host$request_uri";缓存忽略参数
nginx
location / {
proxy_cache proxy_cache;
proxy_cache_key "$scheme$request_method$host$uri";
proxy_pass http://backend;
}完整示例
生产环境配置
nginx
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=proxy_cache:100m max_size=10g inactive=60m;
upstream backend {
server 192.168.1.10:8080;
server 192.168.1.11:8080;
}
server {
listen 80;
server_name proxy.example.com;
# 静态资源
location ~* \.(jpg|jpeg|png|gif|css|js)$ {
proxy_cache proxy_cache;
proxy_cache_valid 200 7d;
proxy_cache_key "$scheme$request_method$host$request_uri";
proxy_pass http://backend;
add_header X-Cache-Status $upstream_cache_status;
}
# API
location /api/ {
proxy_cache proxy_cache;
proxy_cache_valid 200 60m;
proxy_cache_valid 404 1m;
proxy_cache_key "$scheme$request_method$host$request_uri";
proxy_cache_lock on;
proxy_cache_lock_timeout 5s;
proxy_cache_use_stale error timeout updating http_500 http_503;
proxy_pass http://backend;
add_header X-Cache-Status $upstream_cache_status;
}
# HTML
location ~* \.html$ {
proxy_cache proxy_cache;
proxy_cache_valid 200 1h;
proxy_cache_key "$scheme$request_method$host$request_uri";
proxy_pass http://backend;
add_header X-Cache-Status $upstream_cache_status;
}
}性能测试
缓存命中率
nginx
log_format cache '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$upstream_cache_status"';
access_log /var/log/nginx/cache.log cache;分析缓存日志
bash
# 统计缓存命中率
grep "HIT" /var/log/nginx/cache.log | wc -l
grep "MISS" /var/log/nginx/cache.log | wc -l常见问题
缓存命中率低
原因: 缓存时间过短或缓存键不当
解决: 延长缓存时间或优化缓存键
nginx
proxy_cache_valid 200 60m;
proxy_cache_key "$scheme$request_method$host$request_uri";缓存占用过多磁盘
原因: max_size设置过大
解决: 调整max_size大小
nginx
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=proxy_cache:10m max_size=1g inactive=60m;缓存更新慢
原因: 缓存锁定时间过长
解决: 调整缓存锁定时间
nginx
proxy_cache_lock_timeout 5s;总结
缓存性能优化的关键点:
- 缓存路径:使用SSD和合理的目录层级
- 缓存大小:根据需求调整keys_zone和max_size
- 缓存时间:根据内容类型设置不同的缓存时间
- 缓存键:优化缓存键提高命中率
- 缓存控制:条件缓存和使用过期缓存
- 缓存锁定:防止缓存击穿
合理优化缓存配置,提高缓存性能,减少后端压力。