Skip to content

Proxy Cache配置

Proxy Cache可以缓存后端服务器的响应,减轻后端压力,提高响应速度。

基本配置

定义缓存路径

nginx
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m use_temp_path=off;

启用缓存

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

完整配置

生产环境配置

nginx
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=proxy_cache:10m max_size=1g inactive=60m use_temp_path=off;

upstream backend {
    server 192.168.1.10:8080;
    server 192.168.1.11:8080;
}

server {
    listen 80;
    server_name proxy.example.com;

    location / {
        proxy_cache proxy_cache;
        proxy_cache_valid 200 60m;
        proxy_cache_valid 404 1m;
        proxy_cache_key "$scheme$request_method$host$request_uri";
        proxy_pass http://backend;

        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        add_header X-Cache-Status $upstream_cache_status;
    }
}

缓存参数

proxy_cache_path参数

levels

  • 缓存目录层级
  • 格式:1:2表示两级目录

keys_zone

  • 缓存键共享内存区域
  • 格式:名称:大小

max_size

  • 最大缓存大小
  • 超过后自动清理旧缓存

inactive

  • 非活动时间
  • 超时后删除缓存

use_temp_path

  • 是否使用临时路径
  • 推荐关闭以提高性能

proxy_cache_valid参数

nginx
proxy_cache_valid 200 60m;
proxy_cache_valid 404 1m;

说明:

  • 200响应缓存60分钟
  • 404响应缓存1分钟

缓存键

默认缓存键

nginx
proxy_cache_key "$scheme$proxy_host$request_uri";

自定义缓存键

nginx
proxy_cache_key "$scheme$request_method$host$request_uri";

基于Cookie的缓存键

nginx
proxy_cache_key "$scheme$request_method$host$request_uri$is_args$args";

缓存控制

禁用缓存

nginx
location / {
    proxy_no_cache 1;
    proxy_pass http://backend;
}

条件缓存

nginx
location / {
    proxy_cache_bypass $http_cache_control;
    proxy_pass http://backend;
}

缓存特定状态码

nginx
location / {
    proxy_cache_valid 200 302 60m;
    proxy_cache_valid 404 1m;
    proxy_pass http://backend;
}

缓存清理

手动清理

bash
# 删除所有缓存
rm -rf /var/cache/nginx/*

# 删除特定缓存
find /var/cache/nginx -name "*.cache" -delete

缓存清除模块

nginx
location /cache/ {
    proxy_cache_purge $purge_method;
}

缓存监控

查看缓存状态

nginx
add_header X-Cache-Status $upstream_cache_status;

缓存状态值

  • MISS:未命中缓存
  • BYPASS:绕过缓存
  • EXPIRED:缓存过期
  • STALE:使用过期缓存
  • UPDATING:正在更新缓存
  • HIT:命中缓存

完整示例

生产环境配置

nginx
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=proxy_cache:10m max_size=1g inactive=60m use_temp_path=off;

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_pass http://backend;

        add_header X-Cache-Status $upstream_cache_status;
    }

    # 不缓存
    location /admin/ {
        proxy_no_cache 1;
        proxy_pass http://backend;
    }
}

常见问题

缓存不生效

原因: 后端返回禁止缓存的头

解决: 忽略缓存头

nginx
proxy_ignore_headers Cache-Control Expires Set-Cookie;

缓存未更新

原因: 缓存时间过长

解决: 缩短缓存时间或手动清理

nginx
proxy_cache_valid 200 60m;

缓存命中率低

原因: 缓存key设置不当

解决: 优化缓存key

nginx
proxy_cache_key "$scheme$request_method$host$request_uri";

总结

Proxy Cache配置的关键点:

  • proxy_cache_path:定义缓存路径和参数
  • proxy_cache:启用缓存
  • proxy_cache_valid:设置缓存时间
  • proxy_cache_key:设置缓存键
  • 缓存控制:禁用或条件缓存
  • 缓存监控:查看缓存状态

合理配置Proxy Cache,减轻后端压力,提高响应速度。