微信公众号
扫描关注微信公众号
博客大厅

如何配置 Nginx 的缓存?

原创 来源:博客站 阅读 0 今天 07:58:02 听全文

配置 Nginx 缓存可以显著提升网站性能,减少后端服务器压力。以下是 全面详细的缓存配置指南,涵盖静态资源缓存、代理缓存、缓存优化策略及常见问题排查:


一、静态资源缓存

1. 基础配置(浏览器缓存)

server {
    listen 80;
    server_name example.com;

    location ~* .(jpg|jpeg|png|gif|ico|css|js)$ {
        expires 365d;                     # 缓存365天
        add_header Cache-Control "public, immutable";  # 公共缓存,内容不可变
        access_log off;                  # 关闭访问日志减少IO
    }
}

关键指令

  • expires:设置缓存过期时间(如 7d24h)。
  • Cache-Control:覆盖 expires,现代浏览器优先使用。
    • public:允许代理和浏览器缓存。
    • immutable:资源内容不变时跳过验证(适合带哈希的文件)。

2. 带哈希资源的缓存破坏(Cache Busting)

location ~* ^/.+.([a-f0-9]+).(css|js)$ {
    rewrite ^/(.+).w+.(css|js)$ /$1.$2 break;  # 移除哈希部分
    expires max;                                  # 永久缓存
}

适用场景
文件命名如 style.a1b2c3.css,内容变化时哈希值改变,强制客户端获取新版本。


二、代理缓存(反向代理缓存后端响应)

1. 定义缓存路径和参数

http {
    proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m 
                     inactive=60m use_temp_path=off max_size=1g;
                     
    server {
        location / {
            proxy_pass http://backend;
            proxy_cache my_cache;               # 启用缓存
            proxy_cache_key "$scheme$request_method$host$request_uri";  # 缓存键
            proxy_cache_valid 200 302 10m;      # 缓存200/302状态码10分钟
            proxy_cache_valid 404      1m;      # 缓存404状态码1分钟
        }
    }
}

参数说明

参数 作用
levels 缓存目录层级(如 1:2 表示1级子目录,每级2字符)。
keys_zone 共享内存区名称和大小(10m 可存储约8万键)。
inactive 缓存未被访问的保留时间(超时自动删除)。
max_size 缓存总大小限制(如 1g)。
use_temp_path 禁用临时路径,直接写入缓存目录。

2. 高级缓存控制

location / {
    proxy_cache my_cache;
    proxy_cache_lock on;              # 防止缓存击穿(同一请求只回源一次)
    proxy_cache_use_stale error timeout updating;  # 源站异常时返回旧缓存
    proxy_cache_background_update on; # 后台更新缓存
    add_header X-Cache-Status $upstream_cache_status;  # 显示缓存命中状态
}

缓存命中头

  • X-Cache-Status: HIT(命中缓存)
  • X-Cache-Status: MISS(未命中)

三、FastCGI 缓存(PHP/Python 等动态内容)

http {
    fastcgi_cache_path /var/cache/nginx/fastcgi levels=1:2 keys_zone=fcgi_cache:10m inactive=60m;

    server {
        location ~ .php$ {
            fastcgi_pass unix:/run/php/php8.2-fpm.sock;
            fastcgi_cache fcgi_cache;
            fastcgi_cache_key "$scheme$request_method$host$request_uri";
            fastcgi_cache_valid 200 60m;
            fastcgi_cache_bypass $no_cache;  # 通过条件跳过缓存
            fastcgi_no_cache $no_cache;      # 定义不缓存的条件
        }
    }
}

跳过缓存的场景示例

set $no_cache 0;
if ($request_method = POST) { set $no_cache 1; }  # POST请求不缓存
if ($query_string != "") { set $no_cache 1; }     # 带参数的URL不缓存

四、缓存优化技巧

1. 分片缓存(适合大文件)

proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=large:10m max_size=10g 
                 inactive=30d use_temp_path=off;

location /video/ {
    proxy_cache large;
    proxy_cache_valid 200 302 24h;
    slice 1m;                      # 分片大小1MB
    proxy_cache_key "$uri$slice_range";
    proxy_set_header Range $slice_range;
}

2. 缓存微调

proxy_ignore_headers Cache-Control Set-Cookie;  # 强制缓存动态内容(慎用)
proxy_cache_min_uses 3;                        # 请求3次后才缓存
proxy_cache_revalidate on;                     # 过期缓存需验证

3. 清除缓存(Purge)

location ~ /purge(/.*) {
    proxy_cache_purge my_cache "$scheme$request_method$host$1";
    allow 127.0.0.1;  # 限制仅本地可清除
    deny all;
}

调用方式

curl -X PURGE http://example.com/purge/url-to-clear

五、完整配置示例

http {
    proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=proxy_cache:10m inactive=60m max_size=1g;
    fastcgi_cache_path /var/cache/nginx/fastcgi levels=1:2 keys_zone=fcgi_cache:10m inactive=30m;

    server {
        listen 80;
        server_name example.com;

        # 静态资源缓存
        location ~* .(css|js|jpg|png)$ {
            expires 365d;
            add_header Cache-Control "public, immutable";
            access_log off;
        }

        # 动态内容代理缓存
        location /api/ {
            proxy_pass http://backend;
            proxy_cache proxy_cache;
            proxy_cache_valid 200 5m;
            proxy_cache_lock on;
            add_header X-Cache-Status $upstream_cache_status;
        }

        # PHP FastCGI缓存
        location ~ .php$ {
            fastcgi_pass unix:/run/php/php8.2-fpm.sock;
            fastcgi_cache fcgi_cache;
            fastcgi_cache_valid 200 302 10m;
        }
    }
}

六、验证与调试

1. 检查缓存目录

ls -lh /var/cache/nginx  # 查看缓存文件大小和数量

2. 测试缓存命中

curl -I http://example.com/api/data  # 观察 X-Cache-Status 头

3. 日志记录缓存状态

log_format cache_log '$remote_addr - $upstream_cache_status - $request_uri';
access_log /var/log/nginx/cache.log cache_log;

4. 手动清除缓存

rm -rf /var/cache/nginx/*  # 直接删除缓存文件(需reload)

七、常见问题

  1. 缓存不生效

    • 检查 proxy_cache_valid 是否匹配状态码。
    • 确认后端未返回 Cache-Control: private/no-store
  2. 内存不足

    • 增加 keys_zone 大小(如 keys_zone=my_cache:100m)。
  3. 磁盘空间不足

    • 调整 max_size 或缩短 inactive 时间。
  4. 动态内容误缓存

    • 使用 proxy_cache_bypass 排除敏感路径(如 /admin)。

通过合理配置 Nginx 缓存,可显著降低服务器负载并提升用户体验。建议结合业务场景调整参数,并通过监控工具(如 nginx_status、Prometheus)持续观察缓存命中率。

学在每日,进无止境!更多精彩内容请关注微信公众号。
原文出处: 内容由AI生成仅供参考,请勿使用于商业用途。如若转载请注明原文及出处。
出处地址:http://www.07sucai.com/tech/973.html
版权声明:本文来源地址若非本站均为转载,若侵害到您的权利,请及时联系我们,我们会在第一时间进行处理。
>