nginx不会自动获取群集中的dns更改
我通过docker swarm中的缺省nginxconfiguration(根据lets-nginx项目)中的let-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
是一个在群集覆盖networkingbackend
上运行5000端口的应用程序。
当服务最初启动时,一切正常。 然而,每当我更新api
使api
容器在三个节点群中的节点之间移动时, nginx
无法将stream量路由到新的容器。
我可以看到在nginx日志中,当新的容器现在在10.0.0.4上时,它粘在旧的内部IP上,例如10.0.0.2。
为了让nginx'看到'新的IP,我需要重新启动nginx容器或docker exec
到它并kill -HUP
nginx进程。
是否有一个更好的自动的方法,使nginx容器刷新其名称parsing?
感谢@ Moema的指针,我想出了一个解决scheme。 let-nginx的默认configuration需要调整如下,以使nginx获取IP更改:
resolver 127.0.0.11 ipv6=off valid=10s; set $upstream http://${UPSTREAM}; proxy_pass $upstream;
这使用docker swarm的parsing器与TTL并设置一个variables,迫使nginx刷新群体中的名称查找。