Nginx 用 try_files 实现整站离线维护模式,通过 touch/rm /var/run/nginx-maint.flag 开关文件触发 503 状态码返回维护页,无需重载配置、不中断连接、实时生效。

在 Nginx 中,用 try_files 实现整站离线维护模式,核心是让所有请求(除特定资源外)都返回一个预设的维护页,同时保持 HTTP 状态码为 503 Service Unavailable,并支持快速回切——无需重载配置、不中断连接、不改变 upstream 状态。
维护页准备与状态码控制
先准备好静态维护页(如 /usr/share/nginx/html/maint.html),内容可含提示语和倒计时。关键不是只返回页面,而是必须返回标准 503 状态码,否则搜索引擎或监控系统无法识别为临时不可用。
在 server 块中添加:
error_page 503 /maint.html;
location = /maint.html {
internal;
root /usr/share/nginx/html;
}这确保只有内部跳转能访问该页,防止用户直接请求 /maint.html 暴露维护状态。
用 try_files 统一拦截所有请求
在 location / 块中,利用 try_files 的“文件不存在即 fallback”逻辑,结合一个**始终不存在的标记文件**来触发维护模式:
- 创建一个开关文件,比如
/var/run/nginx-maint.flag - 正常时该文件不存在 →
try_files $uri $uri/ @backend继续转发 - 维护时手动创建该文件 →
try_files /var/run/nginx-maint.flag =503直接返回 503
完整写法示例:
location / {
# 维护开关:存在则全站 503
try_files /var/run/nginx-maint.flag =503 $uri $uri/ @backend;
}
<p>location @backend {
proxy_pass <a href="https://www.php.cn/link/c51722d35b697aaf591f6066d68b57bd">https://www.php.cn/link/c51722d35b697aaf591f6066d68b57bd</a>;
proxy_set_header Host $host;
}</p>注意顺序:/var/run/nginx-maint.flag 放最前,且用 =503 显式指定状态码;后面才是正常路径回退逻辑。
无缝切换的关键操作细节
真正“无缝”的关键是:不 reload、不 restart、不改配置文件。
- 开启维护:
touch /var/run/nginx-maint.flag - 关闭维护:
rm /var/run/nginx-maint.flag - Nginx 在每次请求时实时检查该文件是否存在,毫秒级生效
- 已建立的长连接(如 WebSocket、HTTP/2 流)不受影响,新请求立即走维护逻辑
建议配合 proxy_cache_bypass 和 expires -1 避免维护页被 CDN 或浏览器缓存太久。
增强可用性的小技巧
运维人员需要访问后台?加一条白名单规则:
location / {
# 允许内网或指定 IP 跳过维护
if ($remote_addr ~ "^(192\.168\.|10\.)") {
break;
}
try_files /var/run/nginx-maint.flag =503 $uri $uri/ @backend;
}或者更安全地用 map 配合 allow/deny 控制,避免 if 在 location 中的限制问题。也可为维护页加简单 JS 自动刷新检测开关文件是否移除,实现“半自动恢复”提示。











