我将一个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中启动?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)