走啊走
奋斗

轻量级服务器部署Python Flask或Django项目的最佳实践?

服务器价格表

在轻量级服务器上部署 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-decoupledjango-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 特有注意事项

  1. DEBUG = False 必须设为 False
  2. ALLOWED_HOSTS = ['your-domain.com', '127.0.0.1']
  3. 数据库连接池:PostgreSQL 建议启用 conn_max_age
  4. 缓存:Redis 作为 cache backend(轻量且高效)
  5. 迁移:确保 MIGRATE 已完成且无 pending 变更

需要我为你生成一个完整的 Flask 或 Django 项目部署脚本模板(含自动化初始化、Nginx/Gunicorn/Systemd 配置),或提供 阿里云/腾讯云轻量应用服务器一键部署指南 吗?