用 FastAPI 写好后端上传到服务器,以前我都是靠 screen 把程序挂在后台跑。
好处就是操作简单,可以快速看到部署结果。
问题:
# 查看当前有哪些后台会话
screen -list
# 新建一个名为 api 的后台会话
screen -S api
# 回到名为 api 的会话(之后手动重启 Python 服务,再按 Ctrl + A + D 退出)
screen -rd api
# 直接销毁名为 api 的会话
screen -S api -X quit
# 或者先进入会话,按 Ctrl + C 停掉程序,再执行 exit 退出
screen -S api
systemd 服务可以完美解决 screen 遇到的问题。
新建服务文件:
vi /etc/systemd/system/myapp.service
其中 myapp.service 表示服务名叫 myapp,也可以按实际情况改成别的名字。
[Unit]
Description=Fastapi backend project
After=network.target mongod.service
[Service]
# 改成服务器上 fastapi-project-dir 的实际目录
WorkingDirectory=/home/Users/fastapi-project-dir
# 改成你现在启动用的 python(有 venv 就填 venv 里的,用 which python3 能查到)
ExecStart=/usr/bin/python3 -m uvicorn app.main:app --host 127.0.0.1 --port 4000
Restart=always
RestartSec=3
[Install]
WantedBy=multi-user.target
配置字段逐项说明:
• Description:服务的描述信息,systemctl status 时会显示,方便识别。
• After:定义启动顺序,表示本服务在网络和 mongod.service 就绪之后再启动。它只管顺序,不代表强依赖。
• WorkingDirectory:服务的工作目录,ExecStart 里的相对路径都基于这里,必须指向项目实际所在目录。
• ExecStart:启动命令。要填当前环境实际使用的 Python 解释器路径;如果用了虚拟环境,就填 venv 里的那个。
• Restart=always:进程退出后总是自动重启,实现崩溃自愈。
• RestartSec=3:重启前等待 3 秒,避免频繁重启打满日志。
• WantedBy=multi-user.target:安装目标,enable 时据此建立开机自启的软链接。
执行下面两行让配置生效:
sudo systemctl daemon-reload # 让 systemd 读取新文件
sudo systemctl enable --now myapp # 开机自启 + 立即启动
只要 myapp.service 文件内容有变动,就要执行一次 sudo systemctl daemon-reload 让配置生效。
之后每次更新代码,只需执行 sudo systemctl restart myapp 就搞定了,不用再像 screen 那样先进后台、再手动重启、再退出。
常用管理命令:
sudo systemctl status myapp # 查看服务状态
sudo systemctl restart myapp # 重启服务
sudo systemctl stop myapp # 停止服务
sudo systemctl disable myapp # 取消开机自启
sudo journalctl -u myapp -f # 实时跟踪服务日志
↶ 返回首页 ↶