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),说明部署成功!
安全与优化建议
部署完成后,别忘了安全加固:
- 关闭 SSH 密码登录:改用密钥登录,提升安全性。
- 配置防火墙:只开放 80(HTTP)和 443(HTTPS)端口。
- 使用 HTTPS:通过 Let’s Encrypt 免费申请 SSL 证书,让网站支持 HTTPS。
- 日志监控:定期查看 Nginx 和 Gunicorn 日志,排查异常。
- 定期备份:数据库和配置文件要备份,防止数据丢失。
🔐 小提醒:不要在代码中硬编码密码或 API Key,建议使用环境变量。
总结:Flask 部署的完整流程
通过本文,你已经掌握了 Flask 部署的核心流程:
- 准备服务器环境,安装 Python 和依赖;
- 使用虚拟环境隔离项目依赖;
- 用 Gunicorn 作为 WSGI 服务器,启动应用;
- 用 Nginx 作为反向代理,对外提供 HTTP 服务;
- 使用 systemd 管理 Gunicorn,实现开机自启;
- 配合安全策略,确保服务稳定运行。
整个过程虽然涉及多个组件,但每个环节都清晰明确,就像搭建一个完整的餐厅系统:厨房(Gunicorn)、前台(Nginx)、管理系统(systemd)、安全门禁(防火墙)——各司其职,协同工作。
当你看到别人通过浏览器访问你部署的网站时,那种成就感,是开发中无法替代的。Flask 部署不是终点,而是你迈向全栈开发的重要一步。
现在,你的应用已经可以稳定运行在公网了。下一步,不妨尝试添加数据库、用户登录、静态资源管理,让项目更完整、更实用。