如何让nginx等待我的上游服务在Docker Swarm中启动?

如何让nginx等待我的上游服务在Docker Swarm中启动?,第1张

概述如何让nginx等待我的上游服务在Docker Swarm中启动

我将一个Nginx代理服务和一个rails应用服务部署到一个docker swarm中。 Nginx取决于我的docker-compose文件中的应用程序。

我的Nginx.conf文件将stream量导向我的上游应用服务(在端口3000上公开),就像这样(只显示上游部分)。

upstream puma { server app:3000; }

我的docker-compose文件看起来像这样:

version: '3.1' services: app: image: my/rails-app:latest networks: - proxy web: image: my/Nginx:1.11.9-alpine command: /bin/sh -c "Nginx -g 'daemon off;'" ports: - "80:80" depends_on: - app networks: - proxy networks: proxy: external: true

我的主机设置为swarm manager。

这一切工作完全正常 – 没有问题。

但是 ,即使在我的docker-compose文件中有一个依赖部分 – 在Nginx服务启动时应用程序服务可能不会完全 (?)准备就绪,所以当上游服务configuration部分尝试DNSparsing“app: 3000“,好像还没有完全find它。 所以,当我访问我的网站时,我在我的Nginx日志中find以下错误消息:

2017/02/13 10:46:07 [error] 8#8: *6 connect() Failed (111: Connection refused) while connecting to upstream,clIEnt: 10.255.0.3,server: www.mysite.com,request: "GET / http/1.1",upstream: "http://127.0.53.53:3000/",host: "preprod.local"

如果我杀死了正在运行Nginx服务的docker容器,并且swarm重新调度它一会儿,然后返回,如果我然后访问相同的URL它完全正常,并且请求成功地传递到app:3000。

我怎样才能防止这种情况的发生 – 启动时间有一点点,当Nginx启动的时候,它还不能正确parsing我的叫做app:3000的群集服务 – 而是试图将stream量传递到一个IP地址….

顺便说一句 – 如果我重新启动我的虚拟机相同的情况 – 当docker(在群模式)再次提出服务 – 我可以结束了同样的问题。 重新启动Nginx容器解决了这个问题。

我已经想出了一种方法来做到这一点 – 这是使用Dockerfile或docker-compose文件的HEALTHCHECK部分。

首先,看起来好像在部署堆栈的时候, depends_on选项没有被真正使用

docker stack deploy -c docker-compose.yml mystack

Swarm模式下的Docker如果由于其他原因无法正常启动或失败,则会重新启动服务任务。 所以, depends_on选项并不是那么有用。

所以这是我的解决方案,到目前为止它的工作得很好:

version: '3.1' services: app: image: my/rails-app:latest networks: - proxy web: image: my/Nginx:1.11.9-alpine command: /bin/sh -c "Nginx -g 'daemon off;'" ports: - "80:80" networks: - proxy healthcheck: test: ["CMD","wget","-qO-","http://localhost/healthcheck"] interval: 5s timeout: 3s retrIEs: 3 networks: proxy: external: true

所以我做的是,从Nginx服务器我尝试访问我的Rails应用程序的路线 – 我创建了一个名为/ healthcheck,它返回一个200的状态代码。

所以,当我尝试访问它,结果是失败(应用程序服务器还没有准备好) – Nginx将被重新启动。 希望当它再次启动时,应用程序服务器将可用,并且上游应用程序:3000指令将执行正确的DNS解析。

所以用这种方法,我一起“砍死”了在群集模式下工作的(missing) depends_on行为。

depends_on选项不会等待容器准备就绪,直到它运行。 https://docs.docker.com/compose/startup-order/

还有两个选项。

从Compose v2.1开始,可以在depends_on选项中包含healthcheck。 https://docs.docker.com/compose/compose-file/compose-file-v2/#dependson

你可以使用像dockerize或wait-for-it这样的外部工具来做同样的事情 。

总结

以上是内存溢出为你收集整理的如何让nginx等待我的上游服务在Docker Swarm中启动?全部内容,希望文章能够帮你解决如何让nginx等待我的上游服务在Docker Swarm中启动?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1249749.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存