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

Docker部署Django+Nginx+PostgreSQL失败求助:Django与Nginx无法运行

Django+Nginx+PostgreSQL Docker部署问题排查与修复

一、核心问题梳理

你的配置里有几个关键错误,直接导致Django和Nginx无法正常工作:

  • 环境变量拼写/格式错误:ALLOWD_HOST 应为 ALLOWED_HOSTS;数据库相关变量用了减号(DATABASE-NAME),Django无法识别,必须改成下划线格式
  • 未执行静态文件收集:Django的静态资源没同步到共享卷,Nginx找不到资源
  • 数据库就绪等待缺失:depends_on只保证容器启动顺序,不确保PostgreSQL服务完全就绪,Django启动时会因连接失败崩溃
  • Nginx配置缺失:挂载了配置目录但没有实际配置文件,无法反向代理到Django服务

二、修复后的配置文件

1. 修正版docker-compose.yml

version: '3.8'

services:
  database:
    container_name: database
    image: postgres
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
      POSTGRES_DB: postgres
    volumes:
      - postgres:/var/lib/postgresql/data
    restart: always

  app:
    build:
      context: .  
    container_name: django-app
    command: >
      sh -c "
        # 等待PostgreSQL服务就绪
        until pg_isready -h database -p 5432 -U postgres; do
          echo '等待PostgreSQL启动...'
          sleep 2
        done &&
        # 执行数据库迁移
        python3 manage.py migrate &&
        # 收集静态文件到共享卷
        python3 manage.py collectstatic --noinput &&
        # 启动Gunicorn服务
        gunicorn config.wsgi:application --bind 0.0.0.0:8000
      "
    volumes:
      - static:/usr/src/app/static
      - media:/usr/src/app/media
    depends_on: 
      - database
    environment:
      - DEBUG=False
      - ALLOWED_HOSTS=*
      - DATABASE_NAME=postgres
      - DATABASE_USER=postgres
      - DATABASE_PASSWORD=postgres
      - DATABASE_HOST=database
      - DATABASE_PORT=5432

  nginx:
    image: nginx
    container_name: nginx
    ports:
      - "80:80"
    volumes:
      - ./nginx:/etc/nginx/conf.d  
      - static:/var/www/static
      - media:/var/www/media 
    depends_on:
      - app
    restart: always

volumes:
  postgres:
  static:
  media:

2. 新增Nginx配置文件(项目根目录创建nginx文件夹,里面放default.conf)

server {
    listen 80;
    server_name _;

    # 静态资源访问路径
    location /static/ {
        root /var/www;
        expires 30d;
    }

    location /media/ {
        root /var/www;
        expires 30d;
    }

    # 反向代理到Django服务
    location / {
        proxy_pass http://django-app:8000;
        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;
    }
}

3. 检查requirements.txt

确保里面包含必要依赖:

django
gunicorn
psycopg2-binary
# 你的其他项目依赖...

三、重新部署步骤

  1. 在项目根目录创建nginx文件夹,放入上面的default.conf
  2. 执行命令清理旧容器并重新构建:
docker-compose down -v
docker-compose build --no-cache
docker-compose up -d
  1. 查看容器状态:
docker-compose ps
  1. 如果仍有问题,查看日志排查:
docker-compose logs app
docker-compose logs nginx

内容的提问来源于stack exchange,提问作者Nasir ahmad Ahmady

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 21:50:38