我正在尝试删除配置中已弃用的 Docker 链接。剩下的就是在我重新创建容器时消除那些
Bad Gateway
nginx 反向代理错误。
注意:我在桥接模式下使用 Docker 网络。 (
docker network create nettest
)
我在 nginx 中使用以下配置片段:
location / {
resolver 127.0.0.1 valid=30s;
set $backend "http://confluence:8090";
proxy_pass $backend;
confluence
的容器,名称为 nettest
。 nettest
。confluence
confluence
列在 nginx 容器的 /etc/hosts
文件中send() failed (111: Connection refused) while resolving, resolver: 127.0.0.1:53
127.0.0.11
来自 /etc/resol.conf
confluence could not be resolved (3: Host not found)
有人知道如何使用 Docker Networks 配置 nginx 解析器,或者知道如何强制 Nginx 正确解析 Docker 网络主机名的替代方法吗?
首先,您应该使用位于
127.0.0.11
的 Docker 嵌入式 DNS 服务器。
您的问题可能是由以下其中一种原因引起的:
nginx 正在尝试使用 IPv6(AAAA 记录)进行 DNS 查询。
请参阅 https://stackoverflow.com/a/35516395/1529493 了解解决方案。
基本上是这样的:
http {
resolver 127.0.0.11 ipv6=off;
}
对于 Docker 1.11,这可能不再是问题:
修复不将 docker 域 IPv6 查询转发到外部服务器 (#21396)
请注意不要意外覆盖
resolver
配置指令。就我而言,我在 server
块 resolver 8.8.8.8 8.8.4.4;
中使用了 Mozilla 的 SSL 配置生成器,它覆盖了 resolver 127.0.0.11;
块中的 http
。这让我挠头很久了……也许您应该检查容器的
/etc/resolv.conf
它显示容器的正确 DNS 配置,然后使用该 DNS 服务器 IP 进行解析器。
127.0.0.11
在 Rancher 中不起作用
我正在使用 Angular 前端运行“node:12.18-alpine”,并使用 proxy_pass 遇到同样的问题。
在本地正在与:
resolver 127.0.0.11;
就这么简单!只需执行:
$ cat /etc/resolv.conf | grep nameserver
在你的容器中获取这个ip地址。
但是,当部署到 kubernetes (AWS EKS) 时,我遇到了同样的错误:
failed (111: Connection refused) while resolving, resolver: 127.0.0.11:53
解决方案:
第一个解决方案是找出 kube-dns 服务的 IP,如下所示:
$ kubectl get service kube-dns -n kube-system
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kube-dns ClusterIP 172.20.0.10 <none> 53/UDP,53/TCP 178d
简单地将 IP 替换为 CLUSTER-IP,效果非常好。
后来,经过更多的文档挖掘,我发现我可以通过名称引用该服务(这更加优雅和有弹性):
resolver kube-dns.kube-system valid=10s;
我的问题是最后的$request_uri。将其添加到 uri 末尾并将 127.0.0.1 更改为 127.0.0.11 解决了我的问题。我希望它能帮助人们不要花几个小时在这上面。
location /products {
resolver 127.0.0.11;
proxy_pass http://products:3000$request_uri;
}
在我遇到此错误的几种情况下,将
resolver_timeout 1s;
添加到 Nginx 配置中解决了该问题。大多数时候我没有 resolver
条目。
编辑:对于我可以显式定义名称服务器的容器也适用:
resolver DNS-IP valid=1s;
我们在 Windows 上使用 docker 容器尝试使用位于
host.docker.internal
的 docker 内部解析器来查找 127.0.0.11
。除了 host.docker.internal
之外,所有查询都会正确解析。修复方法是将 ipv6=off
标志添加到 nginx.conf
中的解析器行。
我通过以下方式解决了这个问题:
docker run --rm -d --network host --name "my_domain" nginx
在 Linux 上,接受的答案对于连接同一 Docker 网络下的容器来说效果很好,但它不适用于
host.docker.internal
或任何在组合中使用 --add-host
或 extra_hosts
的域,因为 Docker 的默认 DNS 127.0.0.11 不适用包括存储到 extra_hosts
文件中的 --add-host
和 /etc/hosts
条目。 2 个简单的解决方法是:
将 host.docker.internal 更改为 172.17.0.1,不确定 Docker 是否始终使用相同的 IP。
安装 dnsmasq 并在容器内运行 dnsmasq。将 nginx 解析器设置为 127.0.0.1.
您需要像
dnsmasq
这样的本地 DNS 服务器才能使用 127.0.0.1 进行解析。尝试使用 apk add --update dnsmasq
安装它,如果您使用的是 alpine (nginx:alpine
) 变体,请进行设置。