![我该如何进一步排除“502 Bad Gateway”错误?](https://linux22.com/image/766006/%E6%88%91%E8%AF%A5%E5%A6%82%E4%BD%95%E8%BF%9B%E4%B8%80%E6%AD%A5%E6%8E%92%E9%99%A4%E2%80%9C502%20Bad%20Gateway%E2%80%9D%E9%94%99%E8%AF%AF%EF%BC%9F.png)
我在 Docker 环境中运行一组服务。所有服务都位于同一个 nginx 反向代理容器后面,该容器使用 letsencrypt 加密并根据子域拆分传入流量。
今天突然(当我正在摆弄另一项服务时)我的 Nextcloud 容器502 Bad Gateway
在通过反向代理访问时开始返回。
所有其他服务均运行良好。
当检查error.log
nginx 记录这些错误时,我可以看到很多这样的错误:
512 connect() failed (111: Connection refused) while connecting to upstream
这让我相信 Nextcloud 容器实例出了问题。
因此我检查了容器的状态(我最近重新启动了系统,因此已经 13 分钟了):
docker ps -a | grep Nextcloud
6a4cd6dde4f6 nextcloud:21.0.1 "/entrypoint.sh apac…" About an hour ago Up 13 minutes 80/tcp Nextcloud
一切似乎都很好。因此,我通过在终端中运行 docker-compose(而不是在后台将其作为守护进程运行)来检查容器的输出,这根本没有给我带来任何有趣的新输出。我的浏览器刷新似乎根本没有到达 Nextcloud 容器。
之后我想看看 Nextcould 容器是否有响应,所以我将主机的端口 5555 转发到 nextcloud 容器的端口 80,并直接在端口 5555 上连接到主机 IP。这有效。我得到了“通过不受信任的域访问”页面,这很有意义,因为我直接通过主机的 IP 访问它。
好的,所以反向代理容器正在经历connection refused
,并且 Nextcloud 容器根本没有收到任何请求,但除此之外似乎运行良好。
然后,我创建了一个临时的 Ubuntu 故障排除容器,并将其连接到与反向代理容器和 Nextcloud 容器相同的 docker 网络。安装一些工具后,我运行了以下命令:
root@491b7ef0f34f:/# ping Nextcloud
PING Nextcloud (10.10.7.3) 56(84) bytes of data.
64 bytes from Nextcloud.couplernets_nextcloud (10.10.7.3): icmp_seq=1 ttl=64 time=0.127 ms
64 bytes from Nextcloud.couplernets_nextcloud (10.10.7.3): icmp_seq=2 ttl=64 time=0.080 ms
64 bytes from Nextcloud.couplernets_nextcloud (10.10.7.3): icmp_seq=3 ttl=64 time=0.083 ms
64 bytes from Nextcloud.couplernets_nextcloud (10.10.7.3): icmp_seq=4 ttl=64 time=0.085 ms
^C
--- Nextcloud ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3074ms
rtt min/avg/max/mdev = 0.080/0.093/0.127/0.019 ms
root@491b7ef0f34f:/# nmap -sV -p- Nextcloud
Starting Nmap 7.80 ( https://nmap.org ) at 2021-04-25 18:43 UTC
Nmap scan report for Nextcloud (10.10.7.3)
Host is up (0.0000090s latency).
rDNS record for 10.10.7.3: Nextcloud.couplernets_nextcloud
Not shown: 65534 closed ports
PORT STATE SERVICE VERSION
80/tcp open http Apache httpd 2.4.38 ((Debian))
MAC Address: 02:42:0A:0A:07:03 (Unknown)
Service detection performed. Please report any incorrect results at https://nmap.org/submit/
Nmap done: 1 IP address (1 host up) scanned in 7.64 seconds
root@491b7ef0f34f:/# wget Nextcloud:80/index.html
--2021-04-25 18:45:28-- http://nextcloud/index.html
Resolving nextcloud (nextcloud)... 10.10.7.3
Connecting to nextcloud (nextcloud)|10.10.7.3|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 156 [text/html]
Saving to: 'index.html.1'
index.html.1 100%[===================>] 156 --.-KB/s in 0s
2021-04-25 18:45:28 (7.66 MB/s) - 'index.html.1' saved [156/156]
这告诉我 Nextcloud 实例应该没有问题,因为它的端口是开放的,我可以index.html
毫无问题地访问该文件。
然后我去检查我的 nginx 反向代理配置。
server {
listen 443 ssl;
listen [::]:443 ssl;
#Add HSTS preload header
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
#Remove revealing headers
server_tokens off;
proxy_hide_header X-Powered-By;
server_name <cloud.domain.topdomain>;
include /config/nginx/ssl.conf;
client_max_body_size 0;
location / {
include /config/nginx/proxy.conf;
proxy_max_temp_file_size 2048m;
proxy_pass http://Nextcloud:80/;
}
}
此配置与通过同一反向代理容器的所有其他服务完全相同。唯一不同的是server_name
和proxy_pass
配置参数。
从现在起,我不知道下一步该做什么。请帮助我。任何帮助我都会非常感激。
答案1
事实证明,问题在于内部 Docker 容器名称到 IP 的解析出现了异常。
当我连接到反向代理容器并运行ping Nextcloud
该容器时,错误地解析了 Nextcloud 容器的 IP。因此,每当我尝试将任何内容发送到 Nextcloud 容器时,docker 网络层都会错误地解析 Nextloud 容器的 IP 并将流量发送到错误的容器,从而导致连接被拒绝。
我的解决方案是关闭错误解析的容器。之后,我的 Nextcloud 容器可以使用主机名“Nextcloud”访问。
问题的原因尚不清楚。如果我能找到答案,我会回来这里。
答案2
就我的情况来说,这是防火墙的问题。我禁用了防火墙,然后就好了。
通过 curl docker IP 得到了线索,可以正确输出 html 主页。
sudo ip addr show docker0
4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:a9:60:8e:f4 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
curl 172.17.0.1:5870
我的应用程序在端口 5870 上运行,在禁用防火墙之前:
curl 127.0.0.1:5870
curl: (56) Recv failure: Connection reset by peer
curl 0.0.0.0:5870
curl: (56) Recv failure: Connection reset by peer
之后:我得到了 HTML 页面输出。