【问题标题】:How to force NGINX to use backup upstream and vice versa?如何强制 NGINX 使用备份上游,反之亦然?
【发布时间】:2022-02-04 11:30:48
【问题描述】:

也许这并不常见,但我喜欢在我的 nginx 负载均衡器中使用上游定义,如下所示:

upstream backend {
  server primary.local.net:80;
  server backup.local.net:80 backup;
}

帮助这些主机的维护过程。首先,我使用最新软件准备 backup.local.net,然后将服务切换到备份,并对 primary.local.net 执行相同操作。最后,再次切换回主节点。

现在我正在通过加载第二个配置文件来做到这一点:

upstream backend {
  server primary.local.net:80 backup;
  server backup.local.net:80;
}

使用命令:

nginx -s reload

但这很费力,希望有更聪明的方法来做到这一点?

【问题讨论】:

    标签: nginx


    【解决方案1】:

    首先,在 NGINX 中使用上游定义应该很常见!这是首选的方法。

    不幸的是,NGINX 开源并没有一个简单的解决方案。但是为什么不尝试构建不需要重新加载任何配置的东西呢。

    所以我们有两个上面提到的上游定义

    upstream blue{
      server primary.local.net:80;
      server backup.local.net:80 backup;
    }
    
    upstream green{
      server primary.local.net:80;
      server backup.local.net:80 backup;
    }
    

    蓝色是primarygreen 是次要的。如果你说你准备了一些东西,你认为有可能在你的后端有一些东西告诉 NGINX 哪些部署当前处于活动状态。蓝色还是绿色?

    另一种选择可能是保存该信息的 NGINX 实例上的文件。 njs 将能够从该文件中读取并根据提供的信息定义要使用的上游。

    https://nginx.org/en/docs/njs/reference.html#njs_api_fs

    快速 POC:

    upstream.conf

    upstream blue {
      server 127.1:9000;
      server 127.1:9100 backup;
    }
    
    upstream green {
      server 127.1:9000 backup;
      server 127.1:9100;
    }
    
    
    js_import upstream from conf.d/upstream.js;
    js_set $upstream upstream.set;
    
    server {
      listen 80;
    
      location / {
        proxy_pass http://$upstream/;
      }
    }
    
    
    

    upstream.js

    export default { set }
    
    function set(r) {
      var fs = require('fs');
    
      try {
        var c =  fs.readFileSync("/etc/nginx/conf.d/active.txt");
      } catch (e) {
        r.error("Error while reading upstrem file.");
        // maybe set c to somehting default then.
      }
      return c;
    }
    

    active.txt

    blue
    

    注意:确保创建的文件末尾没有换行符,例如 echo -n "blue" > active.txt

    您现在可以在运行时更改active.txt 的内容,并且上游将被动态配置。使用此解决方案,您甚至可以检查请求标头,如果您想在上游测试inactive,这也可以。不过相当灵活。

    【讨论】:

      【解决方案2】:

      /etc/nginx 有一个模式,其中您有一个主 nginx.conf 文件,该文件将所有配置文件加载到另一个目录中,例如“active_services”。

      您的实际配置文件存储在“available_services”中,并符号链接到 active_services 目录。

      要么翻转链接,要么删除一个并创建另一个。

      【讨论】:

      • 这就是 Ubunut Package / httpd 的做法。 “官方”NGINX 方式是拥有一个conf.d 目录并使用包含来包含与给定模式匹配的配置文件。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-16
      • 2011-08-18
      • 2011-12-20
      • 2014-12-04
      • 1970-01-01
      相关资源
      最近更新 更多