部署 Django 应用
生产 Django,用 Gunicorn、Nginx、WhiteNoise 静态文件和 Postgres,部署到 VPS 或容器。
平台高级
为什么
Django 全功能(ORM、admin、auth)加速开发,Gunicorn+Nginx 是经验证的生产栈。WhiteNoise 无需单独 CDN 提供静态文件。
平台即服务采用率 2024 年增长 24%,团队从虚拟机管理转向 git push 部署。the cloud infrastructure market reached $330B in 2024, growing 22% year-over-year (Synergy Research),PaaS 层捕获了大多数新工作负载。
何时使用
内容密集、需 admin、ORM 驱动 CRUD 和 Python 团队用 Django。微服务避免 — Flask/FastAPI 更轻。
如何做
1. WSGI 服务器 — gunicorn myproject.wsgi:application -w 4 -b 0.0.0.0:8000
2. Nginx — 反向代理 gunicorn,提供 static/media,TLS
3. 静态文件 — python manage.py collectstatic,WhiteNoise 中间件
4. DB — Postgres,设 DATABASE_URL,部署时迁移
5. Docker — python:3.12-slim,gunicorn,多阶段
6. 环境 — DJANGO_SETTINGS_MODULE,DEBUG=False,ALLOWED_HOSTS
7. ASGI — websocket/async 用 daphne 或 uvicorn 配 channels
示例
# Dockerfile
FROM python:3.12-slim AS base
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
RUN python manage.py collectstatic --noinput
EXPOSE 8000
CMD ["gunicorn", "myproject.wsgi:application", "-w", "4", "-b", "0.0.0.0:8000"]
# nginx.conf
upstream django { server app:8000; }
server {
listen 80;
location /static/ { alias /app/staticfiles/; }
location / { proxy_pass http://django; proxy_set_header Host $host; }
}
# settings.py — 生产
MIDDLEWARE = ["whitenoise.middleware.WhiteNoiseMiddleware", ...]
STATICFILES_STORAGE = "whitenoise.storage.CompressedStaticFilesStorage"
DEBUG = False
ALLOWED_HOSTS = ["myapp.com"]
常见问题
- ⚠生产静态文件 404 — 忘记 collectstatic 或 WhiteNoise 中间件配置
- ⚠生产 DEBUG=True — 安全风险,泄露堆栈和设置
- ⚠ALLOWED_HOSTS 不匹配 — 400 Bad Request,设为你的域名或测试用 ['*']
最佳实践
- ✓静态文件用 WhiteNoise — 简单部署中消除 Nginx 静态服务或 CDN 需求
- ✓迁移作为独立部署步骤,不在 CMD 中 — 允许无 DB 变更回滚
- ✓设置健康检查和优雅关闭 — 处理 SIGTERM 以在退出前排空进行中的请求