![](/img/trans.png)
[英]Docker: proxy_pass to another container - nginx: host not found in upstream
[英]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.