Docker 部署 Django 项目 Nginx+Gunicorn 配置文件怎么写?

文章导读
推荐用 docker-compose 编排 Nginx 和 Gunicorn 两个容器,Nginx 负责静态文件和反向代理,Gunicorn 负责运行 Django 应用,这是社区通用的生产环境基础架构。
📋 目录
  1. 核心配置文件
  2. Dockerfile 编写详解
  3. Django 配置要点
  4. 验证与排查
  5. 常见坑
  6. 参考来源
A A

推荐用 docker-compose 编排 Nginx 和 Gunicorn 两个容器,Nginx 负责静态文件和反向代理,Gunicorn 负责运行 Django 应用,这是社区通用的生产环境基础架构。

先说结论:分离 Web 服务器和应用服务器是标准做法,配置重点在于静态文件映射和端口通信。

  • 适合:中小型 Django 项目容器化部署
  • 先准备:整理好 requirements.txt 和 Django 静态文件收集配置
  • 验收:确认静态文件能直接访问且动态请求能穿透到应用

核心配置文件

以下是最小可用的配置骨架,修正了命令格式并指定了稳定版本镜像,可直接保存为文件后调整使用。

# docker-compose.yml
version: '3'
services:
  web:
    build: .
    command: ["gunicorn", "myproject.wsgi:application", "`--bind`", "0.0.0.0:8000"]
    volumes:
      - ./staticfiles:/app/staticfiles
    expose:
      - 8000
  nginx:
    image: nginx:stable
    ports:
      - 80:80
    volumes:
      - ./staticfiles:/app/staticfiles
      - ./nginx.conf:/etc/nginx/conf.d/default.conf
    depends_on:
      - web
# nginx.conf
server {
    listen 80;
    location /static/ {
        alias /app/staticfiles/;
    }
    location / {
        proxy_pass http://web:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

Dockerfile 编写详解

缺少 Dockerfile 会导致镜像无法构建。以下是标准写法,包含依赖安装和静态文件收集,基于 Python slim 镜像减小体积。

Docker 部署 Django 项目 Nginx+Gunicorn 配置文件怎么写?
# Dockerfile
FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install `--no-cache-dir` -r requirements.txt
COPY . .
RUN python manage.py collectstatic `--noinput`
CMD ["gunicorn", "myproject.wsgi:application", "`--bind`", "0.0.0.0:8000"]

配套 requirements.txt 示例内容:

Django>=4.0
gunicorn>=20.0
psycopg2-binary

Django 配置要点

在 settings.py 中必须正确配置静态文件路径和允许的主机,否则服务无法启动或报错。

# settings.py
import os
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
ALLOWED_HOSTS = ['*', 'your_domain.com', '127.0.0.1']

验证与排查

1. 启动服务:运行 docker-compose up -d 构建并启动容器。

2. 验证动态请求:curl -I http://你的 IP,确认返回 200 OK 且无 502 错误。

Docker 部署 Django 项目 Nginx+Gunicorn 配置文件怎么写?

3. 验证静态文件:curl -I http://你的 IP/static/admin/css/base.css,确认响应头 Server 字段为 nginx。

4. 查看日志:docker-compose logs web 查看 Gunicorn 日志,docker-compose logs nginx 查看访问日志。

常见坑

1. 静态文件 404:确保两个容器挂载的是同一个宿主机目录,且 Django 成功执行了 collectstatic。

Docker 部署 Django 项目 Nginx+Gunicorn 配置文件怎么写?

2. 权限问题:容器内用户可能无权写入静态文件目录,建议在 Dockerfile 中调整目录权限或使用非 root 用户运行。

3. 连接拒绝:Nginx 配置 proxy_pass 时使用了 localhost 而不是 docker-compose 服务名,容器间通信需用服务名。

4. 命令语法错误:docker-compose.yml 中 command 若包含空格参数,建议使用 JSON 数组格式避免解析错误。

参考来源

  • Django 官方文档 - Deploying with WSGI
  • Gunicorn 官方文档 - Deployment
  • Nginx 官方文档 - NGINX as a Reverse Proxy
  • Docker 官方文档 - Get started with Docker Compose