繁体   English   中英

Nginx + Docker - 与上游“连接到上游时没有实时上游”,但与 proxy_pass 一起工作正常

[英]Nginx + Docker - "no live upstreams while connecting to upstream" with upstream but works fine with proxy_pass

所以我一直面临一个奇怪的问题,我不确定问题出在哪里。 我正在使用 docker-compose 运行一个容器,以下 nginx 配置效果很好:

server {
  location / {
        proxy_pass http://container_name1:1337;
  }
}

其中 container_name 是我在 docker-compose.yml 文件中提供的服务名称。 它完美地解析到 IP 并且可以正常工作。 但是,当我将上述文件更改为:

upstream backend {
    least_conn;
    server container_name1:1337;
    server container_name2:1337;
}

server {
    location / {
        proxy_pass http://backend;
    }
}

它完全停止工作,在错误日志中我得到以下信息:

2020/03/17 13:16:03 [error] 8#8: *11 no live upstreams while connecting to upstream, client: xxxxxx, server: codedamn.com, request: "GET /HTTP/1.1", upstream: "http://backend/", host: "xxxxx"

这是为什么? 在上游块内时,nginx 是否无法解析 DNS? 任何人都可以帮助解决这个问题吗?

注意:这仅在生产环境 (Ubuntu 16.04) 和本地环境 (macOS Catalina) 上发生,相同的配置工作正常。 发现这一点后,我完全糊涂了。

更新 1:以下工作:

upstream backend {
    least_conn;
    server container_name1:1337;
}

但不能超过一台服务器。 为什么?!

好吧。 弄清楚了。 这是因为docker-compose随机创建容器,并且 nginx 快速将容器标记为down (当有一些流量时,我在生产中部署了它)。 应用程序容器尚未准备好,但 nginx 已准备就绪,因此它将它们标记为关闭并停止转发任何流量。

现在,我没有同步docker-compose容器创建顺序(正如我发现的那样,这有点 hacky),我禁用了 nginx 通过写入自动将服务标记为关闭的失败尝试:

server app_inst1:1337 max_fails=0;

这让 nginx 仍然可以将流量转发到特定服务(并且我的 docker 配置为在容器崩溃时重新启动容器),这很好。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM