用独立 server 块实现在线维护页切换,不修改主配置、不 reload 全局、不影响其他站点;仅通过增删专用配置文件(如 shop-maint.conf)控制单域名维护状态,配合 return 503 + error_page 503 返回 maintenance.html,并添加 Retry-After 响应头。

用独立的 server 块实现在线维护页静态切换,核心是“不碰主配置、不 reload 全局、不影响其他站点”,只靠增删一个专用配置文件就能控制单个域名是否进入维护状态。
准备维护页面文件
把 maintenance.html 放到 Nginx 可读路径下,例如 /usr/share/nginx/html/maintenance.html。确保:
- 文件由 Nginx 工作用户(如
nginx或www-data)可读,权限建议设为644 - 内容为纯静态 HTML,含简明提示、预计恢复时间(可用 JS 渲染倒计时)
- 可选添加
<meta http-equiv="refresh" content="30">,提示用户自动刷新重试
新建高优先级维护 server 块
为待维护域名(如 shop.example.com)单独建一个配置文件,例如 /etc/nginx/conf.d/shop-maint.conf,内容如下:
- 监听与主站相同的端口(
80和443都要配) -
server_name精确匹配目标域名,不带通配符 - 用
return 503主动触发错误,再通过error_page 503 /maintenance.html统一返回维护页 - HTTPS 站点必须同步配置 443 块,并复用原站证书路径(
ssl_certificate和ssl_certificate_key)
启用或停用只需一次重载
切换操作本身不修改任何已有配置,仅靠文件存在与否控制:
- 开启维护:执行
touch /etc/nginx/conf.d/shop-maint.conf - 关闭维护:执行
rm /etc/nginx/conf.d/shop-maint.conf - 验证并生效:
nginx -t && nginx -s reload,所有请求即时切换,零连接中断
提升维护体验的配套设置
在维护 server 块中加入以下指令,让响应更规范友好:
- 添加响应头:
add_header Retry-After "60";,告诉客户端或爬虫 60 秒后重试 - 确保
error_page指向的路径与root匹配,避免 404 - 避免使用
proxy_pass或rewrite,防止绕过503状态码

















