Nginx 的缓存策略是提升性能的关键手段,合理配置缓存可以显著减少后端负载、降低响应时间并提高吞吐量。以下是常见的缓存策略及其配置方法:
1. 浏览器缓存(客户端缓存)
通过设置 HTTP 头信息,控制浏览器本地缓存资源的时间,减少重复请求。
静态资源长期缓存
location ~* \.(js|css|png|jpg|jpeg|gif|ico|woff|woff2|ttf|svg|map)$ {
expires 365d; # 缓存 1 年
add_header Cache-Control "public, immutable"; # 告知浏览器资源不可变
access_log off; # 关闭日志以减少 I/O
}
动态资源条件缓存
location /api/ {
add_header Cache-Control "no-cache"; # 强制验证缓存
# 或使用:add_header Cache-Control "private, max-age=60"; # 私有缓存 60 秒
}
2. Nginx 代理缓存(反向代理缓存)
通过 proxy_cache
模块缓存后端响应,减少对上游服务器的请求。
基础配置
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; # 使用名为 my_cache 的缓存区
proxy_cache_valid 200 302 10m; # 200 和 302 状态码缓存 10 分钟
proxy_cache_valid 404 1m; # 404 状态码缓存 1 分钟
proxy_cache_key $scheme$host$request_uri; # 缓存键生成规则
# 其他代理设置
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
}
缓存控制
# 忽略后端的 Cache-Control 头,强制缓存
proxy_ignore_headers Cache-Control Expires;
# 只缓存 GET/HEAD 请求
if ($request_method !~ ^(GET|HEAD)$) {
proxy_cache_bypass $http_pragma;
proxy_no_cache $http_pragma;
}
# 基于 Cookie 控制缓存
proxy_cache_bypass $cookie_session; # 有 session cookie 时不缓存
proxy_no_cache $cookie_session;
3. FastCGI 缓存(PHP 应用)
针对 PHP 等 FastCGI 应用的缓存策略。
配置示例
http {
fastcgi_cache_path /var/cache/nginx/fastcgi levels=1:2 keys_zone=php_cache:10m;
server {
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; # 成功响应缓存 30 分钟
fastcgi_cache_key $scheme$host$request_uri;
# 缓存状态变量
add_header X-Cache-Status $upstream_cache_status;
}
}
}
4. 缓存失效策略
控制缓存的更新和失效机制。
主动刷新(需要扩展模块)
使用 ngx_cache_purge
模块主动清除缓存:
location ~ /purge(/.*) {
allow 127.0.0.1; # 仅允许本地访问
deny all;
proxy_cache_purge my_cache $scheme$host$1;
}
缓存时间阶梯策略
# 热门内容缓存更久,冷门内容自动淘汰
proxy_cache_valid 200 1h; # 普通响应缓存 1 小时
proxy_cache_valid 200 5m; # 对频繁更新的内容缩短缓存时间
5. 缓存状态监控
通过添加响应头查看缓存命中情况:
add_header X-Cache-Status $upstream_cache_status; # 添加缓存状态头
MISS
:缓存未命中,请求转发到后端。HIT
:缓存命中,直接返回缓存内容。EXPIRED
:缓存已过期,需重新请求后端。UPDATING
:缓存正在更新(配合proxy_cache_use_stale
)。
6. 高级缓存策略
使用 stale 数据
在缓存更新时继续使用旧数据,减少等待时间:
proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
proxy_cache_background_update on; # 后台更新缓存(需商业版或第三方模块)
缓存分区
根据用户角色或请求参数分区缓存:
proxy_cache_key "$scheme$request_method$host$request_uri$cookie_user"; # 按用户分区
CDN 集成
对静态资源使用 CDN,并配置合适的回源策略:
location ~* \.(js|css|png|jpg)$ {
proxy_pass https://cdn.example.com; # CDN 地址
proxy_cache_valid 200 30d; # CDN 回源缓存 30 天
}
7. 性能优化建议
- 使用 SSD 存储缓存:减少 I/O 延迟。
- 合理设置缓存大小:根据服务器内存和磁盘空间调整
max_size
。 - 定期清理缓存:通过脚本或
inactive
参数自动淘汰旧缓存。 - 避免缓存抖动:对频繁更新的资源缩短缓存时间,而非禁用缓存。
- 监控缓存命中率:通过日志或监控工具确保命中率在 80% 以上。
总结
合理的缓存策略可以大幅提升 Nginx 性能,建议组合使用:
- 浏览器缓存:处理静态资源,减少客户端请求。
- Nginx 代理缓存:减少对后端服务器的访问。
- 分层缓存:结合 CDN、本地缓存和浏览器缓存构建多级缓存体系。
根据业务特性调整缓存时间和失效策略,平衡性能与数据实时性。