Nginx不会自动获取群中的dns更改

sas*_*sas 4 nginx docker docker-swarm nginx-reverse-proxy

我通过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"
Run Code Online (Sandbox Code Playgroud)

api是在群体覆盖网络的端口5000上运行的Flask应用backend

最初启动服务时,一切正常。但是,每当我api以使api容器在三个节点群中的节点之间移动的方式进行更新时,都nginx无法将流量路由到新容器。

我在nginx日志中看到,当新容器现在位于10.0.0.4上时,它会粘贴到旧的内部ip,例如10.0.0.2。

为了使nginx“看到”新IP,我需要重新启动nginx容器,或者重新启动docker exec它并kill -HUP进入nginx进程。

有没有更好的自动方法来使Nginx容器刷新其名称解析?

sas*_*sas 6

感谢@Moema的指针,我想出了一个解决方案。需要对let-nginx的默认配置进行如下调整,以使nginx获取IP更改:

  resolver 127.0.0.11 ipv6=off valid=10s;
  set $upstream http://${UPSTREAM};
  proxy_pass $upstream;
Run Code Online (Sandbox Code Playgroud)

这会使用带有TTL的docker swarm的解析器并设置一个变量,从而迫使nginx刷新swarm中的名称查找。