动态缓存与静态缓存
不同类型的内容适用不同的缓存策略。静态内容适合长期缓存,动态内容需要更精细的控制。
静态缓存
特点与配置
nginx
# 静态文件 - 长期缓存
location ~* \.(css|js|jpg|jpeg|png|gif|svg|woff|woff2|ttf|ico)$ {
root /var/www/static;
expires 365d;
add_header Cache-Control "public, immutable";
# 可选:NGINX 层也缓存
open_file_cache max=10000 inactive=60s;
open_file_cache_valid 30s;
}
- 内容不变或文件名带 hash
- 适合长期缓存(365 天)
- 无需回源验证
immutable告知浏览器有效期内不重新验证
动态缓存
代理缓存动态内容
nginx
http {
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=dynamic_cache:10m max_size=1g inactive=30m;
}
server {
# API 响应 - 短期缓存
location /api/ {
proxy_cache dynamic_cache;
proxy_pass http://backend;
# 短期缓存
proxy_cache_valid 200 5m;
proxy_cache_valid 404 1m;
# 带 Cookie 的请求不缓存
proxy_cache_bypass $http_cookie;
proxy_no_cache $http_cookie;
# 缓存状态头
add_header X-Cache-Status $upstream_cache_status;
}
}
混合缓存
动静分离
nginx
server {
# 静态资源 - 客户端缓存
location /static/ {
root /var/www;
expires 30d;
add_header Cache-Control "public";
}
# 半动态 - NGINX 代理缓存
location /articles/ {
proxy_cache dynamic_cache;
proxy_pass http://backend;
proxy_cache_valid 200 10m;
}
# 纯动态 - 不缓存
location /api/realtime/ {
expires -1;
add_header Cache-Control "no-store, no-cache";
proxy_pass http://backend;
}
}
open_file_cache
静态文件元数据缓存
nginx
http {
open_file_cache max=10000 inactive=20s;
open_file_cache_valid 60s;
open_file_cache_min_uses 2;
open_file_cache_errors off;
}
max— 缓存条目上限inactive— 不活跃过期时间open_file_cache_valid— 验证缓存有效性的间隔min_uses— 最少使用次数才缓存
open_file_cache缓存文件元数据(是否存在、大小、修改时间等),减少 stat() 系统调用。高流量静态文件站点必开。
按用户类型缓存
登录与未登录用户
nginx
map $cookie_session $is_logged_in {
default 0;
~. 1;
}
map $is_logged_in $cache_zone {
0 static_cache;
1 "";
}
server {
location / {
if ($cache_zone != "") {
proxy_cache $cache_zone;
}
proxy_pass http://backend;
}
}
未登录用户使用公共缓存,登录用户每次请求回源。适合内容站点,首页和文章页缓存,个人中心不缓存。
要点总结
- 静态文件使用
expires+immutable长期缓存 - 动态 API 使用
proxy_cache短期缓存(1-10 分钟) open_file_cache缓存文件元数据减少 stat 调用- 带 Cookie/Session 的请求通常不缓存
- 半动态内容使用代理缓存 + 后台更新
- 纯实时数据设置
no-store禁止缓存 - 按用户类型(登录/未登录)区分缓存策略
📝 发现内容有误?点击此处直接编辑