【发布时间】:2017-10-10 07:00:28
【问题描述】:
我在 docker swarm 的默认 nginx 配置(根据lets-nginx项目)中通过lets-nginx运行nginx:
服务:
ssl:
image: smashwilson/lets-nginx
networks:
- backend
environment:
- EMAIL=sas@finestructure.co
- 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 是一个烧瓶应用程序,在 swarm 覆盖网络 backend 的 5000 端口上运行。
最初启动服务时,一切正常。但是,每当我更新api 以使api 容器在三个节点群中的节点之间移动时,nginx 无法将流量路由到新容器。
当新容器现在位于 10.0.0.4 上时,我可以在 nginx 日志中看到它坚持使用旧的内部 ip,例如 10.0.0.2。
为了让 nginx '看到'新 IP,我需要重新启动 nginx 容器或 docker exec 进入它,kill -HUP nginx 进程。
有没有更好的自动方式让 nginx 容器刷新其名称解析?
【问题讨论】:
-
您可以尝试将
proxy_pass设置为变量并定义解析器以强制重新解析,如下所示:serverfault.com/questions/240476/… -
好的提示 - 但我已经仔细检查过,默认配置包括
proxy_pass http://${UPSTREAM};,它被lets-nginx 替换为配置的主机名 -
或者此设置带有
set ...子句是否相关?我会试试看。 -
是的,它与使用
set设置变量以及定义解析器有关 -
好的,我已经尝试了建议的配置更改(
resolver和set ...),但它似乎仍然没有接受服务 ips 的更改。
标签: docker nginx docker-swarm nginx-reverse-proxy