保姆级教程: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服务器上稳定后台运行,无需担心终端断开导致服务终止。

相关推荐
A小辣椒2 天前
TShark:Wireshark CLI 功能
linux
A小辣椒2 天前
TShark:基础知识
linux
AlfredZhao2 天前
OCI 明明分配了 200G 系统盘,为什么 df 只看到 30G?
linux·oci
AlfredZhao3 天前
vi 删除指定范围的行,不用再反复按 dd
linux·vi
用户9718356334663 天前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪3 天前
linux 拷贝文件或目录到指定的位置
linux
大树884 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠4 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
bush44 天前
嵌入式linux学习记录十四、术语
linux·嵌入式
载数而行5204 天前
Linux 11 动态监控指令top
linux