保姆级教程:Flask应用实现后台常驻运行(Linux服务器)

保姆级教程:Flask应用实现后台常驻运行(Linux服务器)

一、背景说明

Flask应用直接通过python app.py启动时,终端关闭/SSH断开后进程会立即终止,无法长期提供服务。本文分享3种主流的Flask后台运行方案(按推荐优先级排序),适配Ubuntu/CentOS等Linux服务器,从入门级到生产级全覆盖。

二、前置准备

  1. 服务器已安装Python3、pip,且Flask应用能正常运行(测试命令:python app.py);
  2. 知晓Flask应用的启动文件(如app.py)、端口(如5000)、虚拟环境路径(如有);
  3. 服务器开放对应端口(如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

九、总结

  1. 入门级用nohup,零配置实现后台运行;
  2. 进阶级用screen,支持恢复终端管理应用;
  3. 生产级用Supervisor,实现自动重启+日志管理,搭配Nginx提升访问体验;
  4. 核心原则:Flask应用需绑定0.0.0.0,端口需开放,路径尽量用绝对路径。

按本文步骤操作,可让Flask应用在Linux服务器上稳定后台运行,无需担心终端断开导致服务终止。

相关推荐
夏日听雨眠1 小时前
Linux学习1
linux·服务器·学习
小生不才yz1 小时前
【Makefile 专家之路 | 函数篇】10. 逻辑增强:逻辑函数(if/and/or)与环境断言(info/error)
linux
123过去2 小时前
sslyze使用教程
linux·网络·安全
闫记康2 小时前
Linux ip基础
linux·网络·tcp/ip
思麟呀2 小时前
应用层自定义协议与序列化
linux·运维·服务器·网络·c++
Lost_in_the_woods2 小时前
Java程序员的Linux之路——命令篇
linux·运维·服务器
IpdataCloud2 小时前
在线IP查询API与本地离线库,速度与安全如何选型?
运维·服务器·网络
困惑阿三2 小时前
全栈服务器运维终极备忘录
运维·服务器·nginx·pm2
optimistic_chen2 小时前
【Vue3入门】自定义指令与插槽详解
linux·运维·服务器·vue.js·前端框架·指令