Skip to content

缓存性能优化

优化缓存配置可以提高缓存性能,减少后端压力。

缓存路径优化

目录层级

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
  • 缓存时间:根据内容类型设置不同的缓存时间
  • 缓存键:优化缓存键提高命中率
  • 缓存控制:条件缓存和使用过期缓存
  • 缓存锁定:防止缓存击穿

合理优化缓存配置,提高缓存性能,减少后端压力。