当前位置: 首页 > news >正文

利用systemd启动部署在服务器上的web应用

0.背景

系统环境: Ubuntu 22.04
web应用情况: 前后端分类,前端采用react,后端采用fastapi

1.具体配置

1.1 前端配置

开发态运行(启动命令是npm run dev),创建systemd服务文件

sudo nano /etc/systemd/system/frontend.service

内容如下:

[Unit]
Description=React Frontend Dev Server
After=network.target[Service]
User=youruser
WorkingDirectory=/home/yourusr/yourweb/frontend
ExecStart=/usr/bin/npm run dev
Restart=always
RestartSec=3[Install]
WantedBy=multi-user.target

如果你使用了nvm来管理Node.js,那么你应该做如下修改

[Unit]
Description=React Frontend Dev Server
After=network.target[Service]
Type=simple
User=root
WorkingDirectory=/home/yourusr/yourweb/frontend
Environment="NVM_DIR=/root/.nvm"
ExecStart=/bin/bash -c 'source $NVM_DIR/nvm.sh && nvm use 22.15.0 && npm run dev'
Restart=always
RestartSec=3[Install]
WantedBy=multi-user.target

1.2后端配置

编写fastapi启动脚本,在/home/youruser/backend/start_backend.sh写入:

#!/bin/bash
cd /home/yourweb/backend
source venv/bin/activate
exec uvicorn server:app --host 0.0.0.0 --port 8000 --workers 1

如果使用conda管理环境,脚本文件的内容写入如下:

#!/bin/bashcd /home/yourweb/backend
# 加载 conda 环境(确保 conda 可用)
source /home/youruser/miniconda3/etc/profile.d/conda.sh# 激活 conda 虚拟环境
conda activate myenv# 启动 Uvicorn
exec uvicorn server:app --host 0.0.0.0 --port 8000 --workers 1

Tip: 把 /home/youruser/miniconda3 替换为你实际的 conda 安装路径(可用 which conda 看一下)

然后授予可执行权限

chmod +x /home/yourweb/backend/start_backend.sh

创建systemd服务文件

sudo nano /etc/systemd/system/backend.service

内容如下:

[Unit]
Description=FastAPI Backend Service
After=network.target[Service]
Type=simple
User=youruser
ExecStart=/home/youruser/yourweb/backend/start_backend.sh
WorkingDirectory=/home/youruser/yourweb/backend
Restart=always
RestartSec=3[Install]
WantedBy=multi-user.target

2.启停管理

2.1 前端服务启停

命令如下:

sudo systemctl daemon-reload
sudo systemctl start frontend
sudo systemctl enable frontend
sudo systemctl status frontend #查看运行状态

2.2 后端服务启停

命令如下:

sudo systemctl daemon-reload
sudo systemctl start backend
sudo systemctl enable backend
sudo systemctl status backend # 查看运行状态

相关文章:

  • Zookeeper入门(三)
  • node 后端和浏览器前端,有关 RSA 非对称加密的完整实践, 前后端匹配的代码演示
  • 从零开始实现大语言模型(十六):加载开源大语言模型参数
  • Flink 并行度的设置
  • 给个人程序加上MCP翅膀
  • 基于labview的声音采集、存储、处理
  • GitHub 趋势日报 (2025年05月17日)
  • C++(243~263)STL常用算法、遍历算法(for_each,Transform)、查找算法、拷贝和替换、常用算术生成,常用集合算法。
  • C++学习:六个月从基础到就业——C++17:if/switch初始化语句
  • 【随机过程】贝叶斯估计
  • 【计算机网络】第一章:计算机网络体系结构
  • TIMER免疫浸润分析
  • 轻量级视频剪辑方案:FFmpeg图形化工具体验
  • 国内人工智能行业研究报告 投资要点
  • Spring Cloud 技术实战
  • 非线性1 修改
  • 23种设计模式解释+记忆
  • 5.18本日总结
  • VMware虚拟机磁盘扩容与LVM分区操作指南
  • GC全场景分析
  • 中美贸易代表会谈后是否已确定下一次会谈?外交部回应
  • 大学2025丨苏大教授王尧:文科最大的危机是阐释世界的能力弱化
  • 贯彻落实《生态环境保护督察工作条例》,充分发挥生态环境保护督察利剑作用
  • 建筑瞭望|从黄浦江畔趸船改造看航运设施的升级与利用
  • 19国入境团抵沪并游玩,老外震惊:“怎么能有这么多人?”
  • 西藏普兰县公安局网安大队向自媒体人宣传网络安全知识