概述
- 目标:通过合理的缓存头与Nginx压缩策略减少回源与带宽,提升终端加载性能与可用性。
- 适用:静态资源与API响应的可缓存场景。
核心与实战
- 启用Brotli与Gzip(编译或动态模块):
load_module modules/ngx_http_brotli_filter_module.so;
load_module modules/ngx_http_brotli_static_module.so;
brotli on;
brotli_comp_level 5;
brotli_types text/plain text/css application/javascript application/json image/svg+xml;
gzip on;
gzip_comp_level 5;
gzip_types text/plain text/css application/javascript application/json image/svg+xml;
- 静态资源缓存策略:
location /static/ {
root /var/www;
add_header Cache-Control "public, max-age=31536000, immutable";
try_files $uri $uri.br $uri.gz =404;
}
- API缓存与变更验证:
location /api/ {
proxy_pass http://api;
proxy_cache api_cache;
proxy_cache_valid 200 1m;
proxy_cache_bypass $http_cache_control;
add_header Vary "Accept-Encoding";
add_header Cache-Control "public, max-age=60";
if_modified_since exact;
etag on;
}
proxy_cache_path /var/cache/nginx/api levels=1:2 keys_zone=api_cache:100m inactive=10m use_temp_path=off;
示例
- 验证压缩与缓存:
curl -I https://example.com/static/app.js
curl -H 'Accept-Encoding: br' -I https://example.com/static/app.js
curl -I https://example.com/api/items
- 命中检查:
add_header X-Cache $upstream_cache_status;
验证与监控
- 头部与响应体:
- 检查`Content-Encoding: br/gzip`与`Cache-Control`;正确变更验证通过`ETag/If-None-Match`。
- 命中率:
- 观察`$upstream_cache_status`与带宽变化;优化缓存键与变体。
- 兼容性:
- 对不支持Brotli的客户端回退到Gzip或未压缩版本。
常见误区
- 为动态API设置过长`max-age`导致数据过期;需短期或使用ETag/Last-Modified。
- 未设置`Vary`导致缓存污染;需根据编码或其他头变体设置Vary。
- 未提供`.br/.gz`静态文件导致回退失败;需构建时生成并部署。
结语
- 通过Nginx缓存与Brotli压缩策略,可显著提升响应性能与节省带宽,同时需要正确的变更验证与兼容策略保障数据正确性。

发表评论 取消回复