一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

Nginx 中 FastCGI 如何配置在非工作时间显示维护公告

时间:2026-08-24 11:48:49 编辑:袖梨 来源:一聚教程网

Nginx可通过内置时间变量判断非工作时段并返回503状态码及自定义维护页,无需修改PHP逻辑;配置包括设置小时/分钟变量、条件判断维护时段、return 503触发拦截,再通过error_page指向internal维护页。

要在 Nginx 中让 FastCGI(如 PHP)站点在非工作时间自动显示维护公告,核心思路是:不修改后端逻辑,仅靠 Nginx 配置判断时间段,并主动返回 503 + 自定义维护页。这和常规的错误页配置不同,关键在于“时间判断”与“动态拦截”,且需确保 FastCGI 请求被跳过、不转发给 PHP 处理。

1. 准备静态维护页面

把维护页(如 /usr/share/nginx/html/maintenance.html)放好,内容简洁明确,例如:

<h1>系统维护中</h1><p>服务时间:07:30–18:00(工作日)<br>当前不可访问,请稍后再试</p>

确认文件权限为 644,属主为 Nginx 运行用户(如 nginxwww-data)。

2. 在 server 块中添加时间判断与拦截逻辑

利用 Nginx 内置变量 $time_local 提取小时和分钟,用正则匹配并设置开关变量:

server{...} 内顶部(务必放在 location ~ .php$ 之前)加入:

if ($time_local ~ "^(d+)/(w+)/(d+):(d{2}):(d{2}):") {set $hour $4;set $minute $5;}set $in_maint "0";非工作时间:早于 07:30 或晚于 18:00

if ($hour < "07") { set $in_maint "1"; } if ($hour = "07") { if ($minute < "30") { set $in_maint "1"; } } if ($hour > "18") { set $in_maint "1"; } if ($hour = "18") { if ($minute > "00") { set $in_maint "1"; } }

触发维护模式

if ($in_maint = "1") { return 503; }

注意:if 在 location 外使用是安全的;该段会覆盖所有请求(含 PHP),无需改动 FastCGI 的 location ~ .php$ 块。

3. 配置 error_page 保持 503 并返回维护页

紧接在上面的 if 块之后,添加:

error_page 503 /maintenance.html;location = /maintenance.html {internal;root /usr/share/nginx/html;}

这样当 return 503 执行时,Nginx 会内部重定向到该 HTML,状态码仍为 503,用户看不到真实路径,也不会被缓存或直接访问。

4. 验证与注意事项

  1. 执行 nginx -t 检查语法,再 nginx -s reload 生效
  2. curl -I http://your-site/ 查看响应头,确认返回 HTTP/1.1 503 Service Temporarily Unavailable
  3. 浏览器访问应显示 maintenance.html 内容,且 PHP 脚本(如 /info.php)不会被执行
  4. 该方案不影响其他非 PHP 请求(如图片、CSS),它们仍可正常提供
  5. 若需排除特定路径(如健康检查接口 /health),可在 if 前加条件: if ($request_uri != "/health") { ... }

热门栏目