Plesk中Docker部署Discourse,Nginx代理后出现502 Bad Gateway错误
解决Plesk中Nginx反向代理Discourse Docker容器出现502 Bad Gateway的问题
从你提供的Nginx错误日志来看:
2018/04/01 20:44:48 [error] 10591#0: *1 connect() failed (111: Connection refused) while connecting to upstream, client: 192.168.2.107, server: test.plesk.local, request: "GET /favicon.ico HTTP/1.1", upstream: "http://0.0.0.0:8060/favicon.ico"
问题的核心很明确:Nginx尝试连接上游的0.0.0.0:8060时被拒绝了。这是因为0.0.0.0是容器内部的监听地址,而Plesk的Nginx运行在宿主机环境,没法直接通过这个地址访问容器服务。下面是具体的排查和解决步骤:
1. 确认Docker容器的正确访问地址
首先得搞清楚Discourse容器的实际可访问地址:
- 运行
docker ps查看容器的端口映射,比如你可能会看到类似0.0.0.0:8060->80/tcp的输出,这说明容器内部的80端口映射到了宿主机的8060端口。这种情况下,宿主机可以通过127.0.0.1:8060访问容器。 - 或者运行
docker inspect <你的Discourse容器名称/ID>,找到NetworkSettings.IPAddress字段,这是容器的内部IP(比如172.17.0.2),你可以直接用这个IP加上容器内部的端口(通常是80)来访问。
2. 修改Plesk的Nginx反向代理配置
登录Plesk后台,找到test.plesk.local这个域名的Apache & Nginx Settings:
- 找到「Additional Nginx directives」区域,把原来的
proxy_pass http://0.0.0.0:8060;替换成以下两种方式之一:- 用宿主机回环地址:
proxy_pass http://127.0.0.1:8060; - 用容器内部IP:
proxy_pass http://<容器内部IP>:80;
- 用宿主机回环地址:
- 同时建议添加这些必要的代理请求头,避免Discourse识别请求来源出错:
proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme;
- 点击「OK」保存配置,Plesk会自动重启Nginx生效。
3. 验证连通性
在宿主机上执行测试命令,确认容器服务能被正常访问:
- 如果用回环地址:
curl http://127.0.0.1:8060 - 如果用容器内部IP:
curl http://<容器内部IP>:80
如果命令能返回Discourse的HTML页面内容,说明容器服务正常,此时再用主机名test.plesk.local访问应该就能解决502问题了。
4. 排查防火墙/安全组
如果上面的步骤都没解决,检查一下宿主机的防火墙规则:
- 确保宿主机允许8060端口的本地访问(比如用
ufw allow 8060/tcp,如果是iptables则对应添加放行规则) - 确认容器内部没有防火墙阻止来自宿主机的连接请求
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

