Flask 教程

Flask 部署

将 Flask 应用从本地开发环境部署到生产环境,是项目上线的最后一步,也是至关重要的一步。

在开发时,我们使用 app.run(debug=True) 启动服务器。但 Flask 内置的开发服务器(Werkzeug)绝对不能用于生产环境,因为它性能低下、不支持高并发,且存在严重的安全隐患。

在生产环境中,标准的 Flask 部署架构通常是:Nginx (Web 服务器) + Gunicorn (WSGI 服务器) + Flask (应用)


🏗️ 1. 生产环境架构解析

纯文本
plaintext
客户端 (浏览器/App)
      ↓ (HTTP/HTTPS 请求)
[Nginx] (Web 服务器)
  ├─ 处理静态文件 (CSS/JS/图片) -> 直接返回,不经过 Python
  ├─ 处理 SSL/TLS (HTTPS 证书)
  └─ 反向代理动态请求 -> 转发给 Gunicorn
      ↓
[Gunicorn] (WSGI 服务器)
  ├─ 管理多个 Python 进程/Worker
  └─ 将请求分发给 Flask 应用
      ↓
[Flask App] (你的 Python 代码)
  • Nginx:负责挡在最前面,处理慢请求、静态文件、HTTPS,并把需要 Python 处理的请求转发给后端。
  • Gunicorn:一个高性能的 Python WSGI HTTP 服务器,负责运行你的 Flask 代码,处理并发。

🛠️ 2. 部署实战步骤 (Linux 环境)

假设你有一台 Ubuntu 服务器,项目代码已经通过 Git 拉取到了 /var/www/myflaskapp 目录。

第一步:准备 Python 环境

在服务器上创建虚拟环境并安装依赖。

纯文本
plaintext
cd /var/www/myflaskapp

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

# 安装项目依赖
pip install -r requirements.txt

# 安装 Gunicorn
pip install gunicorn

第二步:测试 Gunicorn 启动

在运行之前,先确保 Gunicorn 能正常启动你的应用。
假设你的入口文件是 run.py,里面有一个 app 实例(或者使用工厂模式 create_app())。

纯文本
plaintext
# 基础启动命令 (绑定到本地 8000 端口,启动 3 个 worker 进程)
gunicorn --bind 127.0.0.1:8000 --workers 3 run:app

# 如果是应用工厂模式 (create_app)
gunicorn --bind 127.0.0.1:8000 --workers 3 "run:create_app()"

(注:workers 数量通常设置为 (2 x CPU核心数) + 1)

如果看到类似 Listening at: http://127.0.0.1:8000 的输出,说明 Gunicorn 配置成功。按 Ctrl+C 停止。

第三步:配置 Systemd (进程守护)

为了让 Gunicorn 在后台运行,并且开机自启、崩溃自动重启,我们需要创建一个 Systemd 服务文件。

创建文件:sudo nano /etc/systemd/system/myflaskapp.service

填入以下内容:

纯文本
plaintext
[Unit]
Description=Gunicorn instance to serve myflaskapp
After=network.target

[Service]
# 运行该服务的系统用户 (建议不要用 root)
User=www-data
Group=www-data

# 项目目录
WorkingDirectory=/var/www/myflaskapp
# 虚拟环境路径
Environment="PATH=/var/www/myflaskapp/venv/bin"
# 环境变量文件 (存放 SECRET_KEY, 数据库密码等)
EnvironmentFile=/var/www/myflaskapp/.env

# 启动命令
ExecStart=/var/www/myflaskapp/venv/bin/gunicorn --workers 3 --bind unix:myflaskapp.sock -m 007 run:app

# 进程管理
Restart=always
RestartSec=3

[Install]
WantedBy=multi-user.target

注意:这里我们将 Gunicorn 绑定到了 unix:myflaskapp.sock (Unix 套接字),这比 TCP 端口通信性能更高,且仅限于本机访问,更安全。

启动并启用服务:

纯文本
plaintext
sudo systemctl start myflaskapp
sudo systemctl enable myflaskapp
sudo systemctl status myflaskapp  # 检查状态

第四步:配置 Nginx 反向代理

安装 Nginx:sudo apt install nginx

创建 Nginx 配置文件:sudo nano /etc/nginx/sites-available/myflaskapp

纯文本
plaintext
server {
    listen 80;
    server_name your_domain.com; # 替换为你的域名或服务器 IP

    # 1. 处理静态文件 (极大减轻 Python 负担)
    location /static/ {
        alias /var/www/myflaskapp/app/static/; # 指向你的 static 目录
        expires 30d; # 开启浏览器缓存
        add_header Cache-Control "public, immutable";
    }

    # 2. 处理动态请求 (反向代理给 Gunicorn)
    location / {
        include proxy_params;
        # 指向 Gunicorn 创建的 sock 文件
        proxy_pass http://unix:/var/www/myflaskapp/myflaskapp.sock;

        # 传递真实的客户端 IP 给 Flask
        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;
    }
}

启用配置并重启 Nginx:

纯文本
plaintext
sudo ln -s /etc/nginx/sites-available/myflaskapp /etc/nginx/sites-enabled
sudo nginx -t  # 测试配置语法
sudo systemctl restart nginx

现在,访问 http://your_domain.com,Nginx 会将请求完美地转发给你的 Flask 应用了!


🐳 3. 现代替代方案:Docker 容器化

在实际的企业级开发中,手动配置 Nginx 和 Systemd 比较繁琐。现在更主流的做法是使用 Docker 将应用及其运行环境打包成镜像。

Dockerfile 示例:

纯文本
plaintext
FROM python:3.10-slim

WORKDIR /app

# 安装系统依赖 (如 Nginx, 如果需要的话)
# 这里我们只打包 Python 应用
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt gunicorn

COPY . .

# 暴露端口
EXPOSE 8000

# 启动命令
CMD ["gunicorn", "--bind", "0.0.0.0:8000", "--workers", "3", "run:app"]

配合 docker-compose.yml,你可以一键拉起 Flask、Redis、MySQL 和 Nginx,实现“一次构建,到处运行”。


☁️ 4. 其他部署方式 (PaaS)

如果你不想管理服务器(运维),可以使用 PaaS(平台即服务)平台,只需推送代码即可部署:

  • 国内:阿里云 (计算巢/云效)、腾讯云 (Web 应用托管)、华为云。
  • 国外:Render, Heroku, Railway, Vercel (适合前端+Serverless API)。

⚠️ 5. 生产环境上线 Checklist (避坑指南)

在点击“上线”按钮前,请务必检查以下几点:

  1. 关闭 Debug 模式:确保 app.run(debug=False) 或在配置中设置 DEBUG = False。Debug 模式会暴露源码和堆栈信息。
  2. 更改 SECRET_KEY:绝对不要使用默认的或硬编码的 SECRET_KEY。使用环境变量注入一个复杂的随机字符串。
  3. 数据库切换:将 SQLite 切换为 PostgreSQLMySQL。SQLite 不支持高并发写入。
  4. 环境变量管理:使用 .env 文件或云平台的密钥管理服务存放数据库密码、API Key 等敏感信息,绝不提交到 Git
  5. 配置 HTTPS:使用 Let’s Encrypt (Certbot) 为你的域名配置免费的 SSL 证书,Nginx 配置中监听 443 端口。
  6. 日志收集:配置 Gunicorn 的 accesslogerrorlog,或者使用 Python 的 logging 模块将日志输出到文件/ELK 系统,方便排查线上问题。
  7. 跨域与 CORS:如果是前后端分离,确保正确配置了 Flask-CORS,且只允许受信任的前端域名。

🎉 总结

Flask 部署的核心在于职责分离

  • Nginx 负责“脏活累活”(静态文件、HTTPS、防攻击)。
  • Gunicorn 负责“并发调度”(管理 Python 进程)。
  • Flask 专注“业务逻辑”。

掌握了这套架构,你的 Flask 应用就具备了支撑数万日活用户的工业级能力。恭喜你,至此你已经完整掌握了 Flask 从入门到上线的全流程!

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注