可通过 cron + 文件标记 + Nginx map 实现自动维护页切换:每分钟检查时间,若在设定时段(如02:00–04:00)则创建 /var/run/nginx-maint-on,Nginx 用 map 判断该文件是否存在来决定是否返回维护页。
想让网站在特定时间段自动显示维护页,其他时间正常访问?Nginx 本身不支持“定时任务”,但可以通过配合系统 cron + 文件触发 + map 指令实现零依赖、低开销的基于时间的自动切换。下面用真实可运行的配置演示整个流程。
核心思路:用外部文件状态代替时间判断
Nginx 的 map 指令能根据变量值映射出新变量,而 $time_iso8601 或 $date_gmt 是动态的——但直接解析时间字符串做逻辑判断既复杂又低效。更稳妥的做法是:
- 用系统 cron 每分钟检查当前是否处于维护时段(如每天 02:00–04:00)
- 若在时段内,写入一个标记文件(如
/var/run/nginx-maint-on);否则删除它 - Nginx 用
map检查该文件是否存在,决定是否启用维护页
第一步:配置定时任务生成维护标记
编辑 root 用户的 crontab(sudo crontab -e),添加一行:
* * * * * /bin/sh -c 'if [[ $(date +\%H\%M) > \"0200\" ]] && [[ $(date +\%H\%M) < \"0400\" ]]; then touch /var/run/nginx-maint-on; else rm -f /var/run/nginx-maint-on; fi'
说明:
- 每分钟执行一次,确保切换及时(误差 ≤1 分钟)
- 使用
date +\%H\%M输出类似0235的字符串,便于字典序比较 - 注意转义
%符号(crontab 中需写成\%H\%M) - 标记文件路径建议用
/var/run/(tmpfs,重启清空,安全)
第二步:Nginx 配置中用 map 映射维护状态
在 http{} 块中加入:
map $document_root $maint_mode {
default off;
~*\/var\/run\/nginx-maint-on on;
}
⚠️ 注意:$document_root 是稳定存在的内置变量,我们“借用”它来触发 map 计算;实际判断依据是 /var/run/nginx-maint-on 文件是否存在(Nginx 会自动识别文件存在性)。
然后在 server 块中启用维护逻辑:
云雀语言模型
云雀是一款由字节跳动研发的语言模型,通过便捷的自然语言交互,能够高效的完成互动对话
下载
server {
listen 80;
server_name example.com;
# 维护页配置
set $maint_page "/usr/share/nginx/html/maint.html";
if ($maint_mode = on) {
return 503;
}
error_page 503 @maintenance;
location @maintenance {
root /usr/share/nginx/html;
try_files $maint_page =503;
internal;
}
# 正常站点配置(略)
location / {
proxy_pass http://backend;
}
}
关键点:
-
return 503触发自定义错误页,比rewrite更轻量 -
error_page 503 @maintenance将 503 响应导向内部 location -
try_files $maint_page =503确保维护页文件存在,否则仍返回标准 503 -
internal防止用户直接访问/maint.html
第三步:准备维护页面并验证
创建维护页:
sudo mkdir -p /usr/share/nginx/html sudo tee /usr/share/nginx/html/maint.html <<'EOF'? 系统维护中
预计完成时间:04:00
EOF
测试与排错:
- 手动创建标记文件:
sudo touch /var/run/nginx-maint-on,再curl -I http://example.com应返回503 Service Temporarily Unavailable - 手动删除:
sudo rm /var/run/nginx-maint-on,再次请求应返回正常响应 - 检查 Nginx 错误日志:
sudo tail -f /var/log/nginx/error.log,确认无 map 相关警告 - 确认 cron 是否生效:
sudo grep CRON /var/log/syslog
这套方案不依赖 Lua、OpenResty 或外部服务,纯 Nginx + Linux 基础能力即可落地,稳定且易于审计。维护窗口变更时,只需改 cron 表达式,无需 reload Nginx。