VPS部署Python Flask/Django教程


Flask和Django是Python最流行的Web框架。生产环境部署时,不能直接使用开发服务器,需要配合Gunicorn(WSGI HTTP服务器)和Nginx实现高性能、稳定的服务。本文介绍在搬瓦工VPS上部署Python Web应用的完整流程。

安装Python环境

# Debian/Ubuntu
sudo apt update
sudo apt install python3 python3-pip python3-venv python3-dev build-essential -y

# CentOS/AlmaLinux
sudo yum install python3 python3-pip python3-devel gcc -y

# 查看版本
python3 --version
pip3 --version

Flask应用部署

# 创建项目目录
sudo mkdir -p /var/www/flaskapp
sudo chown $USER:$USER /var/www/flaskapp
cd /var/www/flaskapp

# 创建虚拟环境
python3 -m venv venv
source venv/bin/activate

# 安装Flask和Gunicorn
pip install flask gunicorn

创建Flask应用 app.py

from flask import Flask, jsonify

app = Flask(__name__)

@app.route('/')
def index():
    return jsonify(message='Hello from Flask!', status='running')

@app.route('/health')
def health():
    return jsonify(status='ok')

if __name__ == '__main__':
    app.run()
# 测试运行
python app.py

Django应用部署

# 创建项目目录
sudo mkdir -p /var/www/djangoapp
sudo chown $USER:$USER /var/www/djangoapp
cd /var/www/djangoapp

# 创建虚拟环境
python3 -m venv venv
source venv/bin/activate

# 安装Django和Gunicorn
pip install django gunicorn

# 创建Django项目
django-admin startproject mysite .

# 生产环境配置(编辑 mysite/settings.py)
# DEBUG = False
# ALLOWED_HOSTS = ['example.com', 'www.example.com']
# STATIC_ROOT = '/var/www/djangoapp/staticfiles'

# 收集静态文件
python manage.py collectstatic

# 数据库迁移
python manage.py migrate

Gunicorn配置

Gunicorn是Python WSGI HTTP服务器,负责运行Python应用并处理并发请求:

# Flask应用启动
gunicorn --bind 127.0.0.1:8000 app:app

# Django应用启动
gunicorn --bind 127.0.0.1:8000 mysite.wsgi:application

创建Gunicorn配置文件 gunicorn.conf.py

# 绑定地址
bind = '127.0.0.1:8000'

# Worker进程数(建议 2*CPU核心数+1)
workers = 3

# Worker类型
worker_class = 'sync'

# 超时时间
timeout = 120

# 最大请求数(防止内存泄漏)
max_requests = 1000
max_requests_jitter = 50

# 日志
accesslog = '/var/log/gunicorn/access.log'
errorlog = '/var/log/gunicorn/error.log'
loglevel = 'warning'

# 进程名称
proc_name = 'myapp'
# 创建日志目录
sudo mkdir -p /var/log/gunicorn

# 使用配置文件启动
gunicorn -c gunicorn.conf.py app:app

Systemd服务管理

创建systemd服务文件,实现开机自启和进程守护:

sudo nano /etc/systemd/system/flaskapp.service
[Unit]
Description=Flask Application (Gunicorn)
After=network.target

[Service]
User=www-data
Group=www-data
WorkingDirectory=/var/www/flaskapp
Environment="PATH=/var/www/flaskapp/venv/bin"
ExecStart=/var/www/flaskapp/venv/bin/gunicorn -c gunicorn.conf.py app:app
ExecReload=/bin/kill -s HUP $MAINPID
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target
# 设置目录权限
sudo chown -R www-data:www-data /var/www/flaskapp

# 启用并启动服务
sudo systemctl daemon-reload
sudo systemctl enable flaskapp
sudo systemctl start flaskapp

# 查看状态
sudo systemctl status flaskapp

Nginx反向代理

sudo nano /etc/nginx/conf.d/flaskapp.conf
server {
    listen 80;
    server_name example.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    server_name example.com;

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    # Django静态文件
    location /static/ {
        alias /var/www/flaskapp/static/;
        expires 30d;
    }

    # 媒体文件
    location /media/ {
        alias /var/www/flaskapp/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_set_header X-Forwarded-Proto $scheme;
        proxy_redirect off;
    }
}
sudo nginx -t
sudo nginx -s reload

依赖管理和更新部署

# 导出依赖列表
pip freeze > requirements.txt

# 部署更新流程
cd /var/www/flaskapp
source venv/bin/activate
git pull origin main
pip install -r requirements.txt

# Django额外步骤
python manage.py migrate
python manage.py collectstatic --noinput

# 重启服务
sudo systemctl restart flaskapp

常见问题

Tip: FastAPI框架部署请参考 FastAPI部署教程。更多教程请查看新手教程
关于本站

搬瓦工VPS中文网(bwgvps.com)是非官方中文信息站,整理搬瓦工 BandwagonHost 的优惠信息、使用教程和方案对比,方便中文用户选购和使用。

新手必读
搬瓦工优惠码

当前最大折扣优惠码:

NODESEEK2026(优惠 6.77%)

在购买方案时填入优惠码即可自动抵扣。详见 优惠码使用教程