实战演示Nginx实现基于时间的站点维护页面自动切换

2026-04-17服务器204362

可通过 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。

本文地址:https://www.ufcn.cn/article/2321134.html

如非特殊说明,本站内容均来自于网友自主分享,概不代表本站观点,如有任何问题我们都将在收到反馈后的第一时间进行处理!