通过map和geo模块实现nginx全局维护开关,reload生效:维护时写入maintenance.flag触发$access_grant=0,统一return 403拦截;清空文件并reload即可恢复。

直接在 http 块里用一个开关变量控制全局访问策略,无需重启 Nginx,reload 即可生效。
用 map 模块定义维护开关
在 http 块顶部(server 块之前)添加:
map $sentinel_maintenance $access_grant {<br> default 1;<br> "on" 0;<br>}
这个 $access_grant 变量值为 1 表示放行,0 表示拦截。它由外部文件或环境变量触发切换。
把开关接入全局访问控制
在同一个 http 块中,紧接着加:
geo $maintenance_flag {<br> default 0;<br> include /etc/nginx/maintenance.flag;<br>}
然后创建文件 /etc/nginx/maintenance.flag,初始内容为空(即默认不启用维护)。需要紧急维护时,往里面写一行:127.0.0.1 1;(任意 IP + 1 都可,关键是让 $maintenance_flag 变成非零值)。
再在 http 块里统一设置拦截逻辑:
if ($maintenance_flag) {<br> set $sentinel_maintenance "on";<br>}
在所有 server 或 location 中统一应用
不用改每个 server,只需在 http 块末尾加一条全局规则:
server {<br> listen 80 default_server;<br> location / {<br> if ($access_grant = 0) { return 403; }<br> }<br>}
或者更稳妥地,在每个 location 里统一加:deny $access_grant = 0;(注意:Nginx 不支持直接 deny 变量,所以推荐用 return 403 方式)
一键切换操作流程
- 启用维护:执行
echo "127.0.0.1 1" > /etc/nginx/maintenance.flag && nginx -s reload - 解除维护:执行
truncate -s 0 /etc/nginx/maintenance.flag && nginx -s reload - 验证状态:访问任意路径,返回 403 表示已拦截;返回正常页面表示已放开











