Flask和Django是Python最流行的Web框架。生产环境部署时,不能直接使用开发服务器,需要配合Gunicorn(WSGI HTTP服务器)和Nginx实现高性能、稳定的服务。本文介绍在搬瓦工VPS上部署Python Web应用的完整流程。
# 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
# 创建项目目录
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
# 创建项目目录
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是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服务文件,实现开机自启和进程守护:
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
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
sudo systemctl status flaskappcollectstatic,检查Nginx的alias路径是否正确Environment PATH 必须指向虚拟环境的bin目录Tip: FastAPI框架部署请参考 FastAPI部署教程。更多教程请查看新手教程。