You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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/。

错误原因分析

  1. Nginx前端上游地址错误:在Nginx容器内,localhost指向容器自身,而非宿主机或前端服务容器,导致无法连接前端服务。
  2. 网络隔离问题:Nginx服务加入了frontend和backend网络,但前端服务未加入frontend网络,两者不在同一网络,无法通过服务名通信。
  3. PostgreSQL配置拼写错误:PostgreSQL用户名和密码配置为postres(正确应为postgres),可能导致后端无法连接数据库,进而服务启动失败。
  4. 后端服务启动命令未启用:后端服务的启动命令被注释,可能导致服务未正常启动监听端口。

具体修复步骤

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"

验证方法

  1. 重启服务:
    docker-compose down && docker-compose up --build
    
  2. 访问http://localhost,检查前端页面是否正常加载;
  3. 访问http://localhost/api,检查后端接口是否正常响应;
  4. 查看Nginx日志,确认无连接拒绝错误:
    docker-compose logs nginx
    

内容的提问来源于stack exchange,提问作者Андрей Андрей

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 16:22:52