Docker-Compose部署前后端+Nginx出现502及连接拒绝错误排查求助
Docker-Compose + Nginx 502 Bad Gateway 问题排查与修复
问题概述
使用docker-compose部署前端、后端、Nginx、PostgreSQL、Redis服务时,访问http://localhost/出现502 Bad Gateway错误,Nginx日志显示connect() failed (111: Connection refused) while connecting to upstream,上游地址为http://127.0.0.1:3000/。
错误原因分析
- Nginx前端上游地址错误:在Nginx容器内,
localhost指向容器自身,而非宿主机或前端服务容器,导致无法连接前端服务。 - 网络隔离问题:Nginx服务加入了
frontend和backend网络,但前端服务未加入frontend网络,两者不在同一网络,无法通过服务名通信。 - PostgreSQL配置拼写错误:PostgreSQL用户名和密码配置为
postres(正确应为postgres),可能导致后端无法连接数据库,进而服务启动失败。 - 后端服务启动命令未启用:后端服务的启动命令被注释,可能导致服务未正常启动监听端口。
具体修复步骤
1. 修正Nginx配置中的前端上游地址
修改nginx.conf中的upstream frontend配置,将localhost替换为Docker Compose服务名frontend:
upstream frontend { server frontend:3000; # 使用服务名替代localhost }
2. 给前端服务添加网络配置
在docker-compose.yaml的frontend服务中加入frontend网络,确保与Nginx在同一网络:
frontend: build: ./frontend container_name: client_frontend ports: - '3000:3000' volumes: - ./frontend:/app stdin_open: true tty: true networks: - frontend # 添加此行,加入frontend网络
3. 修正PostgreSQL用户名和密码拼写
修改docker-compose.yaml中PostgreSQL和后端服务的环境变量,将postres改为postgres:
# PostgreSQL服务部分 postgres: image: postgres:13.3 environment: POSTGRES_DB: "smeldb" POSTGRES_USER: "postgres" # 修正拼写错误 POSTGRES_PASSWORD: "postgres" # 修正拼写错误 # ... 其他配置不变 # 后端服务部分 backend: # ... 其他配置 environment: DB_NAME: "smeldb" DB_USER: "postgres" # 修正拼写错误 DB_PASSWORD: "postgres" # 修正拼写错误 # ... 其他配置不变
4. 启用后端服务启动命令
取消docker-compose.yaml中后端服务的启动命令注释,确保服务正常监听端口:
backend: build: context: . dockerfile: backend/Dockerfile command: uvicorn main:app --host 0.0.0.0 --port 8080 --reload # 取消注释 tty: true # ... 其他配置不变
5. (可选)添加服务就绪等待机制
由于depends_on仅保证容器启动,不保证服务就绪,可给后端服务添加等待PostgreSQL就绪的命令(需确保后端镜像安装了postgresql-client):
backend: # ... 其他配置 command: > sh -c "until pg_isready -h postgres -p 5432 -U postgres; do sleep 2; done && uvicorn main:app --host 0.0.0.0 --port 8080 --reload"
验证方法
- 重启服务:
docker-compose down && docker-compose up --build - 访问
http://localhost,检查前端页面是否正常加载; - 访问
http://localhost/api,检查后端接口是否正常响应; - 查看Nginx日志,确认无连接拒绝错误:
docker-compose logs nginx
内容的提问来源于stack exchange,提问作者Андрей Андрей
相关产品推荐
相关产品推荐

