✅ 如何把 Flask 应用部署到正式(生产)环境服务器上运行。
🧩 一、开发阶段 vs 生产阶段
在 开发阶段:
app.run(host="0.0.0.0", port=5000, debug=True)
这是 Flask 自带的「开发服务器(Werkzeug 服务器)」,
优点是方便调试,缺点是:
- 仅供开发用;
- 单线程,不支持高并发;
- 没有日志、守护进程、自动重启等特性。
❌ 不能直接用在正式环境!
在 正式生产环境,你需要使用 一个可靠的 WSGI Web 服务器 来运行 Flask 应用。
🚀 二、生产环境推荐部署方式
最常见的三种选项:
| 部署方式 | Web 服务器 | 说明 |
|---|---|---|
| ① Gunicorn + Nginx | Python 最常用方案,稳定、安全 | ✅ 推荐 |
| ② uWSGI + Nginx | 传统经典方案,性能优良 | 常用于大型项目 |
| ③ Docker 容器 | 可移植性强,易于云部署 | 结合 1 或 2 使用 |
🧠 三、核心思路(通用流程)
核心逻辑是:
Flask 应用本身不对外暴露,只监听内部 socket;
由 Nginx 或系统服务转发外部请求给它。
整体结构如下:
浏览器 → Nginx (80/443端口)
↳ 反向代理 → Gunicorn (WSGI)
↳ Flask app.run() 内部逻辑
🧱 四、具体部署步骤(以 Gunicorn 为例)
假设你的 Flask 代码文件是 app.py,并且内容是:
from flask import Flask
app = Flask(__name__)
@app.route("/")
def index():
return "欢迎访问正式环境!"
✅ 第一步:安装依赖
在你的服务器(Linux 或云主机)上执行:
pip install flask gunicorn
✅ 第二步:测试启动
运行:
gunicorn -w 4 -b 0.0.0.0:8080 app:app
参数解释:
| 参数 | 说明 |
|---|---|
-w 4 |
启动 4 个 worker 进程(提升并发能力) |
-b 0.0.0.0:8080 |
绑定所有网卡的 8080 端口 |
app:app |
格式是「文件名:Flask实例名」 |
如果你访问 http://服务器IP:8080,
页面就会看到 “欢迎访问正式环境”。
✅ 第三步(可选):用 Nginx 做反向代理
安装 Nginx(例如 Ubuntu):
sudo apt install nginx
编辑 Nginx 配置(位于 /etc/nginx/sites-enabled/default):
server {
listen 80;
server_name mydomain.***; # 改成你的域名或服务器 IP
location / {
proxy_pass http://127.0.0.1:8080; # 转发给 Gunicorn
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
重启 Nginx:
sudo systemctl restart nginx
然后在浏览器访问你的正式网址(例如 http://mydomain.***/)即可上线访问。
✅ 第四步(可选):后台运行服务
部署一般都需要守护进程工具,比如:
| 工具 | 功能 |
|---|---|
| systemd | Linux 系统自带服务管理器 |
| supervisor | 管理多进程 / 自动重启进程 |
以 systemd 为例,创建服务单元文件:
/etc/systemd/system/flask_app.service
[Unit]
Description=Flask Production App
After=***work.target
[Service]
User=www-data
WorkingDirectory=/srv/app
ExecStart=/usr/local/bin/gunicorn -w 4 -b 127.0.0.1:8080 app:app
Restart=always
[Install]
WantedBy=multi-user.target
启动服务:
sudo systemctl daemon-reload
sudo systemctl enable flask_app
sudo systemctl start flask_app
✅ 这样你重启服务器后 Flask 服务也会自动启动。
💡 五、不同 IP/域名下如何运行
当你部署好后,app.run() 不再使用,因为这行仅在开发模式下运行。
正式环境里由 Gunicorn 或 uWSGI 接管。
但是如果想自己在测试服务器手动运行,也可以:
app.run(host="0.0.0.0", port=8080)
其中:
-
host="0.0.0.0"表示接受来自任何 IP 的请求; -
port=8080是端口号(可改成 80 或 5000 等)。
实际上线时建议让 Gunicorn/Nginx 做 HTTP 入口,
Flask 应用只在本地端口监听,不直接暴露。
📊 六、简单部署方案总结
| 场景 | 推荐启动方式 | 是否适合生产 |
|---|---|---|
| 本地调试 | app.run(debug=True) |
❌ 仅限开发 |
| 临时局域网访问 | app.run(host='0.0.0.0', port=5000) |
⚠️ 可测试 |
| 生产正式站点 |
gunicorn app:app 或 uwsgi --ini conf
|
✅ 推荐 |
| 云/容器环境 |
docker run ...(容器封装) |
✅ 推荐 |
✅ 七、总结一张图
客户端(浏览器)
↓
[Nginx 80/443端口] ← 处理静态文件 / SSL
↓
[Gunicorn WSGI服务器] ← 运行多进程 Flask
↓
[Flask 程序 app.py] ← 真正处理业务逻辑