温馨提示×

Debian Nginx 缓存策略有哪些

小樊
52
2026-01-08 09:00:04
栏目: 智能运维

Debian 上 Nginx 的缓存策略全景

  • 浏览器缓存:通过设置 Cache-Control / Expires 等响应头,让客户端长期缓存静态资源或短期缓存可验证资源。
  • 反向代理缓存 proxy_cache:缓存上游应用(如 HTTP/HTTPS 后端)的响应,显著降低后端负载与延迟。
  • FastCGI 缓存 fastcgi_cache:缓存 PHP-FPM 等动态内容,适合内容相对可缓存的页面片段或接口。
  • 键值/对象缓存 memcached_pass:直接对接 Memcached,以键/值方式读取预存内容,适合特定数据接口。
  • 传统文件存储缓存 proxy_store:用文件系统“存一份”后端返回内容,适合简单场景但缺少过期与精细淘汰机制。
  • CDN 分层缓存:在源站前引入 CDN,形成“用户—CDN—源站”的多级缓存体系,进一步降低源站压力与跨网时延。

核心配置与关键指令

  • 反向代理缓存(proxy_cache)要点

    • 定义缓存区:使用 proxy_cache_path 指定缓存目录、层级、共享内存区(keys_zone)、最大容量(max_size)、非活跃淘汰时间(inactive)、临时路径开关(use_temp_path)。
    • 启用与键:在 location 中用 proxy_cache 指定缓存区;用 proxy_cache_key 定义缓存键(常见为 $scheme$host$request_uri 或含查询串的组合)。
    • 有效期与状态:用 proxy_cache_valid 为不同状态码设置缓存时间;添加 X-Cache-Status $upstream_cache_status 观察 HIT/MISS/EXPIRED/UPDATING 等状态。
    • 控制与绕过:用 proxy_no_cache / proxy_cache_bypassCookie/Session/请求方法 等条件决定是否走缓存;用 proxy_cache_methods 限制仅缓存 GET/HEAD
    • 容错与更新:用 proxy_cache_use_stale 在后端异常或更新时提供陈旧数据;必要时启用后台更新(商业版或第三方模块)。
    • 示例(放在 http 块):
      • proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;
      • server { location / { proxy_cache my_cache; proxy_cache_key $scheme$host$request_uri; proxy_pass http://backend; add_header X-Cache-Status $upstream_cache_status; proxy_cache_valid 200 302 10m; proxy_cache_valid 404 1m; } }
    • 目录与权限:缓存目录建议如 /var/cache/nginx,权限与属主匹配运行用户(如 www-data)。
  • FastCGI 缓存(fastcgi_cache)要点

    • 定义缓存区:使用 fastcgi_cache_path(keys_zone、levels、max_size 等)。
    • 启用与键:在 location ~ .php$ 中用 fastcgi_cache 指定缓存区;用 fastcgi_cache_key 统一键规则。
    • 有效期与状态:用 fastcgi_cache_valid 设置缓存时间;添加 X-Cache-Status 观察命中。
    • 示例:
      • fastcgi_cache_path /var/cache/nginx/fastcgi levels=1:2 keys_zone=php_cache:10m;
      • location ~ .php$ { fastcgi_pass unix:/run/php/php7.4-fpm.sock; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_cache php_cache; fastcgi_cache_valid 200 30m; fastcgi_cache_key $scheme$host$request_uri; add_header X-Cache-Status $upstream_cache_status; }
  • 浏览器缓存与静态资源

    • 长期缓存不可变资源:对 js/css/png/jpg/ico/woff2 等设置 Expires 365dCache-Control “public, immutable”,并可关闭访问日志降低 I/O。
    • 动态/私有内容:对 /api/ 等接口使用 no-cache(强制协商)或 private, max-age=60(私有缓存 60 秒)。
  • 主动清除与缓存失效

    • 主动清除:使用第三方模块 ngx_cache_purgeproxy_cache_purge 指令按路径清理缓存(需编译进模块并限制来源 IP)。
    • 被动淘汰:依赖 inactive=60m 等策略自动清理长时间未访问对象;对热点内容采用“时间阶梯”避免集中过期。
  • 传统方案与对象缓存

    • proxy_store:通过 error_page 404if (!-f) 触发回源,并用 proxy_store on 将响应写入本地文件;优点是简单,缺点是缺少过期/淘汰与复杂 URL 处理能力。
    • memcached_pass:以 $uri 或自定义键对接 Memcached,适合读多写少的数据接口;写入需由应用或其他服务完成。

分层缓存与 CDN 实践

  • 分层思路:构建“浏览器缓存 → CDN 边缘缓存 → 源站 Nginx 代理/FastCGI 缓存 → 应用/数据库”的多级体系,逐层拦截与回源。
  • 缓存控制:源站对可缓存内容设置合理 Cache-Control/Expires;对动态内容使用 no-cache 或短 max-age;为静态资源设置较长 max-ageimmutable
  • 预热与分散过期:上线前对热点资源做 CDN 预热;采用“二级缓存”与时间阶梯避免“缓存雪崩”。

落地步骤与运维要点

  • 部署与目录:在 Debian 上安装 Nginx,创建缓存目录(如 /var/cache/nginx),设置属主为 www-data,确保磁盘与 inactive 策略匹配。
  • 配置与校验:在 /etc/nginx/nginx.conf/etc/nginx/sites-available/ 中按模块添加缓存配置;执行 nginx -t 校验语法。
  • 生效与观察:执行 systemctl restart nginx 使配置生效;通过响应头 X-Cache-Status 与日志分析命中率与穿透情况。
  • 监控与调优:关注命中率、后端响应时延、磁盘 I/O;根据业务特性调整 max_size、inactive、缓存时间 与键策略。

0