在轻量级服务器上部署 Python Flask 或 Django 项目,核心目标是资源占用低、启动快、易维护、安全性高。以下是经过验证的最佳实践方案:
✅ 一、环境准备(推荐 Ubuntu 22.04 LTS)
# 更新系统
sudo apt update && sudo apt upgrade -y
# 安装基础依赖
sudo apt install python3-pip python3-venv nginx curl git -y
💡 避免使用
systemd直接运行python app.py—— 应通过 Gunicorn + Nginx 反向X_X实现生产级部署。
✅ 二、项目隔离与虚拟环境(关键!)
# 创建项目目录
mkdir ~/myproject && cd ~/myproject
# 创建虚拟环境(避免污染系统 Python)
python3 -m venv venv
source venv/bin/activate
# 安装依赖(requirements.txt 需包含生产级包)
pip install --upgrade pip
pip install gunicorn # 生产 WSGI 服务器
# Flask: pip install flask
# Django: pip install django
# 其他依赖如 psycopg2, redis, Pillow 等按需添加
✅ 最佳实践:
- 始终使用虚拟环境
requirements.txt固定版本(pip freeze > requirements.txt)- 禁止在
requirements.txt中包含debug=True相关调试库
✅ 三、Wsgi 服务器配置(Gunicorn 替代 uWSGI)
📌 Gunicorn 优势:
- 内存占用低(比 uWSGI 更简洁)
- 开箱即用,无需复杂配置
- 支持多进程/线程,适合 CPU 密集型任务
示例 gunicorn.conf.py(可选但推荐):
bind = "127.0.0.1:8000"
workers = 2 # 根据 CPU 核数调整:通常 min(4, CPU*2+1)
worker_class = "sync" # 异步用 "gevent" 或 "uvicorn"(Flask/Django 原生同步即可)
timeout = 30
keepalive = 5
max_requests = 1000 # 防止内存泄漏
max_requests_jitter = 50
启动命令(测试用):
gunicorn myapp:app --config gunicorn.conf.py
# Django: gunicorn myproject.wsgi:application --config gunicorn.conf.py
⚠️ 切勿在生产环境暴露端口给公网!仅监听
127.0.0.1,由 Nginx 转发。
✅ 四、Nginx 反向X_X(安全入口)
创建 /etc/nginx/sites-available/myproject:
server {
listen 80;
server_name your-domain.com; # 或 IP
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_set_header X-Forwarded-Proto $scheme;
# 静态文件优化(Django/Flask 静态集)
location /static/ {
alias /home/user/myproject/static/;
expires 30d;
add_header Cache-Control "public, immutable";
}
location /media/ {
alias /home/user/myproject/media/;
expires 7d;
}
}
# HTTPS 强制跳转(建议后续配 Let's Encrypt)
# return 301 https://$host$request_uri;
}
启用并重启:
sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl restart nginx
✅ 五、进程守护(Systemd 服务)
创建 /etc/systemd/system/myproject.service:
[Unit]
Description=My Flask/Django App
After=network.target
[Service]
User=ubuntu
Group=www-data
WorkingDirectory=/home/ubuntu/myproject
Environment="PATH=/home/ubuntu/myproject/venv/bin"
ExecStart=/home/ubuntu/myproject/venv/bin/gunicorn
--config /home/ubuntu/myproject/gunicorn.conf.py
myapp:app # 或 wsgi:application
Restart=on-failure
RestartSec=5s
[Install]
WantedBy=multi-user.target
启动服务:
sudo systemctl daemon-reload
sudo systemctl enable myproject
sudo systemctl start myproject
sudo systemctl status myproject
✅ 优势:
- 自动重启失败服务
- 日志集成到
journalctl - 开机自启
✅ 六、安全加固(必做!)
| 措施 | 操作 |
|---|---|
| 防火墙 | ufw allow 'Nginx Full', ufw allow 22/tcp, ufw enable |
| 禁用 root SSH | /etc/ssh/sshd_config: PermitRootLogin no |
| Fail2Ban | sudo apt install fail2ban,保护 SSH 和 Nginx |
| HTTPS | 用 certbot 免费申请 Let’s Encrypt 证书 |
| 敏感信息 | 环境变量管理(.env + python-decouple 或 django-environ),绝不硬编码密钥 |
| 定期更新 | unattended-upgrades 自动安全补丁 |
Let’s Encrypt 快速配置:
sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d your-domain.com
# 自动续期已配置
✅ 七、监控与日志(轻量级)
- 应用日志:Gunicorn 默认输出到 stdout/stderr → 被 systemd 捕获
journalctl -u myproject -f - 访问日志:Nginx 默认
/var/log/nginx/access.log&error.log - 简单监控:
htop/glances实时查看资源- 脚本定时检查进程状态(可结合 cron)
- 进阶:Prometheus + Node Exporter(若资源允许)
🚫 避免的常见错误
| 错误做法 | 正确替代 |
|---|---|
python manage.py runserver 上线 |
❌ 必须用 Gunicorn/uWSGI |
| 直接开放 8000/8001 端口 | ✅ 仅 Nginx 监听 80/443 |
把 SECRET_KEY 写死在代码中 |
✅ 用环境变量或 .env |
未设置 ALLOWED_HOSTS(Django) |
✅ 显式配置白名单域名 |
| 静态文件未收集(Django) | ✅ python manage.py collectstatic |
🔁 补充:Django 特有注意事项
DEBUG = False必须设为FalseALLOWED_HOSTS = ['your-domain.com', '127.0.0.1']- 数据库连接池:PostgreSQL 建议启用
conn_max_age - 缓存:Redis 作为 cache backend(轻量且高效)
- 迁移:确保
MIGRATE已完成且无 pending 变更
需要我为你生成一个完整的 Flask 或 Django 项目部署脚本模板(含自动化初始化、Nginx/Gunicorn/Systemd 配置),或提供 阿里云/腾讯云轻量应用服务器一键部署指南 吗?
CLOUD云计算