奋斗
努力

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

云计算

在腾讯云服务器(Ubuntu 22.04)上部署 Django 项目时,性能优化需要从应用层、Web 服务器层、数据库层、缓存层以及基础设施层进行系统性调优。以下是针对该环境的详细优化建议:


一、应用层优化(Django 代码与配置)

  1. 启用生产模式

    • 确保 DEBUG = False,关闭调试模式可显著提升响应速度并避免敏感信息泄露。
    • 设置 ALLOWED_HOSTS 为合法域名/IP。
  2. 使用异步视图(如适用)

    • 对于 I/O 密集型任务(如调用外部 API),使用 async def 视图 + django-async-view 或 uvicorn 作为 ASGI 服务器。
  3. 减少数据库查询次数

    • 使用 select_related()(外键关联)和 prefetch_related()(多对多/反向查询)避免 N+1 查询问题。
    • 利用 only() / defer() 限制返回字段,减少数据加载量。
  4. 静态文件与媒体文件处理

    • 不要由 Django 直接提供静态文件(STATIC_URL 指向 /static/ 时)。
    • 将静态文件收集到 collectstatic 后,交由 Nginx 或 CDN 托管。
    • 媒体文件(用户上传)同样应通过对象存储(如腾讯云 COS)+ CDN 提速。
  5. Gzip 压缩

    • 在 Nginx 中开启 Gzip 压缩(见下文),减少网络传输体积。
  6. 禁用不必要的中间件

    • 检查 MIDDLEWARE 列表,移除未使用的中间件(如 SessionMiddleware 若无需会话则可选配无状态 JWT)。

二、Web 服务器层优化(Nginx + Gunicorn/uWSGI)

推荐架构:Nginx(反向X_X + 静态文件服务) → Gunicorn(ASGI/WSGI 应用服务器)

1. Nginx 优化配置示例(/etc/nginx/sites-available/django)

server {
    listen 80;
    server_name your-domain.com;

    # 静态文件服务(关键!)
    location /static/ {
        alias /path/to/your/project/staticfiles/;
        expires 30d;
        add_header Cache-Control "public, immutable";
        gzip on;
        gzip_types text/plain application/json application/javascript text/css image/svg+xml;
    }

    # 媒体文件(若本地存储)
    location /media/ {
        alias /path/to/your/project/media/;
        expires 7d;
    }

    # 反向X_X至 Gunicorn
    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;

        # 超时设置(根据业务调整)
        proxy_connect_timeout 60s;
        proxy_send_timeout 60s;
        proxy_read_timeout 60s;
    }

    # 安全头
    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-Content-Type-Options "nosniff";
    add_header X-XSS-Protection "1; mode=block";
}

2. Gunicorn 启动参数优化

gunicorn myproject.wsgi:application 
    --bind 127.0.0.1:8000 
    --workers 4 
    --worker-class gthread 
    --threads 2 
    --timeout 120 
    --keep-alive 5 
    --access-logfile - 
    --error-logfile -
  • --workers:通常为 CPU 核心数 × 2 + 1(I/O 密集型可更高;计算密集型取 CPU 核数)。
  • --worker-class gthread:适合混合负载场景。
  • --keep-alive:保持 TCP 连接复用,减少握手开销。

✅ 提示:使用 systemd 管理 Gunicorn 进程,实现开机自启和故障恢复。


三、数据库层优化(PostgreSQL/MySQL)

假设使用 PostgreSQL(Django 默认推荐):

  1. 索引优化

    • 对高频查询字段(如 user_id, created_at, status)添加索引。
    • 使用 EXPLAIN ANALYZE 分析慢查询。
  2. 连接池配置

    • Django ORM 默认连接池较小,可在 DATABASES 中设置:
      DATABASES = {
       'default': {
           'ENGINE': 'django.db.backends.postgresql',
           'NAME': 'db_name',
           'USER': 'db_user',
           'PASSWORD': 'db_pass',
           'HOST': 'localhost',
           'PORT': '5432',
           'CONN_MAX_AGE': 600,  # 长连接
           'OPTIONS': {
               'connect_timeout': 10,
           },
       }
      }
  3. PostgreSQL 参数调优(需修改 postgresql.conf)

    shared_buffers = 25% of RAM
    effective_cache_size = 75% of RAM
    work_mem = 4MB (或根据并发调整)
    maintenance_work_mem = 16MB
    max_connections = 100  # 根据内存和 Gunicorn worker 数合理设置
  4. 定期维护

    • 执行 VACUUM ANALYZE 清理死元组并更新统计信息。
    • 使用 pg_repack 在线重建大表索引(避免锁表)。

四、缓存层优化(Redis/Memcached)

  1. 安装 Redis

    sudo apt update && sudo apt install redis-server
  2. Django 缓存配置

    CACHES = {
       "default": {
           "BACKEND": "django.core.cache.backends.redis.RedisCache",
           "LOCATION": "redis://127.0.0.1:6379/1",
           "OPTIONS": {
               "client_class": "django_redis.client.DefaultClient",
               "password": None,
               "socket_timeout": 1,
               "retry_on_timeout": True,
           },
       }
    }
  3. 常用缓存策略

    • 页面片段缓存:@cache_page(60 * 15)
    • 模板 fragment 缓存:{% load cache %}{% cache 300 sidebar user %}...{% endcache %}
    • 查询结果缓存:手动 cache.set('key', value, timeout)

💡 注意:缓存键设计要唯一且防碰撞,避免脏读。


五、基础设施与运维优化(腾讯云特有)

  1. 选择合适实例规格

    • 根据流量预估选择:入门型(2C4G)、标准型(4C8G)、高IO型(带 NVMe SSD)。
    • 启用弹性公网 IP(EIP) + 负载均衡(CLB) 应对突发流量。
  2. 开启系统级优化

    • 调整内核参数(/etc/sysctl.conf):
      net.core.somaxconn = 65535
      net.ipv4.tcp_max_syn_backlog = 65535
      net.ipv4.tcp_tw_reuse = 1
      vm.swappiness = 10

      执行 sudo sysctl -p 生效。

  3. 使用腾讯云专属服务

    • 对象存储 COS:替代本地 /media/ 目录,配合 CDN 提速全球访问。
    • 云数据库 TDSQL / RDS:比自建 MySQL/PG 更稳定,支持自动备份、主从切换。
    • 云监控 + 日志审计:实时监控 CPU、内存、磁盘 IO、网络带宽。
  4. Docker 容器化部署(可选进阶)

    • 使用 Docker Compose 编排 Nginx + Gunicorn + Redis + DB。
    • 便于扩缩容、灰度发布、环境一致性。

六、性能测试与监控工具

工具 用途
ab / wrk 压力测试
django-debug-toolbar 开发阶段 SQL/请求耗时分析
Prometheus + Grafana 实时监控指标
New Relic / Sentry APM 与错误追踪
htop / iotop 实时资源占用排查

七、快速检查清单 ✅

  • [ ] DEBUG = False
  • [ ] 静态文件由 Nginx 托管
  • [ ] Gunicorn 工作进程数合理
  • [ ] 数据库有索引 & 长连接
  • [ ] Redis 缓存已接入
  • [ ] Nginx 开启 Gzip
  • [ ] 使用腾讯云 COS + CDN
  • [ ] 系统内核参数优化
  • [ ] 配置了日志轮转(logrotate)

通过以上分层优化,你的 Django 项目在 Ubuntu 22.04 + 腾讯云上通常可达到 QPS 提升 3~10 倍、首屏延迟降低 50%+ 的效果。建议先在小流量环境验证各项改动,再逐步上线。

如需具体某一步骤的详细命令或配置文件模板,欢迎继续提问!

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