Flask 部署(快速上手)

Flask 部署:从开发到上线的完整实践

当你在本地用 Flask 写完一个网页应用,测试通过,功能正常,下一步自然就是把它放到公网,让别人也能访问。这一步,就叫 Flask 部署。很多人觉得部署是“黑箱操作”,其实只要掌握几个关键步骤,它就像搭积木一样清晰可控。

想象一下,你的 Flask 应用就像一个餐厅。你在家里用小灶做菜(本地开发),味道不错,朋友来尝也说好。但想让更多人吃到,就得把厨房搬到街边,挂上招牌,开张营业。这个“搬到街边”的过程,就是部署。

本文将带你一步步完成 Flask 部署,从准备环境、配置服务器,到使用 Nginx 和 Gunicorn 作为“门面”和“厨师”,最终让你的应用能稳定、高效地对外服务。


选择合适的部署方式

在动手部署前,先明确你的需求。Flask 本身是轻量级框架,适合小型项目,但部署方式有多种,每种适合不同场景。

部署方式 适用场景 优点 缺点
本地运行(flask run 开发调试 简单快捷 仅限本地,无法公网访问,性能差
Gunicorn + Nginx 生产环境 性能高、支持并发、稳定 配置稍复杂
Docker 容器化 多环境统一、团队协作 隔离性好、可移植性强 学习成本略高
云平台一键部署(如 Heroku、Vercel) 快速上线、轻量项目 零配置、快速发布 定制性差,成本随流量上升

如果你是初学者,建议先从 Gunicorn + Nginx 的组合开始。它既真实模拟生产环境,又能让你深入理解 Web 服务器的工作原理。


准备部署环境

部署的第一步,是准备一台可以远程访问的服务器。国内推荐阿里云、腾讯云,国外可用 DigitalOcean 或 AWS。

以 Ubuntu 20.04 为例,我们先登录服务器:

ssh root@your-server-ip

输入密码后,更新系统包:

apt update && apt upgrade -y

然后安装 Python 3 和 pip:

apt install python3 python3-pip -y

接下来安装虚拟环境工具,避免依赖冲突:

pip3 install virtualenv

📌 小贴士:虚拟环境就像一个独立的“沙箱”,你的项目依赖不会影响系统其他程序,也不会被别人干扰。

创建项目目录并进入:

mkdir /opt/myflaskapp
cd /opt/myflaskapp

现在,把你的 Flask 项目代码复制进去。可以使用 scp 或 Git 推送到服务器。


使用 Gunicorn 运行 Flask 应用

Gunicorn(Green Unicorn)是一个 Python WSGI HTTP 服务器,专门用于部署 Flask、Django 等应用。它能处理多个请求,性能远高于 flask run

先在项目目录中创建虚拟环境:

virtualenv venv

激活虚拟环境:

source venv/bin/activate

安装 Gunicorn:

pip install gunicorn

现在,测试 Gunicorn 是否能启动你的 Flask 应用。假设你的主文件是 app.py,内容如下:

from flask import Flask

app = Flask(__name__)

@app.route('/')
def home():
    return '<h1>欢迎访问我的 Flask 应用!</h1>'

@app.route('/hello')
def hello():
    return 'Hello, World!'

if __name__ == '__main__':
    app.run(debug=True)  # 注意:生产环境不要开启 debug

✅ 注释:if __name__ == '__main__' 这段代码是开发环境的启动入口。部署时,我们通过 Gunicorn 启动,所以不需要运行它。

使用 Gunicorn 启动应用:

gunicorn -w 4 -b 127.0.0.1:8000 app:app
  • -w 4:启动 4 个工作进程,提高并发能力
  • -b 127.0.0.1:8000:绑定本地 8000 端口
  • app:app:表示模块名为 app,应用实例名为 app

此时,你可以在服务器本地访问 http://127.0.0.1:8000,看到页面正常显示。

但问题来了:这个服务只能在服务器本地访问,外网无法访问。我们需要 Nginx 来“做门面”,对外提供服务。


配置 Nginx 作为反向代理

Nginx 是一个高性能的 HTTP 服务器和反向代理工具。它的作用,就像餐厅的前台接待员:外人只看到前台(Nginx),而真正的厨房(Gunicorn)在后院,不对外暴露。

安装 Nginx:

apt install nginx -y

启动并设置开机自启:

systemctl start nginx
systemctl enable nginx

编辑 Nginx 配置文件:

nano /etc/nginx/sites-available/myflaskapp

粘贴以下配置:

server {
    listen 80;
    server_name your-domain.com;  # 替换为你的域名或服务器IP

    location / {
        proxy_pass http://127.0.0.1:8000;  # 转发请求到 Gunicorn
        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;
    }
}

📌 注释:server_name 要替换为你的域名或服务器公网 IP。如果没域名,直接写 IP 也可以。

启用该配置:

ln -s /etc/nginx/sites-available/myflaskapp /etc/nginx/sites-enabled/

测试配置是否正确:

nginx -t

如果输出 “syntax is ok”,说明配置无误。

重启 Nginx:

systemctl restart nginx

现在,你可以在浏览器中输入服务器公网 IP,比如 http://123.45.67.89,就能看到 Flask 应用了!


实现自动化启动(systemd)

手动运行 Gunicorn 不现实,万一服务器重启,应用就没了。我们需要用 systemd 来管理 Gunicorn,实现开机自启。

创建服务文件:

nano /etc/systemd/system/myflaskapp.service

输入以下内容:

[Unit]
Description=Flask App Service
After=network.target

[Service]
User=root
Group=www-data
WorkingDirectory=/opt/myflaskapp
ExecStart=/opt/myflaskapp/venv/bin/gunicorn -w 4 -b 127.0.0.1:8000 app:app
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
Restart=always

[Install]
WantedBy=multi-user.target

✅ 注释:ExecStart 指定了 Gunicorn 的启动命令,注意路径必须写完整。Restart=always 表示崩溃后自动重启。

保存后,重新加载 systemd:

systemctl daemon-reload

启用服务:

systemctl enable myflaskapp.service

启动服务:

systemctl start myflaskapp.service

查看运行状态:

systemctl status myflaskapp.service

如果显示 active (running),说明部署成功!


安全与优化建议

部署完成后,别忘了安全加固:

  1. 关闭 SSH 密码登录:改用密钥登录,提升安全性。
  2. 配置防火墙:只开放 80(HTTP)和 443(HTTPS)端口。
  3. 使用 HTTPS:通过 Let’s Encrypt 免费申请 SSL 证书,让网站支持 HTTPS。
  4. 日志监控:定期查看 Nginx 和 Gunicorn 日志,排查异常。
  5. 定期备份:数据库和配置文件要备份,防止数据丢失。

🔐 小提醒:不要在代码中硬编码密码或 API Key,建议使用环境变量。


总结:Flask 部署的完整流程

通过本文,你已经掌握了 Flask 部署的核心流程:

  1. 准备服务器环境,安装 Python 和依赖;
  2. 使用虚拟环境隔离项目依赖;
  3. 用 Gunicorn 作为 WSGI 服务器,启动应用;
  4. 用 Nginx 作为反向代理,对外提供 HTTP 服务;
  5. 使用 systemd 管理 Gunicorn,实现开机自启;
  6. 配合安全策略,确保服务稳定运行。

整个过程虽然涉及多个组件,但每个环节都清晰明确,就像搭建一个完整的餐厅系统:厨房(Gunicorn)、前台(Nginx)、管理系统(systemd)、安全门禁(防火墙)——各司其职,协同工作。

当你看到别人通过浏览器访问你部署的网站时,那种成就感,是开发中无法替代的。Flask 部署不是终点,而是你迈向全栈开发的重要一步。

现在,你的应用已经可以稳定运行在公网了。下一步,不妨尝试添加数据库、用户登录、静态资源管理,让项目更完整、更实用。