如何以编程方式将特定 nginx 服务器块设置为维护模式

如何以编程方式将特定 nginx 服务器块设置为维护模式

我正在寻找一种解决方案来自动化我们的应用程序部署过程之一。在部署开始时,我想以编程方式将指定的服务器设置为维护模式,最后在部署完成后,从 nginx 服务器中删除维护模式标志。

通过维护模式,我的意思是 nginx 应该对所有请求(可能带有自定义页面)做出 HTTP 响应代码 503 的响应。

我知道如何设置服务器块以响应 503 代码(请参阅http://www.cyberciti.biz/faq/custom-nginx-maintenance-page-with-http503/),但问题在于如何以编程方式最有效地做到这一点。

我想到两个选择:

选项1:在部署过程开始时,将维护文件写入文档根目录,并有条件地检查 nginx 服务器配置中是否存在维护文件:

server {
    if (-f $document_root/in_maintenance_mode) {
        return 503;
    }
}

此方法有一定的开销,因为每次请求都会检查文件是否存在。是否可以仅在加载 nginx 配置时检查文件是否存在?

选项 2:部署脚本会用维护版本替换整个 nginx 服务器配置文件,并在部署结束时将其换回。如果使用此方法,我担心其他自动化流程(如 puppet)可能会覆盖维护配置文件。

答案1

选项 1 是最佳选择。如果额外的文件请求让您感到困扰(尽管几乎没有开销),您可以将其替换为变量检查:

set $maintenance "on";
if ($maintenance = "on") {
    return 503;
}

答案2

我做的是这样的:

  • 不使用显式切换,而是让 haproxy(或 varnish)成为下一个上游组件
  • 禁用下一个组件或将其移至单独的端口
  • 使用以下代码片段:

    ...
    error_page 502 503 /_maintenance/index.html;
    location ^~ /_maintenance {
        alias some/place/on/your/disk/static/_maintenance;
    }
    ...
    

相关内容