node.js - 如何在 docker 中快速故障转移 nginx 上游容器(蓝/绿部署)

标签 node.js nginx docker deployment docker-cloud

当上游容器之一出现故障时,如何让 dockerized nginx 快速进行故障转移?在非 Docker 环境中,故障转移似乎是瞬时的,但在 Docker 化时,多个请求会超时。

我在同一 Node 应用程序的两个实例前面的单个 Node/虚拟机上使用 nginx 作为负载均衡器/代理。我设想新版本部署如下(通常称为 blue-green deployments ):

  1. 新版本的 Node 应用程序已推送到 github
  2. Docker hub 构建新镜像
  3. 其中一个上游容器被拆除、升级并重新部署
  4. 当其中一个容器被关闭时,nginx 会自动故障转移到另一个事件容器
  5. 部署升级后的容器后,另一个容器也会脱机以进行升级/重新部署

但是,在 nginx 上并不能无缝地执行#4。当我为了版本升级而关闭上游容器之一时,nginx 会在发现其中一个容器已关闭时使多个请求超时(以循环方式)。我在非 Docker 环境中没有发生过这种情况。

这是我的 Docker 云堆栈文件:

load-balancer:
  image: 'foo/load-balancer:latest'
  links:
    - node-blue
    - node-green
  ports:
    - '80:80'
node-blue:
  image: 'foo/node-app:latest'
node-green:
  image: 'foo/node-app:latest'

nginx.conf 如下所示:

events {
  worker_connections  1024;
}

http {
  gzip on;

  upstream app {
    server node-green;
    server node-blue;
  }

  server {
    listen 80;
    server_name app.local;
    location / {
        proxy_pass http://app;
    }
  }
}

最佳答案

经过一番折腾,我想我找到了一个合理的解决方案。将自定义 nginx 容器替换为 dockercloud/haproxy 。显然负载均衡器需要能够监听 docker cloud events ,并进行相应调整。

堆栈文件现在看起来像:

load-balancer:
  image: 'dockercloud/haproxy:1.5.3'
  restart: always
  roles:
    - global
  links:
    - node-blue
  ports:
    - '80:80'
node-blue:
  image: 'foo/node-app:latest'
  environment:
    - VIRTUAL_HOST=app.local
node-green:
  image: 'foo/node-app:latest'
  environment:
    - VIRTUAL_HOST=app.local

当我想部署新版本时,我只需运行以下脚本:

docker-cloud service set --link node-green:node-green load-balancer
docker-cloud service redeploy node-blue --sync
docker-cloud service set --link node-blue:node-blue load-balancer
docker-cloud service redeploy node-green --sync

关于node.js - 如何在 docker 中快速故障转移 nginx 上游容器(蓝/绿部署),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39275645/

相关文章:

html - 带有 CSS 的外部 HTML 文件作为 nodemailer 中的电子邮件内容

javascript - 使用 Nodejs Post 请求接收 net::ERR_EMPTY_RESPONSE

docker - 脚本从Docker容器开始

node.js - 在 url 中显示用户输入是否危险

javascript - 从 ReactJS 应用程序调用 CMD 命令行

amazon-web-services - 在 AWS Elastic Beanstalk 上运行 Docker 容器 - 502 Bad Gateway nginx/1.6.2

angularjs - Node 应用程序中 NGINX 502 错误网关中的 2 分钟 Http 请求超时

php - Nginx 与子位置

docker - 使用 docker 日志从 Gitlab CI 获取输出

java - Heroku 容器 :release throwing UnhandledPromiseRejectionWarning: