跳到主要内容

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

3.3 服务文件参数说明

参数说明
Description服务描述
After服务启动依赖
Type服务类型:notify、simple、forking
User运行服务的用户
Group运行服务的组
WorkingDirectory工作目录
ExecStart启动命令
Restart重启策略:always、on-failure、no
RestartSec重启间隔(秒)
KillSignal停止信号
SyslogIdentifier日志标识符
Environment环境变量
WantedBy安装目标

3.4 创建运行用户

# 创建用户和组
sudo useradd -r -s /bin/false thingsgateway

# 创建目录
sudo mkdir -p /opt/thingsgateway
sudo mkdir -p /var/log/thingsgateway
sudo mkdir -p /var/lib/thingsgateway

# 设置目录权限
sudo chown -R thingsgateway:thingsgateway /opt/thingsgateway
sudo chown -R thingsgateway:thingsgateway /var/log/thingsgateway
sudo chown -R thingsgateway:thingsgateway /var/lib/thingsgateway

3.5 Systemd 常用命令

3.5.1 启动服务

# 重新加载 systemd 配置
sudo systemctl daemon-reload

# 启动服务
sudo systemctl start thingsgateway

# 启用开机自启动
sudo systemctl enable thingsgateway

3.5.2 停止服务

# 停止服务
sudo systemctl stop thingsgateway

# 禁用开机自启动
sudo systemctl disable thingsgateway

3.5.3 重启服务

# 重启服务
sudo systemctl restart thingsgateway

# 重新加载配置
sudo systemctl reload thingsgateway

3.5.4 查看服务状态

# 查看服务状态
sudo systemctl status thingsgateway

# 查看服务是否启用
sudo systemctl is-enabled thingsgateway

# 查看服务是否运行
sudo systemctl is-active thingsgateway

3.5.5 查看服务日志

# 查看服务日志
sudo journalctl -u thingsgateway

# 实时查看日志
sudo journalctl -u thingsgateway -f

# 查看最近 100 行日志
sudo journalctl -u thingsgateway -n 100

# 查看今天的日志
sudo journalctl -u thingsgateway --since today

# 查看特定时间段的日志
sudo journalctl -u thingsgateway --since "2024-01-01 00:00:00" --until "2024-01-01 23:59:59"

3.6 服务资源限制

在服务文件中添加资源限制:

[Service]
Type=notify
User=thingsgateway
Group=thingsgateway
WorkingDirectory=/opt/thingsgateway
ExecStart=/usr/bin/dotnet /opt/thingsgateway/ThingsGateway.Server.dll
Restart=always
RestartSec=10

# 资源限制
MemoryLimit=2G
CPUQuota=200%
LimitNOFILE=65536
TimeoutStartSec=300
TimeoutStopSec=30

3.7 服务依赖配置

配置服务依赖其他服务:

[Unit]
Description=ThingsGateway IoT Edge Gateway
After=network.target mysql.service
Wants=mysql.service

四、防火墙配置

4.1 UFW (Ubuntu/Debian)

# 启用 UFW
sudo ufw enable

# 允许 HTTP
sudo ufw allow 5000/tcp

# 允许 HTTPS
sudo ufw allow 5001/tcp

# 查看防火墙状态
sudo ufw status

4.2 firewalld (CentOS/RHEL)

# 启用 firewalld
sudo systemctl start firewalld
sudo systemctl enable firewalld

# 添加端口
sudo firewall-cmd --permanent --add-port=5000/tcp
sudo firewall-cmd --permanent --add-port=5001/tcp

# 重新加载防火墙配置
sudo firewall-cmd --reload

# 查看防火墙状态
sudo firewall-cmd --list-all

4.3 iptables

# 添加端口规则
sudo iptables -A INPUT -p tcp --dport 5000 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 5001 -j ACCEPT

# 保存规则
sudo iptables-save > /etc/iptables/rules.v4

# 查看规则
sudo iptables -L -n -v

五、性能优化

5.1 调整系统参数

编辑 /etc/sysctl.conf 文件:

# 增加文件描述符限制
fs.file-max = 65535

# 增加 TCP 连接队列
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 65535

# 优化 TCP 参数
net.ipv4.tcp_max_syn_backlog = 65535
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30

# 应用配置
sudo sysctl -p

5.2 调整文件描述符限制

编辑 /etc/security/limits.conf 文件:

* soft nofile 65535
* hard nofile 65535
thingsgateway soft nofile 65535
thingsgateway hard nofile 65535

六、日志管理

6.1 日志位置

ThingsGateway 的日志文件默认存储在以下位置:

  • Systemd 日志journalctl -u thingsgateway
  • 应用日志/var/log/thingsgateway/
  • PM2 日志~/.pm2/logs/

6.2 日志轮转配置

创建 logrotate 配置文件 /etc/logrotate.d/thingsgateway

/var/log/thingsgateway/*.log {
daily
rotate 30
compress
delaycompress
missingok
notifempty
create 0644 thingsgateway thingsgateway
sharedscripts
postrotate
systemctl reload thingsgateway > /dev/null 2>&1 || true
endscript
}

6.3 测试日志轮转

# 强制执行日志轮转
sudo logrotate -f /etc/logrotate.d/thingsgateway

七、监控与维护

7.1 系统监控

7.1.1 使用 htop

# 安装 htop
sudo apt-get install htop # Ubuntu/Debian
sudo yum install htop # CentOS/RHEL

# 运行 htop
htop

7.1.2 使用 iotop

# 安装 iotop
sudo apt-get install iotop # Ubuntu/Debian
sudo yum install iotop # CentOS/RHEL

# 运行 iotop
sudo iotop

7.1.3 使用 netstat

# 查看端口监听
sudo netstat -tlnp | grep 5000

# 查看网络连接
sudo netstat -anp | grep ThingsGateway

7.2 自动备份

7.2.1 创建备份脚本

创建备份脚本 /opt/backup/backup-thingsgateway.sh

#!/bin/bash

# 配置
SOURCE_DIR="/opt/thingsgateway/Data"
BACKUP_DIR="/backup/thingsgateway"
RETENTION_DAYS=30

# 创建备份目录
mkdir -p "$BACKUP_DIR"

# 备份文件
BACKUP_FILE="$BACKUP_DIR/thingsgateway-$(date +%Y%m%d_%H%M%S).tar.gz"
tar -czf "$BACKUP_FILE" -C "$SOURCE_DIR" .

# 删除旧备份
find "$BACKUP_DIR" -name "thingsgateway-*.tar.gz" -mtime +$RETENTION_DAYS -delete

# 记录日志
echo "$(date): Backup created: $BACKUP_FILE" >> /var/log/thingsgateway/backup.log

设置脚本权限:

sudo chmod +x /opt/backup/backup-thingsgateway.sh

7.2.2 设置定时备份

添加 crontab 任务:

# 编辑 crontab
sudo crontab -e

# 添加以下行(每天凌晨 2 点执行备份)
0 2 * * * /opt/backup/backup-thingsgateway.sh

7.3 定期维护

  • 定期清理日志文件
  • 定期备份数据库
  • 定期检查磁盘空间
  • 定期更新软件版本
  • 定期检查系统安全

八、故障排查

8.1 服务无法启动

现象:服务启动失败

可能原因

  • 端口被占用
  • 配置文件错误
  • 权限不足
  • .NET 运行时未安装

排查步骤

  1. 查看服务日志:sudo journalctl -u thingsgateway -n 100
  2. 检查端口是否被占用:sudo netstat -tlnp | grep 5000
  3. 检查配置文件语法
  4. 验证 .NET 运行时是否正确安装:dotnet --list-runtimes
  5. 检查文件权限:ls -la /opt/thingsgateway

8.2 服务频繁重启

现象:服务频繁自动重启

可能原因

  • 应用程序异常
  • 内存不足
  • 配置错误

排查步骤

  1. 查看应用程序日志
  2. 检查系统资源使用情况:free -htop
  3. 验证配置文件
  4. 增加内存限制

8.3 性能问题

现象:系统运行缓慢

可能原因

  • CPU 使用率过高
  • 内存不足
  • 磁盘 I/O 瓶颈
  • 网络延迟高

优化建议

  1. 优化变量配置,减少采集频率
  2. 增加系统内存
  3. 使用 SSD 硬盘
  4. 优化网络配置

8.4 网络连接问题

现象:无法从外部访问

可能原因

  • 防火墙阻止
  • 端口未开放
  • 网络配置错误

排查步骤

  1. 检查防火墙规则
  2. 验证端口是否开放:sudo netstat -tlnp | grep 5000
  3. 检查网络配置
  4. 使用 telnet 测试连接:telnet <server_ip> 5000

九、安全配置

9.1 SELinux 配置 (CentOS/RHEL)

# 查看 SELinux 状态
sestatus

# 临时禁用 SELinux
sudo setenforce 0

# 永久禁用 SELinux
sudo sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

# 配置 SELinux 策略
sudo semanage port -a -t http_port_t -p tcp 5000

9.2 文件权限配置

# 设置目录权限
sudo chmod -R 755 /opt/thingsgateway
sudo chmod -R 755 /var/log/thingsgateway
sudo chmod -R 755 /var/lib/thingsgateway

# 设置文件所有权
sudo chown -R thingsgateway:thingsgateway /opt/thingsgateway
sudo chown -R thingsgateway:thingsgateway /var/log/thingsgateway
sudo chown -R thingsgateway:thingsgateway /var/lib/thingsgateway

9.3 SSL/TLS 配置

配置 HTTPS 访问,提高数据传输安全性:

{
"Kestrel": {
"Endpoints": {
"Https": {
"Url": "https://*:5001",
"Certificate": {
"Path": "/etc/ssl/certs/thingsgateway.pfx",
"Password": "password"
}
}
}
}
}

十、常见问题

Q1: 如何修改服务端口?

A: 修改 appsettings.json 中的端口配置:

{
"Urls": "http://*:5000"
}

修改后需要重启服务:

sudo systemctl restart thingsgateway

Q2: 如何查看服务日志?

A: 使用以下命令查看服务日志:

# Systemd 服务
sudo journalctl -u thingsgateway -f

# PM2 进程
pm2 logs thingsgateway

# 应用日志文件
tail -f /var/log/thingsgateway/out.log

Q3: 如何设置服务开机自启动?

A: 使用以下命令设置开机自启动:

# Systemd 服务
sudo systemctl enable thingsgateway

# PM2 进程
pm2 startup
pm2 save

Q4: 如何卸载服务?

A: 使用以下命令卸载服务:

# Systemd 服务
sudo systemctl stop thingsgateway
sudo systemctl disable thingsgateway
sudo rm /etc/systemd/system/thingsgateway.service
sudo systemctl daemon-reload

# PM2 进程
pm2 delete thingsgateway
pm2 save

Q5: 如何更新服务?

A: 更新服务的步骤:

  1. 停止服务:sudo systemctl stop thingsgateway
  2. 备份当前版本
  3. 替换程序文件
  4. 启动服务:sudo systemctl start thingsgateway

Q6: 如何查看服务资源使用情况?

A: 使用以下命令查看资源使用情况:

# 查看进程资源使用
top -p $(pgrep -f ThingsGateway.Server)

# 查看内存使用
ps aux | grep ThingsGateway.Server

# 查看网络连接
sudo netstat -anp | grep ThingsGateway

Q7: 如何配置服务依赖?

A: 在 Systemd 服务文件中配置依赖:

[Unit]
Description=ThingsGateway IoT Edge Gateway
After=network.target mysql.service
Wants=mysql.service

Q8: 如何设置服务恢复策略?

A: 在 Systemd 服务文件中配置恢复策略:

[Service]
Restart=always
RestartSec=10
StartLimitInterval=60
StartLimitBurst=3

Q9: 如何限制服务资源使用?

A: 在 Systemd 服务文件中配置资源限制:

[Service]
MemoryLimit=2G
CPUQuota=200%
LimitNOFILE=65536

Q11: PM2 和 Systemd 有什么区别?

A:

特性PM2Systemd
进程管理
自动重启
日志管理内置集成到 journalctl
负载均衡支持不支持
监控功能内置需要额外工具
开机自启动支持原生支持
资源限制有限完善
适用场景开发测试、Node.js 应用生产环境、系统服务

Q12: 如何选择 PM2 或 Systemd?

A:

  • 使用 PM2:如果需要负载均衡、实时监控、简单配置
  • 使用 Systemd:如果需要更好的资源控制、系统集成、生产环境部署