插件窝 干货文章 如何使用Nginx进行动态内容缓存

如何使用Nginx进行动态内容缓存

cache 缓存 proxy http 306    来源:    2025-04-13

使用Nginx进行动态内容缓存

Nginx不仅可以作为静态内容服务器,还能高效地缓存动态内容,显著减轻后端应用服务器的负载。以下是实现动态内容缓存的详细方法:

1. 基本缓存配置

在Nginx配置文件中(http或server块)添加缓存设置:

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;

        # 缓存有效期为10分钟
        proxy_cache_valid 200 302 10m;
        proxy_cache_valid 404      1m;

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

2. 高级缓存控制

2.1 根据响应头缓存

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

    # 仅当后端返回特定头时才缓存
    proxy_cache_bypass $http_cache_control;
    proxy_no_cache $http_pragma $http_authorization;

    # 使用后端返回的Cache-Control头
    proxy_ignore_headers Cache-Control;
}

2.2 缓存微调

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

    # 缓存锁定(防止多个请求同时更新缓存)
    proxy_cache_lock on;
    proxy_cache_lock_timeout 5s;

    # 当缓存更新时使用旧缓存
    proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;

    # 后台更新缓存
    proxy_cache_background_update on;
}

3. 按条件缓存

3.1 根据请求方法

map $request_method $cacheable {
    default 0;
    GET     1;
    HEAD    1;
}

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

        # 仅缓存GET和HEAD请求
        proxy_cache $cacheable;
    }
}

3.2 根据URI路径

location ~* ^/dynamic-content/ {
    proxy_cache my_cache;
    proxy_pass http://backend;
    proxy_cache_valid 200 5m;
}

location ~* ^/no-cache/ {
    proxy_pass http://backend;
    proxy_no_cache 1;
}

4. 缓存清除机制

4.1 手动清除

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

4.2 自动清除

可以使用Nginx的proxy_cache_purge模块或第三方模块如ngx_cache_purge来实现自动清除。

5. 监控缓存状态

location /nginx-cache-status {
    allow 127.0.0.1;
    deny all;
    proxy_cache_stats on;
    access_log off;
}

最佳实践

  1. 缓存策略:根据内容更新频率设置合理的缓存时间
  2. 缓存分区:对不同类型的内容使用不同的缓存区域
  3. 内存优化keys_zone大小应根据缓存键数量调整
  4. 磁盘优化inactive参数控制缓存未被访问的保留时间
  5. 测试验证:使用curl -I检查X-Cache头确认缓存命中情况

完整示例配置

proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=dynamic_cache:50m inactive=12h use_temp_path=off max_size=2g;

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://backend_server;
        proxy_cache dynamic_cache;
        proxy_cache_key "$scheme$request_method$host$request_uri$is_args$args";
        proxy_cache_valid 200 302 10m;
        proxy_cache_valid 404 1m;
        proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
        proxy_cache_background_update on;
        proxy_cache_lock on;

        add_header X-Cache-Status $upstream_cache_status;
    }

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

通过以上配置,Nginx可以高效地缓存动态内容,显著提升网站性能并降低后端服务器负载。