Linux服务部署
一、Linux部署概述
1.1 部署方式
ThingsGateway 在 Linux 系统上支持多种部署方式:
- PM2 守护进程:使用 PM2 进程管理器,实现进程管理和自动重启
- Systemd 服务:使用 Systemd 服务管理器,实现开机自启动和后台运行
- Docker 容器:使用 Docker 容器化部署,实现环境隔离和快速部署
- 独立部署:包含 .NET 运行时,无需 安装依赖
- 依赖部署:依赖系统已安装的 .NET 运行时
1.2 部署前准备
1.2.1 系统要求
- 操作系统:Ubuntu 18.04+、CentOS 7+、Debian 9+ 等主流 Linux 发行版
- .NET 运行时:.NET 8.0 或 .NET 9.0(依赖部署时需要)
- 内存:建议至少 4GB
- CPU:建议至少 2 核
- 存储:建议至少 20GB 可用空间
1.2.2 安装 .NET 运行时
如果使用依赖部署方式,需要先安装 ASP.NET Core Runtime。
Ubuntu/Debian:
# 安装依赖
sudo apt-get update && sudo apt-get install -y ca-certificates curl gnupg
# 添加 Microsoft GPG 密钥
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://packages.microsoft.com/keys/microsoft.asc | sudo gpg --dearmor -o /etc/apt/keyrings/microsoft.gpg
# 添加 Microsoft 仓库
sudo sh -c 'echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/microsoft.gpg] https://packages.microsoft.com/ubuntu/22.04/prod jammy main" > /etc/apt/sources.list.d/microsoft.list'
# 安装 .NET 运行时
sudo apt-get update && sudo apt-get install -y aspnetcore-runtime-8.0
# 验证安装
dotnet --list-runtimes
CentOS/RHEL:
# 安装依赖
sudo yum install -y ca-certificates curl
# 添加 Microsoft 仓库
sudo rpm -Uvh https://packages.microsoft.com/config/centos/8/packages-microsoft-prod.rpm
# 安装 .NET 运行时
sudo yum install -y aspnetcore-runtime-8.0
# 验证安装
dotnet --list-runtimes
二、PM2 守护进程部署
2.1 PM2 简介
PM2 是一个带有负载均衡功能的 Node.js 应用的进程管理器,也可以用于管理 .NET 应用程序。它具有以下特性:
- 自动重启应用
- 负载均衡
- 日志管理
- 监控功能
- 开机自启动
2.2 安装 PM2
PM2 需要 Node.js 环境,首先安装 Node.js:
# 安装 Node.js (Ubuntu/Debian)
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
sudo apt-get install -y nodejs
# 安装 Node.js (CentOS/RHEL)
curl -fsSL https://rpm.nodesource.com/setup_18.x | sudo bash -
sudo yum install -y nodejs
# 验证安装
node -v
npm -v
安装 PM2:
# 全局安装 PM2
sudo npm install pm2@latest -g
# 验证安装
pm2 -v
2.3 配置 PM2
创建 PM2 配置文件 pm2-linux.json:
{
"apps": [
{
"name": "thingsgateway",
"script": "ThingsGateway.Server.dll",
"cwd": "/opt/thingsgateway",
"interpreter": "dotnet",
"instances": 1,
"exec_mode": "fork",
"watch": false,
"max_memory_restart": "1G",
"env": {
"ASPNETCORE_ENVIRONMENT": "Production",
"ASPNETCORE_URLS": "http://*:5000"
},
"error_file": "/var/log/thingsgateway/error.log",
"out_file": "/var/log/thingsgateway/out.log",
"log_date_format": "YYYY-MM-DD HH:mm:ss",
"merge_logs": true,
"autorestart": true,
"max_restarts": 10,
"min_uptime": "10s"
}
]
}
2.4 配置参数说明
| 参数 | 说明 |
|---|---|
name | 应用名称 |
script | 启动脚本或可执行文件 |
cwd | 工作目录 |
interpreter | 解释器 |
instances | 实例数量 |
exec_mode | 执行模式:fork 或 cluster |
watch | 是否监听文件变化 |
max_memory_restart | 内存超过限制时重启 |
env | 环境变量 |
error_file | 错误日志文件 |
out_file | 输出日志文件 |
log_date_format | 日志日期格式 |
merge_logs | 是否合并日志 |
autorestart | 是否自动重启 |
max_restarts | 最大重启次数 |
min_uptime | 最小运行时间 |
2.5 PM2 常用命令
2.5.1 启动应用
# 启 动应用
pm2 start pm2-linux.json
# 启动单个应用
pm2 start ThingsGateway.Server.dll --name thingsgateway
# 使用特定环境启动
pm2 start pm2-linux.json --env production
2.5.2 停止应用
# 停止应用
pm2 stop pm2-linux.json
# 停止单个应用
pm2 stop thingsgateway
# 停止所有应用
pm2 stop all
2.5.3 重启应用
# 重启应用
pm2 restart pm2-linux.json
# 重启单个应用
pm2 restart thingsgateway
# 重启所有应用
pm2 restart all
# 平滑重启(cluster 模式)
pm2 reload all
2.5.4 删除应用
# 删除应用
pm2 delete pm2-linux.json
# 删除单个应用
pm2 delete thingsgateway
# 删除所有应用
pm2 delete all
2.5.5 查看 应用状态
# 查看应用列表
pm2 list
# 查看应用详细信息
pm2 show thingsgateway
# 查看应用日志
pm2 logs thingsgateway
# 实时查看日志
pm2 logs --lines 100
2.5.6 监控应用
# 实时监控
pm2 monit
# 查看应用信息
pm2 info thingsgateway
2.6 设置开机自启动
# 生成启动脚本
pm2 startup
# 执行输出的命令,例如:
sudo env PATH=$PATH:/usr/bin pm2 startup systemd -u username --hp /home/username
# 保存当前进程列表
pm2 save
2.7 日志管理
2.7.1 查看日志
# 查看所有日志
pm2 logs
# 查看特定应用的日志
pm2 logs thingsgateway
# 查看错误日志
pm2 logs --err
# 查看输出日志
pm2 logs --out
# 查看最近 100 行日志
pm2 logs --lines 100
# 清空日志
pm2 flush
2.7.2 日志轮转
安装 pm2-logrotate 模块:
pm2 install pm2-logrotate
配置日志轮转:
# 设置日志轮转
pm2 set pm2-logrotate:max_size 10M
pm2 set pm2-logrotate:retain 7
pm2 set pm2-logrotate:compress true
参数说明:
max_size:单个日志文件最大大小retain:保留的日志文件数量compress:是否压缩旧日志
2.8 PM2 高级配置
2.8.1 负载均衡
{
"apps": [
{
"name": "thingsgateway",
"script": "ThingsGateway.Server.dll",
"instances": 4,
"exec_mode": "cluster"
}
]
}
2.8.2 健康检查
{
"apps": [
{
"name": "thingsgateway",
"script": "ThingsGateway.Server.dll",
"health_check_grace_period": 3000,
"health_check_interval": 10000,
"health_check_timeout": 5000,
"health_check_uri": "http://localhost:5000/health"
}
]
}
三、Systemd 服务部署
3.1 Systemd 简介
Systemd 是 Linux 系统的初始化系统和服务管理器,用于管理系统服务、进程 和资源。使用 Systemd 部署 ThingsGateway 具有以下优势:
- 开机自启动
- 自动重启
- 资源限制
- 日志管理
- 依赖管理
3.2 创建服务文件
创建 Systemd 服务文件 /etc/systemd/system/thingsgateway.service:
[Unit]
Description=ThingsGateway IoT Edge Gateway
After=network.target
[Service]
Type=notify
User=thingsgateway
Group=thingsgateway
WorkingDirectory=/opt/thingsgateway
ExecStart=/usr/bin/dotnet /opt/thingsgateway/ThingsGateway.Server.dll
Restart=always
RestartSec=10
KillSignal=SIGINT
SyslogIdentifier=thingsgateway
Environment=ASPNETCORE_ENVIRONMENT=Production
Environment=ASPNETCORE_URLS=http://*:5000
Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false
[Install]
WantedBy=multi-user.target