插件窝 干货文章 如何使用Nginx进行HTTP请求的缓存控制

如何使用Nginx进行HTTP请求的缓存控制

缓存 cache proxy Nginx 978    来源:    2025-04-13

Nginx HTTP请求缓存控制指南

Nginx提供了强大的缓存控制功能,可以显著提高网站性能。以下是配置Nginx进行HTTP请求缓存控制的详细方法:

1. 基本缓存配置

1.1 启用代理缓存

http {
    proxy_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m inactive=60m use_temp_path=off;

    server {
        location / {
            proxy_cache my_cache;
            proxy_pass http://backend;

            # 缓存键设置
            proxy_cache_key "$scheme$request_method$host$request_uri";

            # 缓存有效时间
            proxy_cache_valid 200 302 10m;
            proxy_cache_valid 404      1m;
        }
    }
}

1.2 缓存参数说明

  • proxy_cache_path: 定义缓存路径和区域

    • levels: 缓存目录层级结构
    • keys_zone: 定义共享内存区域名称和大小
    • inactive: 缓存未被访问的保留时间
    • use_temp_path: 是否使用临时路径
  • proxy_cache_valid: 为不同响应码设置缓存时间

2. 高级缓存控制

2.1 缓存绕过

location / {
    proxy_cache_bypass $http_cache_control;
    proxy_no_cache $http_pragma $http_authorization;
}

2.2 条件缓存

location / {
    # 仅当后端返回特定头部时才缓存
    proxy_cache my_cache;
    proxy_cache_bypass $http_cache_control;
    proxy_cache_valid 200 302 10m;
    proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;

    # 设置Vary头部正确处理内容协商
    proxy_ignore_headers Vary;
    add_header Vary "Accept-Encoding";
}

2.3 缓存锁定

location / {
    proxy_cache_lock on;
    proxy_cache_lock_age 5s;
    proxy_cache_lock_timeout 5s;
}

3. 客户端缓存控制

3.1 设置Expires头部

location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
    expires 30d;
    add_header Cache-Control "public, no-transform";
}

3.2 设置Cache-Control头部

location /static/ {
    add_header Cache-Control "public, max-age=31536000, immutable";
}

4. 缓存清除

4.1 使用purge模块

location ~ /purge(/.*) {
    allow 127.0.0.1;
    deny all;
    proxy_cache_purge my_cache "$scheme$request_method$host$1";
}

4.2 使用第三方模块

location / {
    proxy_cache_purge PURGE from 127.0.0.1;
}

5. 最佳实践

  1. 静态资源:设置长期缓存并使用内容哈希命名
  2. 动态内容:根据业务需求设置适当的缓存时间
  3. 敏感数据:确保不缓存或设置私有缓存
  4. 监控:使用nginx -T检查配置,监控缓存命中率

6. 调试缓存

location / {
    add_header X-Cache-Status $upstream_cache_status;
}

这个头部会显示请求是否命中缓存: - HIT: 缓存命中 - MISS: 缓存未命中 - EXPIRED: 缓存过期 - UPDATING: 缓存正在更新 - STALE: 使用过期的缓存 - BYPASS: 缓存被绕过

通过合理配置Nginx缓存,可以显著减少后端服务器负载并提高网站响应速度。