跳转到内容
KN郑某某

Spring Boot 服务后台运行(Systemd 管理)

以 Systemd 管理 Spring Boot 服务,包含 JDK 21 和 Spring Boot 3.x 的最新实践。

Linux 1 分钟阅读

内容保鲜:本文已更新至 JDK 21 + Spring Boot 3.x 环境,新增虚拟线程、容器感知、安全加固等现代实践。

Terminal window
# 新建服务文件
sudo vim /etc/systemd/system/gateway.service

[Unit]
Description=Gateway Service
After=syslog.target network.target remote-fs.target nss-lookup.target
# 添加依赖关系,确保在网络就绪后启动
Wants=network-online.target
[Service]
# 安全加固:使用专用用户运行(推荐)
User=app
Group=app
# 工作目录
WorkingDirectory=/home/app/gateway
# JDK 21 启动命令(推荐)
ExecStart=/usr/bin/java \
-Xms256m -Xmx512m \
-XX:+UseZGC \
-Dspring.profiles.active=prod \
-jar gateway.jar
# 进程管理
Restart=on-failure
RestartSec=10s
StartLimitBurst=5
StartLimitIntervalSec=60
# 环境变量(可选)
Environment=SPRING_PROFILES_ACTIVE=prod
Environment=JAVA_HOME=/usr/lib/jvm/java-21-openjdk
# 日志配置
StandardOutput=journal
StandardError=journal
SyslogIdentifier=gateway
# 资源限制(可选)
LimitNOFILE=65536
MemoryMax=1G
[Install]
WantedBy=multi-user.target

[Unit]
Description=Gateway Service
After=syslog.target network.target
[Service]
User=app
Group=app
WorkingDirectory=/home/app/gateway
# Spring Boot 3.x 容器感知配置
ExecStart=/usr/bin/java \
-Xms256m -Xmx512m \
-XX:+UseZGC \
-Djava.security.egd=file:/dev/./urandom \
-Dspring.lifecycle.timeout-per-shutdown-phase=30s \
-jar gateway.jar
# 优雅停机
TimeoutStopSec=60s
KillMode=mixed
KillSignal=SIGTERM
# 自动重启策略
Restart=on-failure
RestartSec=10s
StartLimitBurst=5
StartLimitIntervalSec=60
# 安全加固
NoNewPrivileges=true
ProtectSystem=strict
ProtectHome=true
ReadWritePaths=/home/app/gateway/logs
PrivateTmp=true
[Install]
WantedBy=multi-user.target

Terminal window
# 重载服务配置
sudo systemctl daemon-reload
# 启动服务
sudo systemctl start gateway
# 设置开机自启
sudo systemctl enable gateway
# 查看服务状态
sudo systemctl status gateway
# 查看实时日志
sudo journalctl -u gateway -f
# 查看最近 100 行日志
sudo journalctl -u gateway -n 100
# 查看指定时间范围的日志
sudo journalctl -u gateway --since "2026-06-06 10:00:00" --until "2026-06-06 12:00:00"
# 停止服务
sudo systemctl stop gateway
# 禁用开机自启
sudo systemctl disable gateway
# 重启服务
sudo systemctl restart gateway

防止日志文件过大,配置 logrotate:

Terminal window
sudo vim /etc/logrotate.d/gateway

写入以下内容:

/home/app/gateway/logs/*.log {
daily
rotate 30
compress
delaycompress
missingok
notifempty
copytruncate
dateext
dateformat -%Y%m%d
}

JDK 版本推荐场景GC 选择
JDK 8旧项目维护G1GC
JDK 11稳定版本G1GC
JDK 17长期支持版(LTS)G1GC 或 ZGC
JDK 21最新 LTS,推荐新项目ZGC(低延迟)

Terminal window
# 在 ExecStart 中添加虚拟线程参数
ExecStart=/usr/bin/java \
-Xms256m -Xmx512m \
-XX:+UseZGC \
-Dspring.threads.virtual.enabled=true \
-jar gateway.jar

特性SystemdDocker
部署复杂度简单需要学习曲线
资源占用稍高
环境隔离
可移植性
适合场景单机部署、传统服务器微服务、容器编排

建议:如果是单机部署且团队熟悉 Linux,优先使用 Systemd;如果是微服务架构或需要容器化,优先使用 Docker。

Terminal window
# 查看详细错误信息
sudo journalctl -u gateway -n 50 --no-pager
# 检查配置文件语法
sudo systemd-analyze verify /etc/systemd/system/gateway.service

Terminal window
# 查找占用端口的进程
sudo lsof -i:8080
# 或
sudo netstat -tlnp | grep 8080

Terminal window
# 查看内存使用情况
free -h
# 调整 JVM 内存参数
ExecStart=/usr/bin/java -Xms128m -Xmx256m -jar gateway.jar

Terminal window
# 确保应用用户有权限访问工作目录
sudo chown -R app:app /home/app/gateway
sudo chmod -R 755 /home/app/gateway

  1. 安全加固:使用专用用户运行,避免 root 权限
  2. 日志管理:配置日志轮转,防止磁盘占满
  3. 监控告警:结合 Prometheus + Grafana 监控服务状态
  4. 优雅停机:配置 TimeoutStopSig 确保请求处理完成
  5. 环境隔离:使用 ProtectSystemProtectHome 限制文件访问
  6. 资源限制:设置 LimitNOFILEMemoryMax 防止资源耗尽

评论