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

Docker部署Django+React项目时Nginx报host not found in upstream错误如何解决

问题根因

Nginx抛出backend:8000找不到的报错,主要是两类原因:

  • Django镜像构建/启动失败:你贴的Django Dockerfile缺少基础镜像声明,且把数据库迁移命令放在了构建阶段,构建时没有数据库连接会直接失败,导致backend容器无法正常运行,Nginx自然找不到对应的服务。
  • Nginx启动时机过早:Docker Compose的depends_on仅控制容器启动顺序,不会等backend内部的Gunicorn进程完全就绪。Nginx启动时会提前校验upstream的域名解析,此时backend还没注册到Docker内网DNS,就会触发解析失败报错。

修复方案

1. 补全Django Dockerfile配置

在现有Django Dockerfile顶部添加基础镜像,同时移除构建阶段的数据库迁移命令:

# 新增Python基础镜像,可根据你的项目需求更换版本
FROM python:3.10-slim

ENV DJANGO_SECRET_KEY $DJANGO_SECRET_KEY
ENV DJANGO_CORS_ORIGIN_WHITELIST $DJANGO_CORS_ORIGIN_WHITELIST
RUN mkdir /backend
WORKDIR /backend
COPY requirements.txt /backend/
EXPOSE 8000
RUN pip install -r requirements.txt
COPY . /backend/
# 移除以下两行,迁移命令放到容器启动阶段执行
# RUN python manage.py makemigrations
# RUN python manage.py migrate

2. 调整Nginx配置跳过启动校验

修改Nginx配置,去掉upstream块,改用变量形式动态解析后端地址,避免启动时提前校验:

server {
    listen 8080;

    location /api/ {
        # 用变量存储后端地址,Nginx会在请求时动态解析,不会启动时报错
        set $backend_service http://backend:8000;
        proxy_pass $backend_service$request_uri;
    }

    # ignore cache frontend
    location ~* (service-worker\.js)$ {
        add_header 'Cache-Control' 'no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0';
        expires off;
        proxy_no_cache 1;
    }

    location / {
      root /var/www/frontend;
      try_files $uri $uri/ /index.html;
    }
}

3. 优化Django启动逻辑

在Django项目根目录新建启动脚本start.sh,把迁移命令放到启动阶段执行:

#!/bin/bash
python manage.py makemigrations
python manage.py migrate
gunicorn ivan_backend.wsgi --bind 0.0.0.0:8000

给脚本添加执行权限后,修改docker-compose.yml中backend的启动命令:

backend:
  build:
    context: ./ruelle_backend
    args:
      DJANGO_ALLOWED_HOSTS: http://ruelle-online.fr
      DJANGO_SECRET_KEY: anis1807
      DJANGO_CORS_ORIGIN_WHITELIST: http://ruelle-online.fr
  # 替换原有command
  command: bash ./start.sh
  ports:
    - "8000:8000"

4. 优化启动顺序(可选)

如果还是偶发报错,可以给backend添加健康检查,让Nginx等backend完全就绪后再启动:

backend:
  # 原有配置不变,新增以下健康检查配置
  healthcheck:
    test: ["CMD", "curl", "-f", "http://localhost:8000/"]
    interval: 3s
    timeout: 3s
    retries: 10

nginx:
  image: nginx:latest
  ports:
    - 80:8080
  volumes:
    - ./webserver/nginx-proxy.conf:/etc/nginx/conf.d/default.conf:ro
    - build_folder:/var/www/frontend
  # 修改depends_on配置
  depends_on:
    backend:
      condition: service_healthy
    frontend:
      condition: service_completed_successfully

修改完成后执行docker-compose down -v清理旧的容器和卷,再重新docker-compose up --build启动即可。

内容的提问来源于stack exchange,提问作者Zero0

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 19:09:02