在2核2G的服务器上部署 Django 项目,资源有限,优化非常关键。以下是针对 CPU、内存、数据库和网络等方面的综合优化建议:
一、Web 服务器与应用服务器优化
1. 使用 Gunicorn + Nginx(推荐)
- Gunicorn:作为 WSGI 服务器,配置合理 worker 数量。
- Nginx:作为反向X_X,处理静态文件、负载均衡和缓存。
Gunicorn 配置优化(gunicorn.conf.py):
# 根据 2核 CPU 设置 worker 数量
workers = 3 # 通常为 (2 * CPU核心数) + 1,但内存有限可设为 2~3
worker_class = "sync" # 内存紧张时不建议用 gevent/async
worker_connections = 1000
max_requests = 1000
max_requests_jitter = 100
timeout = 30
keepalive = 5
preload_app = True # 提前加载应用,减少内存复制(注意线程安全)
⚠️ 注意:不要设置过多 workers,每个 worker 占用 ~50–100MB 内存,3个 worker 约占 150–300MB。
2. 使用 gunicorn 替代开发服务器
避免使用 python manage.py runserver,仅用于开发。
二、Django 应用层优化
1. 启用缓存
使用 Redis 或内存缓存减少数据库压力。
示例:配置 Redis 缓存
# settings.py
CACHES = {
'default': {
'BACKEND': 'django_redis.cache.RedisCache',
'LOCATION': 'redis://127.0.0.1:6379/1',
'OPTIONS': {
'CLIENT_CLASS': 'django_redis.client.DefaultClient',
}
}
}
安装依赖:
pip install django-redis redis
2. 数据库查询优化
- 使用
select_related()和prefetch_related()减少 N+1 查询。 - 避免在模板中进行数据库查询。
- 使用
only()/defer()加载必要字段。
3. 启用数据库连接池(可选)
使用 django-db-pool 或 pgbouncer(PostgreSQL)避免频繁连接开销。
4. 关闭调试模式
DEBUG = False
ALLOWED_HOSTS = ['your-domain.com', 'ip-address']
5. 静态 & 媒体文件交给 Nginx 处理
location /static/ {
alias /path/to/your/staticfiles/;
expires 1y;
add_header Cache-Control "public, immutable";
}
location /media/ {
alias /path/to/your/media/;
}
运行收集静态文件命令:
python manage.py collectstatic --noinput
三、系统与服务优化
1. 使用轻量级数据库
- 如果数据量小,考虑 SQLite(只读多、并发低场景)。
- 更推荐 PostgreSQL 或 MySQL,但需调优连接数。
MySQL 调优示例(my.cnf):
[mysqld]
innodb_buffer_pool_size = 512M # 总内存的一半左右
max_connections = 50
table_open_cache = 200
query_cache_type = 1
query_cache_size = 32M
2. 安装并启用 Redis
用于缓存和 session 存储:
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
SESSION_CACHE_ALIAS = 'default'
3. 使用进程管理器(Supervisor)
确保服务自动重启:
# /etc/supervisor/conf.d/django.conf
[program:django]
command=/path/to/venv/bin/gunicorn myproject.wsgi:application -c gunicorn.conf.py
directory=/path/to/your/project
user=www-data
autostart=true
autorestart=true
redirect_stderr=true
stdout_logfile=/var/log/gunicorn.log
四、前端与响应优化
1. 启用 Gzip 压缩(Nginx)
gzip on;
gzip_vary on;
gzip_min_length 1024;
gzip_types text/plain text/css text/xml text/javascript application/javascript application/xml+rss application/json;
2. 使用 CDN 托管静态资源
将 JS/CSS/图片上传至 CDN(如阿里云OSS + CDN、Cloudflare)。
五、监控与日志
1. 监控资源使用
htop # 实时查看 CPU/内存
free -h # 查看内存
df -h # 查看磁盘
2. 日志轮转防止磁盘爆满
使用 logrotate 或 Gunicorn 的日志配置。
六、其他建议
| 优化项 | 建议 |
|---|---|
| Python 版本 | 使用较新版本(如 3.10+),性能更好 |
| 虚拟环境 | 使用 venv 或 pipenv,避免全局污染 |
| 异步任务 | 小项目可用 cron,大任务用 Celery + Redis(谨慎占用内存) |
| 数据库索引 | 为常用查询字段添加索引 |
| 定期维护 | 清理旧日志、session、缓存 |
七、典型资源配置参考(2核2G)
| 服务 | 内存占用估算 |
|---|---|
| 系统 + SSH | 100MB |
| Nginx | 30MB |
| Gunicorn (3 workers) | 200MB |
| PostgreSQL / MySQL | 400MB |
| Redis | 100MB |
| Python 应用 + 其他 | 200MB |
| 总计 | ~1.03GB ✅ 可用 |
剩余约 1GB 可用于突发流量或缓存。
总结:关键优化点
✅ 使用 Nginx + Gunicorn
✅ 关闭 DEBUG,启用缓存(Redis)
✅ 优化数据库查询和连接
✅ 静态文件由 Nginx 托管 + Gzip
✅ 合理配置 worker 数量(2~3)
✅ 使用 Supervisor 管理进程
✅ 监控资源使用,及时调整
通过以上优化,Django 完全可以在 2核2G 服务器上稳定运行中小型项目(日访问几千~几万 PV)。若流量增长,建议升级配置或引入负载均衡。
需要我为你生成完整的部署脚本或配置文件模板吗?
云计算HECS