跳到主内容

systemd 服务自动重启教程:Unit 编写、日志与安全加固

讲解 Linux VPS 上 systemd service 的专用用户、Unit 文件、Restart 策略、速率限制、journal 日志、文件系统沙箱和部署排错。

GSProber · 主机测评编辑0 阅读
讲解 Linux VPS 上 systemd service 的专用用户、Unit 文件、Restart 策略、速率限…

systemd 服务自动重启与安全加固教程

在 Linux VPS 上长期运行 Go、Node.js、Python 或自编译程序时,直接放进后台并不足以形成可靠服务。systemd 可以管理启动顺序、运行用户、异常重启、日志和资源边界,但错误的 Restart 策略可能制造重启循环,过度加固又可能让程序无法访问必需目录。本教程依据 systemd 官方 service、exec 与 unit 文档,给出可验证的配置流程。

创建专用用户与目录

不要让普通网络服务长期以 root 身份运行。先创建没有交互登录权限的系统用户,并把程序、只读配置和可写数据分开:

Bash
sudo useradd --system --home /var/lib/myapp --create-home --shell /usr/sbin/nologin myapp
sudo install -d -o myapp -g myapp /var/lib/myapp
sudo install -d -o root -g root /etc/myapp
sudo install -m 0755 myapp /usr/local/bin/myapp

程序二进制和 unit 文件应由 root 管理,业务用户只获得数据目录写权限。敏感环境变量可放入权限为 0600 的独立文件,但更成熟的部署应使用凭据机制。Linux 权限基础可参考 Linux 运维入门教程

编写最小 service unit

创建 /etc/systemd/system/myapp.service

INI
[Unit]
Description=My application service
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=myapp
Group=myapp
WorkingDirectory=/var/lib/myapp
EnvironmentFile=-/etc/myapp/myapp.env
ExecStart=/usr/local/bin/myapp
Restart=on-failure
RestartSec=5s
TimeoutStopSec=30s

[Install]
WantedBy=multi-user.target

Type=simple 适合以前台方式持续运行的程序,应用不应自行转入后台。ExecStart 使用绝对路径,避免依赖交互 Shell 的 PATH。EnvironmentFile 前的减号表示文件不存在时不让启动直接失败;如果配置必需,应去掉减号。

加载并启动:

Bash
sudo systemctl daemon-reload
sudo systemctl enable --now myapp.service
sudo systemctl status myapp.service
sudo journalctl -u myapp.service --since '10 minutes ago'

每次修改 unit 后都要 daemon-reload。可先运行 systemd-analyze verify /etc/systemd/system/myapp.service 检查语法,再重启服务。

正确设置自动重启

官方 systemd.service 文档提供多种 Restart 策略。on-failure 会在进程非正常退出、信号终止或超时时重启,通常适合长期服务;always 连正常退出也会重启,可能妨碍管理员有意停止应用内部流程。RestartSec 为重启间隔,不能设为零后忽略根本故障。

还应设置启动速率限制,避免错误配置高速循环:

INI
[Unit]
StartLimitIntervalSec=300
StartLimitBurst=5

连续失败后 systemd 会停止重试,管理员应查看 journal、修复配置,再执行 systemctl reset-failed myapp。自动重启用于处理临时异常,不是掩盖崩溃、权限或数据库连接错误。

增加基础沙箱限制

确认服务正常后,可以逐项增加 systemd.exec 提供的安全选项:

INI
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=strict
ProtectHome=true
ReadWritePaths=/var/lib/myapp

NoNewPrivileges 阻止进程及其子进程通过 exec 获得额外权限;PrivateTmp 提供独立临时目录;ProtectSystem=strict 把大部分文件系统设为只读,再通过 ReadWritePaths 明确开放业务数据目录。一次只增加少量选项并测试登录、上传、缓存和后台任务。

如果应用需要读取用户家目录、调用特权辅助程序、写入非常规路径或访问设备,相关限制可能导致失败。不要从互联网上复制一组最高强度参数后直接上线。运行 systemd-analyze security myapp.service 可以检查暴露面,但评分不是业务正确性的证明。

日志、停止与部署

服务标准输出默认进入 journal。应用应输出结构化且不包含密钥的日志,并配置 journald 磁盘上限。停止时 systemd 先发送终止信号,应用应捕获信号、停止接收新请求并完成必要清理;超过 TimeoutStopSec 后可能被强制结束。

更新程序时,先在临时路径验证新二进制,再原子替换并重启。保留上一版本和数据库迁移回滚方案。自动安全更新方法可结合 Ubuntu VPS 自动安全更新教程,但应用升级应使用独立发布流程。

排错顺序

启动失败先看 systemctl statusjournalctl -u,再核对 User、WorkingDirectory、ExecStart、环境文件和目录权限。命令在终端可用而服务失败,常见原因是 PATH、当前目录、环境变量或沙箱不同。用 sudo -u myapp 在接近服务权限的环境运行程序,可以缩小范围。

完成后应验证开机启动、异常退出后的重启、主动停止不会被误重启、日志轮转和数据目录权限。systemd 能让进程管理可预测,但真正可靠仍依赖健康检查、告警、备份和发布回滚。

所属专题:建站VPS专题
教程GsDesk 是一款基于 Cloudflare Workers 与 VPS 自托管 的开源远程桌面项目,支持 WebR…

Cloudflare Workers 免费搭建开源远程桌面完整教程:无需 VPS,支持 WebRTC P2P、D1、KV、R2、浏览器远程控制、Windows 客户端和文件传输

GsDesk 是一款基于 Cloudflare Workers 与 VPS 自托管 的开源远程桌面项目,支持 WebRTC P2P 直连,服务端仅负责 API、身份认证和 WebSocket 信令,不中转桌面视频流,大幅降低服务器带宽成本。项目支持 Cloudflare 免费套餐 部署,也可以使用 Docker 在 VPS 上自托管,内置 Windows 客户端、浏览器控制端、手机远程控制,支持 8 位设备 ID、OTP 一次性密码、永久密码、Ed25519 设备认证、JWT 身份验证、文件传输、剪贴板同步、自动重连 等完整功能。

309 阅读

教程如果你一直想拥有一个属于自己的网盘,但又不想买 VPS、维护数据库或者折腾复杂环境,那么这个基于 Cloudflare…

CloudDisk:基于 Cloudflare Workers 的免费个人网盘,无需 VPS、MySQL,支持 R2+D1+KV 一键部署

如果你一直想拥有一个属于自己的网盘,但又不想买 VPS、维护数据库或者折腾复杂环境,那么这个基于 Cloudflare Workers 的开源项目 CloudDisk 值得看看。整个系统运行在 Cloudflare 免费套餐上,文件存储使用 R2,数据库使用 D1,会话数据使用 KV,不需要 MySQL,也不需要服务器。支持多用户登录、文件夹管理、分享链接、在线预览、Office 文档查看、文本在线编辑、大文件断点续传、协作者权限管理等功能。无论是个人备份、开发者存放代码文件、团队共享资料,还是搭建自己的私有网盘,都可以直接部署到 Cloudflare,一键完成,几乎零维护成本,非常适合独立开发者、个人站长和轻量团队使用。

286 阅读

教程很多朋友在使用 Linux 服务器或者 VPS 时,经常会遇到 DNS 污染、解析慢、域名无法访问等问题。其实只需要安…

Linux 开启 DNS over HTTPS(DoH)教程:使用 Cloudflared + systemd 实现加密 DNS,防污染、防劫持

很多朋友在使用 Linux 服务器或者 VPS 时,经常会遇到 DNS 污染、解析慢、域名无法访问等问题。其实只需要安装 Cloudflare 官方的 cloudflared,并配合 systemd 自启动,就能让整个系统通过 DNS over HTTPS(DoH)进行加密解析。

237 阅读

常见问题

systemd 的 Restart 应该设置为 always 吗?

多数长期服务更适合 on-failure,只在异常退出或超时时重启。always 连正常退出也会重启,使用前要确认业务语义。

修改 service 文件后为什么没有生效?

修改 unit 后需要执行 systemctl daemon-reload,再重启或 reload 对应服务,并通过 status 与 journal 验证。

怎样避免服务进入无限重启循环?

配置 RestartSec、StartLimitIntervalSec 和 StartLimitBurst,并在达到限制后检查日志、修复故障再 reset-failed。

ProtectSystem=strict 会不会导致应用失败?

可能。它把大部分文件系统设为只读,需要通过 ReadWritePaths 明确开放数据目录,并逐项测试应用功能。

评价与回复

无需登录;审核通过后公开显示。