走啊走
加油

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

服务器价格表

在腾讯云服务器(Ubuntu 22.04)上部署 Django 项目,性能优化需要从应用层、Web 服务器层、数据库层、缓存层、网络与系统层以及腾讯云特有资源六个维度协同进行。以下是经过实战验证的优化建议:


一、Django 应用层优化

1. 启用生产模式

确保 settings.py 中设置:

DEBUG = False
ALLOWED_HOSTS = ['your-domain.com', 'your-internal-ip']
SECURE_BROWSER_XSS_FILTER = True
SECURE_CONTENT_TYPE_NOSNIFF = True
X_FRAME_OPTIONS = 'DENY'

2. 使用异步 WSGI/ASGI 服务器

避免使用 runserver,推荐:

  • Gunicorn(同步模型,适合 CPU 密集型或简单 I/O)
    pip install gunicorn
    gunicorn myproject.wsgi:application --workers 4 --worker-class sync --timeout 120 --bind 127.0.0.1:8000
  • Uvicorn + Daphne(异步模型,适合高并发 WebSocket 或 async views)
    pip install uvicorn daphne
    daphne -b 127.0.0.1 -p 8000 myproject.asgi:application

✅ 建议:根据业务类型选择 worker 数量(CPU 核数 × 2~4),并通过 --max-requests 防止内存泄漏。

3. 静态文件与媒体文件分离

  • 使用 whitenoise(轻量级,适合小流量)或配置 Nginx 直接托管:
    # settings.py
    STATIC_ROOT = BASE_DIR / 'staticfiles'
    STATICFILES_STORAGE = 'django.contrib.staticfiles.storage.ManifestStaticFilesStorage'
  • 执行 collectstatic 并压缩:
    python manage.py collectstatic --noinput

4. 数据库查询优化

  • 使用 .select_related()(JOIN 一次表)和 .prefetch_related()(多对多/反向关系)减少 N+1 问题。
  • 为常用查询字段添加索引:
    class MyModel(models.Model):
      name = models.CharField(max_length=100, db_index=True)
      created_at = models.DateTimeField(auto_now_add=True)
      class Meta:
          indexes = [models.Index(fields=['name', 'created_at'])]
  • 定期分析慢查询:启用 django-debug-toolbar 或查看 MySQL/PostgreSQL 的 slow_query_log

二、Web 服务器层(Nginx)

1. 安装并配置 Nginx

sudo apt update && sudo apt install nginx

2. 关键优化配置(/etc/nginx/sites-available/myproject

upstream django {
    server 127.0.0.1:8000;
}

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

    location /static/ {
        alias /path/to/staticfiles/;
        expires 30d;
        add_header Cache-Control "public, immutable";
    }

    location /media/ {
        alias /path/to/media/;
        expires 7d;
    }

    location / {
        proxy_pass http://django;
        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;
        proxy_buffering on;
        proxy_buffer_size 4k;
        proxy_buffers 8 4k;
    }

    # Gzip 压缩
    gzip on;
    gzip_types text/plain application/json application/javascript text/css image/svg+xml;
    gzip_min_length 1000;
}

3. 启用 HTTP/2 与 SSL(强烈推荐)

使用 Let’s Encrypt 免费证书:

sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d your-domain.com

三、数据库优化(以 PostgreSQL 为例)

1. 调整 postgresql.conf

shared_buffers = 25% of RAM (e.g., 1GB if 4GB RAM)
effective_cache_size = 75% of RAM
work_mem = 4MB
maintenance_work_mem = 64MB
max_connections = 100  # 根据负载调整
checkpoint_completion_target = 0.9
wal_buffers = 64MB

2. 启用连接池

使用 PgBouncer 作为中间件:

sudo apt install pgbouncer
# 配置 pgbouncer.ini:
[pgbouncer]
listen_port = 6432
auth_type = md5
userlist_file = userlist.txt
[databases]
mydb = host=127.0.0.1 port=5432 dbname=mydb

Django 连接字符串改为:postgres://user:pass@localhost:6432/mydb

3. 定期维护

  • 开启 autovacuum 并调优参数。
  • 每周运行 VACUUM ANALYZE

四、缓存层引入(Redis)

1. 安装 Redis

sudo apt install redis-server
sudo systemctl enable redis-server

2. Django 配置缓存

# settings.py
CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://127.0.0.1:6379/1",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
        }
    }
}
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
CACHE_MIDDLEWARE_ALIAS = "default"
CACHE_MIDDLEWARE_SECONDS = 300

3. 使用装饰器缓存视图

from django.views.decorators.cache import cache_page

@cache_page(60 * 15)
def my_view(request):
    ...

五、系统级与网络优化(Ubuntu 22.04)

1. 内核参数调优

编辑 /etc/sysctl.conf

net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_tw_reuse = 1
net.ipv4.ip_local_port_range = 1024 65535
fs.file-max = 2097152

生效:sudo sysctl -p

2. 文件描述符限制

编辑 /etc/security/limits.conf

* soft nofile 65535
* hard nofile 65535
root soft nofile 65535
root hard nofile 65535

重启后生效。

3. 使用 Systemd 管理服务

创建 /etc/systemd/system/gunicorn.service

[Unit]
Description=Gunicorn instance to serve myproject
After=network.target

[Service]
User=www-data
Group=www-data
WorkingDirectory=/var/www/myproject
ExecStart=/home/ubuntu/venv/bin/gunicorn 
    --workers 4 
    --worker-class sync 
    --timeout 120 
    --bind unix:/var/run/gunicorn.sock 
    myproject.wsgi:application

Restart=always
KillSignal=SIGTERM

[Install]
WantedBy=multi-user.target

启动:

sudo systemctl daemon-reload
sudo systemctl enable gunicorn
sudo systemctl start gunicorn

六、腾讯云专属优化

1. 安全组规则

仅开放必要端口(如 80/443),关闭 SSH 公网访问(改用堡垒机或内网)。

2. 负载均衡(CLB)

若流量较大,使用 腾讯云 CLB 做四层/七层负载均衡,配合后端 CVM 集群。

3. CDN 提速

将静态资源(JS/CSS/图片)接入 腾讯云 CDN,降低源站压力。

4. 监控告警

  • 使用 云监控 监控 CPU、内存、磁盘 IO、网络带宽。
  • 设置阈值告警(如 CPU > 80% 持续 5 分钟)。

5. 自动伸缩(可选)

结合 弹性伸缩(AS) 实现基于负载的自动扩缩容。


七、性能测试与持续优化

  • 使用 LocustJMeter 进行压测。
  • py-spy 分析 Python 进程热点。
  • 定期 review 日志(/var/log/nginx/error.log, gunicorn.log)。

总结检查清单

层级 是否完成
DEBUG=False + ALLOWED_HOSTS
Gunicorn/Uvicorn + Worker 合理
Nginx X_X + Gzip + HTTPS
静态文件走 Nginx/CDN
Redis 缓存启用
DB 索引 + 查询优化 + PgBouncer
Systemd 管理服务 + 内核参数
腾讯云 CLB/CDN/监控集成

通过以上组合策略,通常可将 Django 项目在腾讯云 Ubuntu 22.04 上的 QPS 提升 5~20 倍,响应时间降低 60% 以上。如需针对具体业务场景(如电商、SaaS、实时数据)进一步定制,可提供更多细节继续深入探讨。