在 2 核 2G 的服务器上部署 Django 项目,资源非常紧张,需要从应用层、Web 服务器、数据库、系统层面进行系统性优化。以下是经过实战验证的优化方案:
一、核心架构优化(最关键)
1. 禁用开发模式 & 使用生产级 WSGI/ASGI
# settings.py
DEBUG = False
ALLOWED_HOSTS = ['your-domain.com']
- 必须将
DEBUG设为False,否则内存泄漏和日志开销巨大。 - 使用 Gunicorn 或 uWSGI(推荐 Gunicorn + Nginx),避免直接用
python manage.py runserver。
2. 合理配置 Worker 数量
2 核 CPU 建议:
- 单进程多 worker:
workers = 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.SimpleConnectionPool或django-db-connection-pool - MySQL:通过
pymysql+SQLAlchemy或django-mysql的mysql_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而非freedmesg | grep -i oom→ 排查 OOM Killerhtop→ 实时观察 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 服务配置文件吗?
CLOUD云计算