腾讯云服务器Ubuntu 22.04部署Django项目性能优化建议?

在腾讯云上部署 Django 项目,核心痛点通常不在于代码本身,而在于Web 服务器配置、静态资源处理、数据库连接以及云环境的网络特性

Ubuntu 22.04 是一个优秀的底层系统,但默认配置对高并发并不友好。以下是经过生产环境验证的优化建议,分为五个关键层级:

1. WSGI/ASGI 服务器选型与配置(核心瓶颈)

Django 自带的 runserver 仅用于开发,绝对不要用于生产。你需要一个真正的异步或预分叉服务器。

  • 首选 Gunicorn

    • 进程模型:使用 sync worker 类型配合多进程模式。对于 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_ROOTMEDIA_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.pooldjango-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

  1. [ ] Gunicorn Workers 数量合理((2*Cores)+1)
  2. [ ] Nginx 静态文件路径正确且启用缓存
  3. [ ] Redis 已配置为 Django Cache Backend
  4. [ ] Celery 已配置用于异步任务
  5. [ ] 数据库连接池已启用或 PgBouncer 已部署
  6. [ ] 所有敏感端口(DB/Redis)未暴露公网
  7. [ ] HTTPS 证书已配置且自动续期
  8. [ ] 系统文件描述符限制已调高

按此顺序逐一排查和优化,你的 Django 项目在腾讯云 Ubuntu 22.04 上的性能和稳定性会有显著提升。

未经允许不得转载:云知道CLOUD » 腾讯云服务器Ubuntu 22.04部署Django项目性能优化建议?