如何让AWS Lightsail虚拟服务器上的应用在关闭SSH会话后持续运行
核心原因
你在SSH会话中直接启动的Flask进程属于当前SSH会话的子进程,当SSH连接断开时,系统会向该会话关联的所有进程发送SIGHUP(挂起)信号,绝大多数进程默认收到该信号会直接退出,这就是应用停止的根本原因,和AWS Lightsail的基础配置无关。
可选择的解决方案
根据你的使用场景可以选以下任意一种方案:
临时测试场景:nohup后台运行
不需要额外安装工具,修改启动命令即可:nohup python3 你的Flask启动文件名.py &nohup会让进程忽略SIGHUP信号,末尾的&会将进程放到后台运行,启动后直接关闭SSH即可。要停止进程时,执行ps aux | grep python找到对应进程ID,执行kill 进程ID即可。轻量长期运行场景:使用tmux终端复用
可以创建独立于SSH会话的终端窗口,进程不会随SSH断开终止,操作步骤:- 安装tmux(Debian/Ubuntu系):
sudo apt install tmux,CentOS系请替换为sudo yum install tmux - 新建独立会话:
tmux new -s flask_app - 进入会话后正常启动Flask应用,按下
Ctrl+B后再按D即可退出会话界面,此时关闭SSH不影响进程运行 - 后续需要回到会话操作时,执行
tmux a -t flask_app即可重新进入
- 安装tmux(Debian/Ubuntu系):
生产环境标准方案:配置systemd服务
支持开机自启、崩溃自动重启,是长期运行服务的最优选择,操作步骤:- 新建service配置文件:
sudo nano /etc/systemd/system/flask_app.service - 填入以下配置,将占位内容替换为你实际的路径、用户名、启动命令:
[Unit] Description=My Flask Test App After=network.target [Service] User=你的服务器登录用户名 WorkingDirectory=你的Flask应用所在文件夹的绝对路径 ExecStart=python3 你的Flask启动文件名.py Restart=always [Install] WantedBy=multi-user.target- 重载systemd配置:
sudo systemctl daemon-reload - 启动应用:
sudo systemctl start flask_app - 设置开机自启:
sudo systemctl enable flask_app
后续可以通过sudo systemctl status flask_app查看运行状态,journalctl -u flask_app查看应用日志。
- 新建service配置文件:
额外提示:当前你用的Flask自带开发服务器仅适合测试使用,正式上线建议替换为Gunicorn、uWSGI等生产级WSGI服务器,再配合你已安装的Nginx做反向代理,性能和稳定性会大幅提升。
内容的提问来源于stack exchange,提问作者KineticSquid
相关产品推荐
相关产品推荐

