部署
将 Flask 应用部署到生产环境需要考虑性能、安全性和可扩展性。
生产服务器
Gunicorn
Gunicorn 是 Python WSGI HTTP 服务器,适合生产环境。
pip install gunicorn
# 基本使用
gunicorn -w 4 -b 0.0.0.0:8000 run:app
# 参数说明
# -w 4: 4 个工作进程
# -b: 绑定地址
# run:app: 模块名:应用变量名
配置文件
# gunicorn.conf.py
bind = "0.0.0.0:8000"
workers = 4
worker_class = "sync"
worker_connections = 1000
timeout = 30
keepalive = 2
errorlog = "-"
accesslog = "-"
capture_output = True
enable_stdio_inheritance = True
uWSGI
pip install uwsgi
uwsgi --socket 0.0.0.0:8000 --protocol=http -w run:app
Nginx 反向代理
Nginx 配置
server {
listen 80;
server_name example.com;
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;
}
location /static {
alias /var/www/myapp/app/static;
expires 30d;
}
}
Docker 部署
Dockerfile
FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 8000
CMD ["gunicorn", "-w", "4", "-b", "0.0.0.0:8000", "run:app"]
docker-compose.yml
version: '3.8'
services:
web:
build: .
ports:
- "8000:8000"
environment:
- FLASK_ENV=production
- SECRET_KEY=your-secret-key
- DATABASE_URL=postgresql://user:pass@db:5432/myapp
depends_on:
- db
volumes:
- ./static:/app/static
db:
image: postgres:15
environment:
- POSTGRES_USER=user
- POSTGRES_PASSWORD=pass
- POSTGRES_DB=myapp
volumes:
- postgres_data:/var/lib/postgresql/data
nginx:
image: nginx:alpine
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/conf.d/default.conf
- ./static:/var/www/static
depends_on:
- web
volumes:
postgres_data:
环境变量配置
# config.py
import os
class ProductionConfig:
SECRET_KEY = os.environ.get('SECRET_KEY')
SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URL')
SQLALCHEMY_ENGINE_OPTIONS = {
'pool_size': 10,
'pool_recycle': 3600,
'pool_pre_ping': True
}
云平台部署
Heroku
# Procfile
web: gunicorn run:app
# runtime.txt
python-3.11.0
# 部署
heroku create myapp
git push heroku main
PythonAnywhere
# 在 PythonAnywhere Bash 中
mkvirtualenv myenv --python=/usr/bin/python3.11
pip install -r requirements.txt
# 配置 WSGI 文件
import sys
path = '/home/username/myapp'
if path not in sys.path:
sys.path.append(path)
from run import app as application
AWS Elastic Beanstalk
# .ebextensions/python.config
option_settings:
aws:elasticbeanstalk:container:python:
WSGIPath: run:app
# 部署
eb init -p python-3.11 myapp
eb create myapp-env
生产环境检查清单
安全
- 使用强 SECRET_KEY
- 禁用 DEBUG 模式
- 配置 HTTPS
- 设置安全 Headers
- 使用环境变量存储敏感信息
# 安全配置
app.config['SESSION_COOKIE_SECURE'] = True
app.config['SESSION_COOKIE_HTTPONLY'] = True
app.config['SESSION_COOKIE_SAMESITE'] = 'Lax'
app.config['PERMANENT_SESSION_LIFETIME'] = timedelta(hours=24)
性能
- 使用生产 WSGI 服务器
- 配置数据库连接池
- 启用静态文件缓存
- 使用 CDN(可选)
监控
# 日志配置
import logging
from logging.handlers import RotatingFileHandler
if not app.debug:
file_handler = RotatingFileHandler('app.log', maxBytes=10240000, backupCount=10)
file_handler.setLevel(logging.INFO)
app.logger.addHandler(file_handler)
持续集成/部署
GitHub Actions
# .github/workflows/deploy.yml
name: Deploy
on:
push:
branches: [ main ]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.11'
- name: Install dependencies
run: |
pip install -r requirements.txt
pip install pytest
- name: Run tests
run: pytest
- name: Deploy to server
run: |
# 部署脚本
ssh user@server 'cd /var/www/myapp && git pull && sudo systemctl restart myapp'
下一步
查看速查表快速回顾 Flask 核心概念。