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
相关产品推荐
相关产品推荐

