我正在尝试摆脱配置中已弃用的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
上启动了nginx容器。confluence
confluence
列在nginx容器的/etc/hosts
文件127.0.0.11
/etc/resol.conf
confluence could not be resolved (3: Host not found)
有人知道如何使用Docker Networks配置nginx解析器,或者如何强制Nginx正确解析Docker网络主机名吗?
答案 0 :(得分:73)
首先,您应该在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;
resolver 127.0.0.11;
http
,它覆盖了ImageView
区块中的SELECT INVOICE_QUANTITY * ISNULL(MANUAL_PRICE,ISNULL(LIST_PRICE,0)) as Revenue
。这让我长时间摸不着头......
答案 1 :(得分:3)
也许你应该检查你的容器/etc/resolv.conf
它显示了您的容器的正确DNS配置,然后将该DNS服务器IP用于解析器。
127.0.0.11
在Rancher中不起作用
答案 2 :(得分:2)
我正在使用 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
简单地替换 CLUSTER-IP 的 IP 就像一个魅力。
后来,经过更多的文档挖掘,我发现我可以通过名称来引用服务(这样更优雅和更有弹性):
resolver kube-dns.kube-system valid=10s;
答案 3 :(得分:0)
我们在Windows上的docker容器上尝试使用172.0.0.11的docker内部解析器来查找host.docker.internal。除host.docker.internal外,所有查询都可以正确解析。解决的方法是将ipv6 = off标志添加到nginx.conf中的解析器行。
答案 4 :(得分:0)
在某些情况下,我遇到此错误,将resolver_timeout 1s;
添加到Nginx配置中可以解决此问题。大多数情况下,我没有resolver
条目。
编辑:对于我可以显式定义名称服务器的容器也有效:resolver DNS-IP valid=1s;
答案 5 :(得分:0)
我通过以下方式解决了这个问题:
docker run --rm -d --network host --name "my_domain" nginx
答案 6 :(得分:0)
我的问题是 $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;
}
答案 7 :(得分:-1)
您需要像dnsmasq
这样的本地DNS服务器才能使用127.0.0.1解析。尝试使用apk add --update dnsmasq
进行安装,如果您正在使用高山(nginx:alpine
)变种,请进行设置。