Nginx通过time-based map指令结合$date_local变量判断维护时段,if拦截请求返回503并指向静态maintenance.html,完全绕过PHP-FPM;支持时区校准、正则自定义时段、手动标记文件覆盖,确保轻量可靠。

在 Nginx 中让 PHP-FPM 应用在非工作时间自动显示维护公告,核心思路是:**不修改 PHP 代码,而是由 Nginx 根据系统时间主动拦截请求并返回静态维护页,同时保持状态码为 503**。这比依赖后端判断更轻量、更可靠,且完全绕过 PHP-FPM,避免资源浪费。
配置基于时间的维护模式开关
利用 Nginx 内置的 $time_iso8601 或 $date_local 变量结合 map 指令,在 http{} 块中定义是否处于维护时段:
- 编辑
/etc/nginx/nginx.conf,在http块顶部添加:
map $date_local $maintenance_mode {
default off;
~^(Mon|Tue|Wed|Thu|Fri)_[0-9]{2}:[0-5][0-9]:[0-5][0-9]_(20|21|22|23|00|01|02|03|04|05) on; # 周一至周五 20:00–05:59
~^(Sat|Sun) on; # 全天周末
}说明:该正则匹配 Nginx 默认日志格式中的 $date_local(如 Mon_14:30:22_2026),可精准控制到小时级;你可根据实际工作时间调整正则,例如只在 23:00–06:59 触发,就写 ~^[A-Za-z]+_[0-9]{2}:[0-5][0-9]:[0-5][0-9]_(2[3-9]|0[0-6])。
在 server 块中启用维护逻辑
在对应站点的 server{} 块内加入以下指令(建议放在 location / 之前):
立即学习“PHP免费学习笔记(深入)”;
-
主动拦截并返回 503:
if ($maintenance_mode = on) { return 503; } -
定义 503 的响应页面:
error_page 503 @maintenance; -
声明维护页位置与访问控制:
location @maintenance {<br> root /usr/share/nginx/html;<br> try_files /maintenance.html =503;<br>}
(确保/usr/share/nginx/html/maintenance.html存在且 Nginx 用户可读)
关键细节与注意事项
该方案能真正“跳过 PHP-FPM”,但需注意几个实操要点:
-
时区必须一致:Nginx 使用系统本地时间,确保
systemctl show --property=Timezone显示的是你期望的时区(如Asia/Shanghai),必要时用timedatectl set-timezone设置 -
不要在 location ~ \.php$ 中重复配置:维护逻辑应放在
server级,避免被 PHP 处理块覆盖 -
静态页内容建议包含明确提示和恢复时间,例如:
<h2>系统维护中</h2><p>当前为非工作时间(22:00–07:00),服务将于明日 07:00 恢复</p> -
测试方法简单直接:临时修改系统时间(
date -s "Fri 02:00:00 CST 2026"),再curl -I http://your-domain/查看是否返回503 Service Temporarily Unavailable及正确 HTML 内容
补充:手动覆盖与平滑退出
若需临时取消时间策略(如紧急上线),可叠加文件标记方式实现优先级更高的手动控制:
- 新增一个 map 判断标记文件:
map $document_root $manual_maintenance {<br> default off;<br> ~*\/var/run\/nginx-maint on;<br>} - 在 server 块中改用:
if ($manual_maintenance = on) { return 503; }<br>if ($maintenance_mode = on) { return 503; }
这样只要touch /var/run/nginx-maint就强制进入维护,删掉即恢复——适合值班人员快速操作



















