系统升级期间通过nginx热重载、多缓存区隔离(ui_cache/media_cache/ver_cache)、map动态路由、外部开关灰度控制及定向缓存清理,实现不重启、无感、精准的静态资源缓存策略调整。

系统升级期间动态调整 Nginx 静态资源缓存规则,核心是“不重启服务、不影响线上流量、精准控制变更范围”。这需要结合 Nginx 的热重载能力、缓存区域隔离设计和运行时可切换的配置逻辑来实现,而不是简单改完 reload 就完事。
按业务模块划分独立缓存区
避免所有静态资源共用一个 keys_zone,否则一调全调。应为不同生命周期的资源(如 UI 资源 vs. 版本化 API 资源)分配专属缓存区:
-
UI 资源缓存区(
ui_cache):用于 HTML/CSS/JS,升级期间需缩短过期时间或禁用缓存 -
媒体资源缓存区(
media_cache):用于图片/字体/视频,内容稳定,可保持长缓存(如 30d) -
版本化资源缓存区(
ver_cache):用于带 hash 值的文件(如app.a1b2c3.js),可设为永久缓存(max_age=31536000)
在 http 块中定义:
proxy_cache_path /dev/shm/ui_cache levels=1:2 keys_zone=ui_cache:50m inactive=10m max_size=2g; proxy_cache_path /dev/shm/media_cache levels=1:2 keys_zone=media_cache:200m inactive=30d max_size=50g; proxy_cache_path /dev/shm/ver_cache levels=1:2 keys_zone=ver_cache:10m inactive=1y max_size=5g;
用 map 指令实现运行时缓存策略路由
通过 map 根据请求路径、URI 特征或自定义变量(如升级开关)动态选择缓存区与过期策略,无需改 location 块即可切换行为:
map $uri $cache_zone {
~^/static/ui/ "ui_cache";
~^/static/media/ "media_cache";
~^/static/v\d+/ "ver_cache";
default "ui_cache";
}
<p>map $cache_zone $cache_valid {
"ui_cache" "200 304 1m";
"media_cache" "200 304 7d";
"ver_cache" "200 304 1y";
}</p>然后在 location 中引用:
location ~* \.(css|js|png|jpg|gif|woff2?)$ {
proxy_cache $cache_zone;
proxy_cache_valid $cache_valid;
proxy_cache_key "$scheme$host$request_uri";
add_header X-Cache-Status $upstream_cache_status;
}配合外部开关实现灰度控制
升级期间可通过外部信号控制缓存行为,例如读取一个本地标记文件或环境变量:
- 创建开关文件:
/etc/nginx/conf.d/upgrade.flag(内容为on或空) - 用
perl_set或 Lua(OpenResty)读取并设变量,或更轻量地用geo+ 文件监听脚本模拟 - 在
map中加入条件分支,例如:map $upgraded $ui_cache_ttl {<br> 1 "200 304 30s";<br> 0 "200 304 1h";<br>}
再配合简单 shell 脚本一键启停升级模式:
#!/bin/bash if [ "$1" = "on" ]; then echo "on" > /etc/nginx/conf.d/upgrade.flag else rm -f /etc/nginx/conf.d/upgrade.flag fi nginx -s reload
升级后快速清理特定缓存
仅清 UI 类缓存,不扰动媒体或版本资源:
- 直接删除对应缓存目录下的文件(
rm -rf /dev/shm/ui_cache/*),Nginx 会自动重建索引 - 或使用第三方模块
ngx_cache_purge,配置 PURGE 方法支持按 key 清理:location ~ /purge(/.*) {<br> allow 127.0.0.1;<br> proxy_cache_purge ui_cache "$scheme$host$1$is_args$args";<br>} - 触发方式:
curl -X PURGE http://localhost/purge/static/ui/app.css











