保姆级教程:Flask应用实现后台常驻运行(Linux服务器)
一、背景说明
Flask应用直接通过python app.py启动时,终端关闭/SSH断开后进程会立即终止,无法长期提供服务。本文分享3种主流的Flask后台运行方案(按推荐优先级排序),适配Ubuntu/CentOS等Linux服务器,从入门级到生产级全覆盖。
二、前置准备
- 服务器已安装Python3、pip,且Flask应用能正常运行(测试命令:
python app.py); - 知晓Flask应用的启动文件(如
app.py)、端口(如5000)、虚拟环境路径(如有); - 服务器开放对应端口(如5000),避免防火墙拦截。
三、方案1:nohup(入门级,零配置)
1. 核心原理
nohup(no hang up)是Linux内置命令,能让程序脱离终端运行,即使SSH断开也不会终止,同时将日志输出到指定文件。
2. 操作步骤
(1)基础启动命令
bash
# 进入应用目录
cd /www/flask_demo
# 后台启动Flask应用(默认端口5000)
nohup python app.py > app.log 2>&1 &
(2)命令参数说明
| 部分 | 作用 |
|---|---|
nohup |
让程序脱离终端运行 |
python app.py |
启动Flask应用的核心命令 |
> app.log |
将标准输出(日志)写入app.log文件 |
2>&1 |
将错误输出重定向到标准输出(统一写入日志) |
& |
让程序在后台运行 |
(3)指定端口/环境启动(进阶)
bash
# 方式1:通过命令行指定端口
nohup python app.py --port 8080 > app.log 2>&1 &
# 方式2:激活虚拟环境后启动
nohup /www/venv/bin/python app.py > app.log 2>&1 &
# 方式3:设置Flask环境变量(如开发/生产模式)
nohup FLASK_ENV=production FLASK_APP=app.py python -m flask run --host=0.0.0.0 --port=8080 > app.log 2>&1 &
3. 常用管理命令
bash
# 查看后台运行的Flask进程
ps -ef | grep flask
ps -ef | grep app.py
# 停止Flask进程(替换为实际PID,如12345)
kill -9 12345
# 查看实时日志
tail -f app.log
# 清空日志(避免文件过大)
> app.log
4. 优缺点
✅ 优点:零配置、上手快、无需安装额外工具;
❌ 缺点:进程崩溃后不会自动重启、无法优雅重载配置、日志需手动管理。
四、方案2:screen(进阶级,可恢复终端)
1. 核心原理
screen是终端多会话管理工具,可创建独立的会话运行Flask应用,关闭SSH后会话仍保留,后续可重新连接会话查看/管理应用。
2. 操作步骤
(1)安装screen(如未安装)
bash
# Ubuntu/Debian
apt install screen -y
# CentOS/RHEL
yum install screen -y
(2)创建会话并启动Flask
bash
# 创建名为flask_app的会话
screen -S flask_app
# 在新会话中进入应用目录并启动
cd /www/flask_demo
python app.py --host=0.0.0.0 --port=8080
(3)脱离/恢复会话
bash
# 脱离当前会话(保留后台运行):按快捷键 Ctrl + A + D
# 查看所有会话
screen -ls
# 恢复指定会话(替换为flask_app或会话ID)
screen -r flask_app
# 强制恢复无响应的会话
screen -d -r flask_app
(4)停止应用/删除会话
bash
# 恢复会话后,按 Ctrl + C 停止Flask应用
# 删除指定会话(如会话已无进程)
screen -S flask_app -X quit
3. 优缺点
✅ 优点:可恢复终端查看运行状态、支持手动干预应用、进程稳定;
❌ 缺点:进程崩溃后不会自动重启、需记住screen命令。
五、方案3:Supervisor(生产级,自动重启+监控)
1. 核心原理
Supervisor是Python编写的进程管理工具,能实现Flask应用的自动启动、崩溃重启、日志管理、进程监控,是生产环境的首选方案。
2. 操作步骤
(1)安装Supervisor
bash
# 方式1:pip安装(推荐)
pip install supervisor
# 方式2:系统包安装(Ubuntu/Debian)
apt install supervisor -y
# 验证安装
supervisord -v
(2)生成配置文件
bash
# 创建配置目录(如未存在)
mkdir -p /etc/supervisor/conf.d
# 生成主配置文件(pip安装方式)
echo_supervisord_conf > /etc/supervisor/supervisord.conf
# 修改主配置文件,引入应用配置
echo "[include]
files = /etc/supervisor/conf.d/*.conf" >> /etc/supervisor/supervisord.conf
(3)创建Flask应用配置文件
bash
# 新建配置文件(命名为flask_demo.conf)
vim /etc/supervisor/conf.d/flask_demo.conf
粘贴以下配置(根据实际情况修改):
ini
[program:flask_demo]
# Flask应用名称(自定义)
name=flask_demo
# 应用启动命令(需填绝对路径)
command=/www/venv/bin/python /www/flask_demo/app.py --host=0.0.0.0 --port=8080
# 应用目录
directory=/www/flask_demo
# 运行用户
user=root
# 自动启动
autostart=true
# 自动重启(崩溃/重启Supervisor时)
autorestart=true
# 启动延迟(避免立即重启)
startsecs=5
# 启动重试次数
startretries=3
# 日志文件路径
stdout_logfile=/www/flask_demo/supervisor.log
# 日志文件大小(轮转)
stdout_logfile_maxbytes=50MB
# 日志文件备份数
stdout_logfile_backups=10
# 环境变量
environment=FLASK_ENV="production",PYTHONPATH="/www/flask_demo"
(4)启动并管理Flask应用
bash
# 启动Supervisor服务
supervisord -c /etc/supervisor/supervisord.conf
# 重载配置文件(新增/修改配置后执行)
supervisorctl reload
# 常用管理命令
supervisorctl status flask_demo # 查看应用状态
supervisorctl start flask_demo # 启动应用
supervisorctl stop flask_demo # 停止应用
supervisorctl restart flask_demo # 重启应用
supervisorctl tail -f flask_demo # 查看实时日志
3. 优缺点
✅ 优点:进程崩溃自动重启、日志自动轮转、支持优雅启停、适配生产环境;
❌ 缺点:需配置文件、入门门槛略高。
六、补充:Nginx反向代理(优化访问体验)
无论使用哪种后台运行方案,建议搭配Nginx反向代理,实现域名访问、端口转发、静态资源加速,示例配置如下:
nginx
server {
listen 80;
server_name demo.example.com; # 你的域名
# 反向代理Flask应用
location / {
proxy_pass http://127.0.0.1:8080; # 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;
}
# 静态资源直接访问(如static目录)
location /static {
alias /www/flask_demo/static;
expires 30d;
}
}
七、常见问题与解决方案
1. nohup启动后无法访问
- 检查Flask应用是否绑定
0.0.0.0(而非127.0.0.1),否则仅能本地访问; - 检查服务器防火墙/安全组是否开放对应端口(如8080)。
2. Supervisor启动失败
- 查看Supervisor日志:
tail -f /tmp/supervisord.log; - 确保配置文件中
command路径为绝对路径,且Python环境正确; - 检查配置文件语法:
supervisord -c /etc/supervisor/supervisord.conf -n(前台运行排查错误)。
3. 进程占用端口无法启动
bash
# 查找占用端口的进程(如8080)
lsof -i:8080
# 杀死进程(替换为PID)
kill -9 PID
八、方案选择建议
| 场景 | 推荐方案 |
|---|---|
| 临时测试/快速验证 | nohup |
| 需手动干预/调试应用 | screen |
| 生产环境/长期运行 | Supervisor + Nginx |
九、总结
- 入门级用
nohup,零配置实现后台运行; - 进阶级用
screen,支持恢复终端管理应用; - 生产级用
Supervisor,实现自动重启+日志管理,搭配Nginx提升访问体验; - 核心原则:Flask应用需绑定
0.0.0.0,端口需开放,路径尽量用绝对路径。
按本文步骤操作,可让Flask应用在Linux服务器上稳定后台运行,无需担心终端断开导致服务终止。