Nginx可通过map指令配合cron定时任务实现维护页自动切换:每分钟检查当前时间是否在0200–0400间,是则创建/var/run/nginx-maint-on文件,否则删除;map据此映射维护状态,零扩展、热生效。

想让网站在固定时段自动切到维护页,或把特定时间段的请求导给备用后端?Nginx 本身不内置时间判断逻辑,但用 map 指令配合系统级定时任务,就能实现零扩展、低延迟、热生效的自动化切换。
用 cron + 文件标记驱动时间状态
核心是把“当前是否在维护时段”这个动态判断,转成一个静态文件是否存在——Nginx 的 map 能高效识别文件存在性,而不用每次解析时间字符串。
- 写一个每分钟执行的 crontab 任务(如 root 用户):
*/1 * * * * /bin/sh -c 'if [[ $(date +\%H\%M) >= "0200" ]] && [[ $(date +\%H\%M) - 使用
/var/run/路径,因它是内存文件系统,重启自动清空,安全可靠 - 注意 crontab 中
%需转义;比较用字典序(如 "0200" ≤ "0235"
用 map 将文件状态映射为可路由变量
在 http{} 块中定义映射,借用稳定变量(如 $document_root)触发检查:
map $document_root $maint_mode {<br>
default off;<br>
~*\/var\/run\/nginx-maint-on on;<br>
}
⚠️ 这里不是正则匹配路径,而是利用 Nginx 对 ~* 后跟绝对路径的特殊处理:只要该文件存在,就返回 on;否则走 default。这是官方推荐的轻量级存在性检测方式。
在 server 中完成流量切换动作
根据 $maint_mode 变量决定行为,支持多种策略:
- 返回维护页面:
location / {<br> if ($maint_mode = on) { return 503; }<br> # 正常代理或静态服务<br> }
再配合error_page 503 /maintenance.html;和对应静态资源即可 - 切换后端集群:
map $maint_mode $upstream_backend {<br> on backup_api;<br> off main_api;<br> }<br> location /api/ { proxy_pass http://$upstream_backend; }
增强可靠性与可观测性
生产环境建议补充几项细节,避免误切或难排查:
- 在
log_format中加入$maint_mode和$time_iso8601,便于确认切换时刻与持续时间 - 为维护页配置独立缓存策略,防止 CDN 缓存 503 响应:
location = /maintenance.html { add_header Cache-Control "no-store, no-cache"; } - 加一条健康检查 fallback:若备用后端不可达,仍可降级返回维护页,避免雪崩

















