在腾讯云上部署 Django 项目,核心痛点通常不在于代码本身,而在于Web 服务器配置、静态资源处理、数据库连接以及云环境的网络特性。
Ubuntu 22.04 是一个优秀的底层系统,但默认配置对高并发并不友好。以下是经过生产环境验证的优化建议,分为五个关键层级:
1. WSGI/ASGI 服务器选型与配置(核心瓶颈)
Django 自带的 runserver 仅用于开发,绝对不要用于生产。你需要一个真正的异步或预分叉服务器。
-
首选 Gunicorn:
- 进程模型:使用
syncworker 类型配合多进程模式。对于 CPU 密集型任务较少的项目,这是最稳定的选择。 - Worker 数量计算:公式
(2 x CPU核数) + 1。例如,腾讯云 CVM 如果是 2 核,设置workers=5。不要盲目设大,每个 Worker 占用内存约 30-50MB。 - 超时时间:默认 30s 太短,建议设为
60s或更高,避免长查询被误杀。 - Keep-Alive:开启 HTTP Keep-Alive,减少 TCP 握手开销。
gunicorn myproject.wsgi:application --bind 0.0.0.0:8000 --workers 5 --threads 4 --timeout 120 --keep-alive 5 --access-logfile - --error-logfile - - 进程模型:使用
-
备选 Uvicorn + Daphne:如果你的项目重度依赖 WebSockets 或异步视图(Async Views),考虑 ASGI 架构。
2. Nginx 反向X_X与静态文件分离
Nginx 必须存在,它负责处理 SSL 终止、Gzip 压缩、静态文件服务,并将动态请求转发给 Gunicorn。
-
静态文件(Static/Media):
- 严禁让 Django 处理静态文件。
- 在 Nginx 中直接指向
STATIC_ROOT和MEDIA_ROOT。 - 启用 Gzip 压缩:
gzip on; gzip_types text/css application/javascript image/svg+xml; - 设置缓存头:对 CSS/JS 图片设置
expires 30d; add_header Cache-Control "public, immutable";
-
Nginx 性能调优:
worker_processes auto;worker_connections 4096;(根据内存调整,腾讯云 2C4G 可设 2048-4096)- 开启
sendfile on; tcp_nopush on; tcp_nodelay on;
server {
listen 80;
server_name your_domain.com;
location /static/ {
alias /path/to/your/project/staticfiles/;
expires 30d;
add_header Cache-Control "public, immutable";
}
location /media/ {
alias /path/to/your/project/media/;
expires 30d;
}
location / {
proxy_pass http://127.0.0.1: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;
# 防止过大请求体导致 413 错误
client_max_body_size 50M;
}
}
3. 数据库优化(PostgreSQL 推荐)
MySQL 可用,但在 Linux 环境下 PostgreSQL 与 Python/Django 生态结合更紧密,且 JSONB 支持更好。
- 连接池管理:
- Django ORM 默认不管理连接池。在高并发下,频繁创建/销毁数据库连接是巨大开销。
- 方案 A(推荐):使用
psycopg2.pool或django-db-connection-pool中间件。 - 方案 B:使用 PgBouncer 作为前置连接池X_X。
- PostgreSQL 参数调优:
shared_buffers:设为物理内存的 25%(如 4G 内存设为 1GB)。effective_cache_size:设为物理内存的 75%。work_mem:适当增加,减少磁盘排序开销。
- 索引检查:
- 定期运行
EXPLAIN ANALYZE查看慢查询。 - 确保外键字段、频繁过滤字段有索引。
- 避免
SELECT *,只查询必要字段。
- 定期运行
4. 应用层性能优化
-
缓存策略(Redis):
- 安装 Redis 并配置为 Django 的 cache backend。
- 对高频读取但低频修改的数据(如首页列表、配置信息)进行缓存。
- 使用
@cache_page装饰器缓存整个视图响应。 - 注意缓存键的命名空间隔离,避免不同环境数据冲突。
-
ORM 查询优化:
- 使用
select_related()代替多次查询(Join 操作)。 - 使用
prefetch_related()处理反向 OneToOne 或 ManyToMany 关系。 - 避免在循环中执行数据库查询(N+1 问题)。
- 使用
-
异步任务队列(Celery + RabbitMQ/Redis):
- 将耗时操作(发送邮件、生成报表、图像处理)移出主线程。
- 使用 Celery 处理后台任务,避免阻塞 Web 请求。
- 监控 Celery Worker 状态,确保任务不堆积。
5. 腾讯云特定优化
-
安全组规则:
- 仅开放 80/443 端口到公网。
- 数据库端口(5432/3306)仅允许内网 IP 访问,禁止公网暴露。
- Redis 端口仅允许本地或应用服务器 IP 访问。
-
负载均衡(SLB)与 HTTPS:
- 如果流量较大,建议在腾讯云前端加 SLB(负载均衡),后端挂多台 CVM。
- 使用腾讯云证书管理器免费申请 HTTPS 证书,并在 Nginx 中配置 HSTS。
-
监控与告警:
- 启用腾讯云主机监控,关注 CPU、内存、磁盘 I/O、网络带宽。
- 设置告警阈值:CPU > 80% 持续 5 分钟、内存使用率 > 90%。
- 使用 Prometheus + Grafana 监控 Django 指标(如请求延迟、错误率)。
6. 系统级调优(Ubuntu 22.04)
-
文件描述符限制:
# /etc/security/limits.conf * soft nofile 65535 * hard nofile 65535 -
TCP 连接优化:
# /etc/sysctl.conf net.core.somaxconn = 65535 net.ipv4.tcp_max_syn_backlog = 65535 net.ipv4.tcp_tw_reuse = 1执行
sysctl -p生效。 -
Swap 设置:
- 不建议完全禁用 Swap。在内存紧张时,Swap 可以防止 OOM Killer 杀死进程。
- 调整
vm.swappiness=10,减少不必要的 Swap 使用。
总结 checklist
- [ ] Gunicorn Workers 数量合理((2*Cores)+1)
- [ ] Nginx 静态文件路径正确且启用缓存
- [ ] Redis 已配置为 Django Cache Backend
- [ ] Celery 已配置用于异步任务
- [ ] 数据库连接池已启用或 PgBouncer 已部署
- [ ] 所有敏感端口(DB/Redis)未暴露公网
- [ ] HTTPS 证书已配置且自动续期
- [ ] 系统文件描述符限制已调高
按此顺序逐一排查和优化,你的 Django 项目在腾讯云 Ubuntu 22.04 上的性能和稳定性会有显著提升。
云知道CLOUD