Oracle Cloud上Nginx Proxy Manager出现502 Bad Gateway问题求助
解决Nginx Proxy Manager反向代理502 Bad Gateway问题
问题背景
在Oracle Cloud的Ubuntu实例上通过docker-compose部署了两个容器:
- Nginx Proxy Manager容器,配置如下:
version: "3" services: app: image: 'jc21/nginx-proxy-manager:latest' restart: unless-stopped ports: - '80:80' # Public HTTP Port - '443:443' # Public HTTPS Port - '81:81' # Admin Web Port environment: DISABLE_IPV6: 'true' volumes: - ./data:/data - ./letsencrypt:/etc/letsencrypt
- 网站容器,配置如下:
version: '3' services: app: image: 'nginx:latest' restart: unless-stopped ports: - '91:80' volumes: - ./data:/usr/share/nginx/html
服务器iptables规则(执行sudo iptables -L INPUT -n --line-numbers输出):
Chain INPUT (policy ACCEPT) num target prot opt source destination 1 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED 2 ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 3 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 4 ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0 udp spt:123 5 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22 6 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
当前现象:通过IP:91访问网站正常,但通过域名访问时出现502 Bad Gateway错误。
排查与解决步骤
1. 测试容器间网络连通性
Nginx Proxy Manager容器无法访问网站容器是502的核心原因,先验证连通性:
# 获取Nginx Proxy Manager容器ID docker ps | grep nginx-proxy-manager # 进入容器内部 docker exec -it <容器ID> /bin/bash # 测试访问网站容器的主机IP:91 curl <服务器公网IP>:91 # 或测试网站容器内部IP:80(更准确,因为主机91端口映射到容器80) # 先查网站容器内部IP docker inspect <网站容器ID> | grep "IPAddress" # 在Proxy Manager容器内执行curl curl <网站容器内部IP>:80
如果curl失败,说明网络不通,继续以下步骤。
2. 统一容器网络
默认情况下两个容器处于独立的bridge网络,无法直接通过服务名访问,需加入同一自定义网络:
修改Nginx Proxy Manager的docker-compose.yml:
version: "3" services: app: image: 'jc21/nginx-proxy-manager:latest' restart: unless-stopped ports: - '80:80' - '443:443' - '81:81' environment: DISABLE_IPV6: 'true' volumes: - ./data:/data - ./letsencrypt:/etc/letsencrypt networks: - web-network networks: web-network: name: web-network
修改网站容器的docker-compose.yml:
version: '3' services: app: image: 'nginx:latest' restart: unless-stopped # 可移除主机端口映射,内部网络直接访问容器80端口 # ports: # - '91:80' volumes: - ./data:/usr/share/nginx/html networks: - web-network networks: web-network: external: true name: web-network
重启两个容器:
# 重启Proxy Manager docker-compose down && docker-compose up -d # 重启网站容器 docker-compose down && docker-compose up -d
3. 更新反向代理目标
登录Nginx Proxy Manager后台(服务器IP:81),修改域名的反向代理配置:
- 将目标地址从
公网IP:91改为网站容器的服务名(如app:80)或内部IP:80。
4. 检查iptables转发规则
容器间通信依赖FORWARD链规则,执行以下命令确认:
sudo iptables -L FORWARD -n --line-numbers
确保没有拒绝容器间流量的规则,Docker默认会自动添加允许同一网络内容器通信的规则。
5. 查看Proxy Manager日志定位问题
通过日志获取具体错误信息:
docker logs <Nginx Proxy Manager容器ID>
日志会明确显示连接失败原因(如地址解析失败、连接被拒绝等),针对性修复。
内容的提问来源于stack exchange,提问作者Ruslan Issayev
相关产品推荐
相关产品推荐

