nginx 不会自动获取 swarm 中的 dns 更改

2024-03-09

我通过运行 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 -HUPnginx 进程。

有没有更好的自动方法让 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(使用前将#替换为@)

nginx 不会自动获取 swarm 中的 dns 更改 的相关文章

随机推荐