用 try_files 实现网站维护模式的核心是通过文件存在性自动分流:nginx 每次请求先检查 maintenance.html 是否存在,存在则返回 503 状态及维护页,否则正常处理;切换仅需 touch 或 rm 文件,无需 reload。

用 try_files 实现网站维护模式,核心是“不改配置、不 reload、靠文件状态自动分流”——用户请求进来时,Nginx 先检查一个维护标记文件是否存在;存在就直接返回维护页并给 503 状态,否则照常处理业务逻辑。整个过程对前端透明,切换只需一条命令。
维护页文件准备
把维护页面(如 maintenance.html)放在网站根目录下,例如:/var/www/html/maintenance.html
内容建议包含简明提示、倒计时或刷新逻辑,并加上 HTTP 头增强体验:
- 在维护页 HTML 中加入:
<meta http-equiv="refresh" content="60"> - 在 Nginx 配置中加:
add_header Retry-After 60;,告诉爬虫和浏览器稍后再试
关键配置:用 try_files 做存在性判断
在 location / { ... } 块中写入以下指令:
try_files /maintenance.html $uri $uri/ /index.php?$query_string;
说明:
-
/maintenance.html是绝对路径(相对于root),Nginx 会先检查它是否存在 - 如果存在,直接返回该文件,并自动带上 200 状态;要强制返回 503,需配合
error_page - 更推荐的写法是结合命名 location 实现精准控制:
try_files /maintenance.html @normal; location @normal { try_files $uri $uri/ /index.php?$query_string; } error_page 503 /maintenance.html;然后在 server 块顶部加:
if (-f /var/www/html/maintenance.html) { return 503; }(注意:仅限 location 外慎用 if,此处为常见可行用法)
linux-sysadmin下载Linux系统管理专家,覆盖12大模块:用户权限、SSH、存储、网络、systemd、防火墙、日志监控、备份恢复、TLS证书、Ansible、容器、IaC。提供配置、验证、加固、监控、备份、自动化、故障排查、回滚闭环。关键词:useradd、sudo、sshd_config、chmod、SEL...
一键切换:touch 或 rm 即生效
运维操作极简:
- 开启维护:
touch /var/www/html/maintenance.html - 关闭维护:
rm /var/www/html/maintenance.html - 无需
nginx -s reload,Nginx 每次请求都会实时检查文件是否存在
进阶:避免 if 的更稳妥方案
若想完全规避 if 指令(因 Nginx 官方不推荐在 location 外使用),可用 map + 文件路径映射:
- 在
http{}块中添加:
map $document_root $maint_status {
default 0;
"~*/maintenance.html" 1;
}
再在 server{} 中用:
if ($maint_status) {
return 503;
}
或者更轻量的方式:把维护文件放到独立路径(如 /tmp/maint.on),用 try_files /tmp/maint.on =503 @normal; ——只要该文件存在,就立即返回 503,然后由 error_page 503 指向真正的维护页。










