我通过运行 nginx让-nginx https://github.com/smashwilson/lets-nginx在 docker swarm 的默认 nginx 配置中(根据 let-nginx 项目):
服务:
ssl:
image: smashwilson/lets-nginx
networks:
- backend
environment:
- [email protected] /cdn-cgi/l/email-protection
- DOMAIN=api.finestructure.co
- UPSTREAM=api:5000
ports:
- "80:80"
- "443:443"
volumes:
- letsencrypt:/etc/letsencrypt
- dhparam_cache:/cache
api:
image: registry.gitlab.com/project_name/image_name:0.1
networks:
- backend
environment:
- APP_SETTINGS=/api.cfg
configs:
- source: api_config
target: /api.cfg
command:
- run
- -w
- tornado
- -p
- "5000"
api
是一个 Flask 应用程序,在 Swarm 覆盖网络的端口 5000 上运行backend
.
当服务最初启动时,一切正常。然而,每当我更新api
以一种方式使得api
容器在三节点群中的节点之间移动,nginx
无法将流量路由到新容器。
我可以在 nginx 日志中看到它坚持旧的内部 IP,例如 10.0.0.2,而新容器现在位于 10.0.0.4。
为了让 nginx“看到”新 IP,我需要重新启动 nginx 容器或docker exec
进入其中并kill -HUP
nginx 进程。
有没有更好的自动方法让 nginx 容器刷新其名称解析?
感谢@Moema 的指点,我想出了一个解决方案。 let-nginx 的默认配置需要进行如下调整,以使 nginx 能够接收 IP 更改:
resolver 127.0.0.11 ipv6=off valid=10s;
set $upstream http://${UPSTREAM};
proxy_pass $upstream;
这使用 docker swarm 的解析器和 TTL 并设置一个变量,强制 nginx 刷新 swarm 中的名称查找。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)