在 2核2G 的低配服务器上部署 Django 项目,资源优化是关键。以下是一套系统性、可落地、兼顾稳定性与性能的优化方案,涵盖 Web 服务、Django 配置、数据库、缓存、静态资源及监控等维度:
✅ 一、Web 服务器层(核心瓶颈所在)
1. 选用轻量高效 WSGI 服务器
- ❌ 避免
runserver(开发用,不安全且无并发) - ✅ 推荐
gunicorn+gevent或uvicorn(ASGI)# 推荐:gunicorn(成熟稳定)+ gevent worker(高并发低内存) pip install gunicorn gevent启动命令(关键参数):
gunicorn --bind 127.0.0.1:8000 --workers 2 # = CPU 核心数(2核 → 2个worker) --worker-class gevent --worker-connections 1000 # gevent 每 worker 并发连接数 --max-requests 1000 # 防止内存泄漏,自动重启 worker --max-requests-jitter 100 --timeout 30 --keep-alive 5 --preload # 预加载代码,节省内存(⚠️确保无 fork 不安全代码) --log-level info myproject.wsgi:application💡 为什么不是 uWSGI? uWSGI 功能强但配置复杂、内存占用略高;gunicorn + gevent 在 2G 内存下更可控。
2. 反向X_X:Nginx(必须)
- 处理静态文件、SSL 终结、负载均衡(单机也需)、连接复用
-
关键 Nginx 配置(/etc/nginx/sites-available/myproject):
upstream django_app { server 127.0.0.1:8000; } server { listen 80; server_name your-domain.com; # HTTPS 强制跳转(建议启用 Let's Encrypt) return 301 https://$server_name$request_uri; } server { listen 443 ssl http2; server_name your-domain.com; ssl_certificate /etc/letsencrypt/live/.../fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/.../privkey.pem; # 静态文件由 Nginx 直接服务(不走 Django) location /static/ { alias /var/www/myproject/staticfiles/; expires 1y; add_header Cache-Control "public, immutable"; } location /media/ { alias /var/www/myproject/media/; expires 7d; } # 反向X_X到 Gunicorn location / { proxy_pass http://django_app; 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 10; proxy_send_timeout 10; proxy_read_timeout 10; # 避免长请求阻塞 } }✅
expires+Cache-Control减少重复请求;proxy_read_timeout防止后端慢导致连接堆积。
✅ 二、Django 应用层优化
1. 关闭调试模式 & 生产配置
# settings.py
DEBUG = False
ALLOWED_HOSTS = ['your-domain.com', 'www.your-domain.com']
SECRET_KEY = os.environ['DJANGO_SECRET_KEY'] # 环境变量管理
# 日志级别调高,减少 I/O
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {'null': {'level': 'INFO', 'class': 'logging.NullHandler'}},
'loggers': {'django': {'handlers': ['null'], 'level': 'WARNING'}},
}
2. 数据库连接池化(避免连接爆炸)
- ✅ 使用
django-db-geventpool(适配 gevent)或dj-database-url+ 连接池参数pip install django-db-geventpool# settings.py DATABASES = { 'default': { 'ENGINE': 'django_db_geventpool.backends.postgresql_psycopg2', 'NAME': 'mydb', 'USER': 'user', 'PASSWORD': 'pass', 'HOST': 'localhost', 'PORT': '5432', 'OPTIONS': { 'MAX_CONNS': 12, # 总连接数 ≤ workers × 6(2×6=12 合理) 'MIN_CONNS': 2, } } }
3. 模板与静态资源优化
- ✅
python manage.py collectstatic --noinput(Nginx 直接服务) - ✅ 使用
django-compressor压缩 CSS/JS(减少传输体积) - ✅ 模板中避免
{% for %}循环内嵌套 DB 查询(N+1 问题!)
4. 中间件精简
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
# 移除 debug toolbar、corsheaders(若不需要跨域)等非必要中间件
]
✅ 三、数据库优化(以 PostgreSQL 为例)
- ✅ 连接数限制:
max_connections = 30(默认100太高,2G内存撑不住) - ✅ 共享缓冲区:
shared_buffers = 256MB(总内存 25%~30%,2G→512MB 过高,256MB 更稳) - ✅ 工作内存:
work_mem = 4MB(避免排序/聚合吃光内存) - ✅ 开启
pg_stat_statements监控慢查询 - ✅ 定期
VACUUM ANALYZE(或启用 autovacuum)
📌 MySQL 用户:
innodb_buffer_pool_size = 512M(不要超 60%),禁用 query cache(MySQL 8.0+ 已移除)
✅ 四、缓存策略(大幅降低 DB 和 Python 负载)
| 场景 | 方案 | 配置示例 |
|---|---|---|
| 全站缓存 | UpdateCacheMiddleware + FetchFromCacheMiddleware |
缓存整个响应(适合内容更新不频繁) |
| 视图级缓存 | @cache_page(60*15) |
@cache_page(900) 缓存 15 分钟 |
| 模板片段缓存 | {% cache 300 "sidebar" %}...{% endcache %} |
|
| 数据缓存 | cache.set('key', data, 300) |
✅ 缓存后端推荐:redis(比 locmem 更可靠,支持多进程共享)
# Ubuntu 安装 Redis(内存友好)
sudo apt install redis-server
sudo systemctl enable redis-server
# 配置 Redis 内存上限(防止 OOM)
echo "maxmemory 256mb" | sudo tee -a /etc/redis/redis.conf
sudo systemctl restart 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',
'CONNECTION_POOL_KWARGS': {'max_connections': 20},
}
}
}
✅ 五、其他关键实践
| 类别 | 措施 | 说明 |
|---|---|---|
| 内存监控 | htop, free -h, ps aux --sort=-%mem |
实时观察 gunicorn, postgres, redis 内存 |
| 日志轮转 | logrotate 配置 Nginx/Django/Gunicorn 日志 |
防止 /var/log 占满磁盘 |
| 进程守护 | systemd 管理 Gunicorn + Nginx |
自动重启、开机自启、日志统一 |
| 定时任务 | celery(慎用!2G 内存下优先用 django-cron 或 APScheduler) |
避免 Celery Worker 占用额外内存 |
| 静态资源 CDN | 免费方案:Cloudflare(免费版支持静态缓存 + SSL) | 卸载服务器带宽和 CPU 压力 |
✅ 六、快速检查清单(部署前必做)
- [ ]
DEBUG=False&ALLOWED_HOSTS正确 - [ ]
SECRET_KEY从环境变量读取(不硬编码) - [ ]
collectstatic已执行,Nginx 配置了/static/路径 - [ ] 数据库连接池已配置(MAX_CONNS ≤ 12)
- [ ] Redis 已安装并限制内存(256MB)
- [ ] Gunicorn worker 数 = 2,使用
gevent - [ ] Nginx
proxy_read_timeout≤ 10s - [ ] 关闭所有非必要中间件、APP(如
debug_toolbar) - [ ]
systemctl status nginx gunicorn确认运行正常
🚀 附:一键健康检查脚本(保存为 health.sh)
#!/bin/bash
echo "=== 内存使用 ==="
free -h
echo -e "n=== CPU 负载 ==="
uptime
echo -e "n=== 关键进程内存 ==="
ps aux --sort=-%mem | head -10 | grep -E "(gunicorn|postgres|redis)"
echo -e "n=== Redis 内存 ==="
redis-cli info memory | grep used_memory_human
echo -e "n=== Nginx 状态 ==="
systemctl is-active nginx
⚠️ 注意事项
- 不要强行开更多 worker:2核2G 下
workers=3可能因上下文切换+内存争抢反而更慢。 - 避免内存泄漏:定期
max-requests重启 worker;禁用未测试的第三方中间件。 - 备份先行:低配服务器更易故障,务必配置
pg_dump+cron自动备份到异地。
如需我帮你:
- ✅ 生成完整的
systemdGunicorn 服务文件 - ✅ 提供
logrotate配置模板 - ✅ 定制
postgresql.conf优化参数 - ✅ Django 缓存策略代码示例(含缓存失效逻辑)
欢迎随时告诉我你的具体技术栈(PostgreSQL/MySQL?是否用 Celery?媒体文件量?),我可以为你定制方案 👇
祝你部署顺利,小机器也能跑出大性能! 🌟
云服务器