走啊走
加油

Python Django项目部署在2核2G服务器上,如何优化资源占用?

服务器价格表

在 2 核 2G 的服务器上部署 Django 项目,资源非常紧张,需要从应用层、Web 服务器、数据库、系统层面进行系统性优化。以下是经过实战验证的优化方案:


一、核心架构优化(最关键)

1. 禁用开发模式 & 使用生产级 WSGI/ASGI

# settings.py
DEBUG = False
ALLOWED_HOSTS = ['your-domain.com']
  • 必须将 DEBUG 设为 False,否则内存泄漏和日志开销巨大。
  • 使用 GunicornuWSGI(推荐 Gunicorn + Nginx),避免直接用 python manage.py runserver

2. 合理配置 Worker 数量

2 核 CPU 建议:

  • 单进程多 workerworkers = cpu_count * 2 + 1 = 5(但 2G 内存限制下需调低)
  • 实际推荐workers = 2~3(每个 worker 约占用 150~250MB 内存)

示例 Gunicorn 启动命令:

gunicorn myproject.wsgi:application 
  --bind 127.0.0.1:8000 
  --workers 2 
  --worker-class sync 
  --max-requests 1000 
  --max-requests-jitter 50 
  --timeout 30 
  --keep-alive 5

💡 若使用异步框架(如 FastAPI/Django Channels),可考虑 uvicorn + gunicorn 组合,但注意内存开销略高。

3. 启用静态文件收集与 CDN

python manage.py collectstatic --noinput --clear
  • 所有静态文件(CSS/JS/图片)由 Nginx 直接提供,不经过 Django。
  • 可选:接入 Cloudflare / 阿里云 OSS 等 CDN 进一步减轻服务器压力。

4. 压缩响应内容

settings.py 中添加:

MIDDLEWARE = [
    'django.middleware.common.CommonMiddleware',
    # ...
    'django.middleware.gzip.GZipMiddleware',  # 开启 gzip
]

# 或使用 whitenoise(轻量级静态文件服务,适合小项目)
INSTALLED_APPS += ['whitenoise.runserver_nostatic']
WHITENOISE_COMPRESS = True
WHITENOISE_MAX_AGE = 604800  # 缓存一周

二、数据库优化(MySQL/PostgreSQL)

1. 选择轻量级数据库

  • 优先用 SQLite(仅用于测试/极小流量)→ ❌ 不推荐生产环境
  • 推荐:PostgreSQL(比 MySQL 更省内存,连接池管理更好)
  • 若必须用 MySQL,确保版本 ≥ 5.7,并调整参数:
    # /etc/mysql/my.cnf
    [mysqld]
    innodb_buffer_pool_size = 128M   # 总内存 2G,留 1G 给应用+OS
    max_connections = 50
    query_cache_size = 0             # 现代 DB 已弃用查询缓存

2. Django ORM 优化

  • 使用 .only() / .defer() 减少字段加载:
    User.objects.only('id', 'username')  # 只查必要字段
  • 避免 select_related() 过度嵌套(1:N 用 prefetch_related()
  • 对大数据量列表分页:强制 limit=20, offset=0,禁止无分页遍历
  • 定期执行 python manage.py shell -c "from django.db import connection; print(connection.queries)" 检查慢查询

3. 添加数据库连接池

  • PostgreSQL:使用 psycopg2.pool.SimpleConnectionPooldjango-db-connection-pool
  • MySQL:通过 pymysql + SQLAlchemydjango-mysqlmysql_connection_pool

三、系统级优化

1. Swap 分区(关键!)

2G 内存极易 OOM,务必设置 swap:

# 创建 2G swap 文件
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

# 永久生效
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

# 调整 swappiness(降低频繁换页)
sudo sysctl vm.swappiness=10
echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.conf

2. Nginx 作为反向X_X + 负载均衡

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

    location /static/ {
        alias /var/www/myproject/static/;
        expires 30d;
        add_header Cache-Control "public, immutable";
    }

    location /media/ {
        alias /var/www/myproject/media/;
        expires 7d;
    }

    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_connect_timeout 60s;
        proxy_send_timeout 60s;
        proxy_read_timeout 60s;

        # 限流(防 DDoS)
        limit_req zone=one burst=10 nodelay;
    }

    limit_req_zone $binary_remote_addr zone=one:1m rate=10r/s;
}

3. 关闭不必要服务

systemctl disable ssh-agent.service  # 若无需求
apt remove --purge apache2 nginx-default  # 清理冗余 Web 服务

4. 监控与告警

安装轻量监控工具:

# 安装 htop + netdata(极简版)
apt install htop netdata
# 或用 psutil 写自定义脚本

重点监控:

  • free -h → 看 available 而非 free
  • dmesg | grep -i oom → 排查 OOM Killer
  • htop → 实时观察 Python 进程内存

四、额外技巧(进阶)

场景 方案
定时任务重 celery + redis(轻量版 Redis 仅需 ~30MB)替代 Cron + 脚本
缓存热点数据 django-redis + Redis(单实例即可,配置 maxmemory-policy allkeys-lru
日志过大 配置 logrotate 每日轮转,保留 3 天;或接入 ELK/Loki
安全加固 启用 HTTPS(Let’s Encrypt)、关闭 SSH root 登录、使用 Fail2Ban

✅ 推荐最小化部署栈(2G 实测可行)

Nginx (静态) 
  ↓
Gunicorn (2 workers) 
  ↓
Django + PostgreSQL (buffer_pool=128M) 
  ↓
Redis (缓存会话/热点数据,maxmemory=100M)
  ↓
Swap 2G + Swappiness=10

📊 预期效果:

  • 空闲时内存占用:~450MB
  • 并发 50 请求/秒时:~900MB
  • 崩溃风险大幅降低(配合 swap)

需要我为你生成一份完整的 docker-compose.yml(含 Nginx/Gunicorn/Postgres/Redis)或 systemd 服务配置文件吗?