Spring Boot 服务后台运行(Systemd 管理)
以 Systemd 管理 Spring Boot 服务,包含 JDK 21 和 Spring Boot 3.x 的最新实践。
内容保鲜:本文已更新至 JDK 21 + Spring Boot 3.x 环境,新增虚拟线程、容器感知、安全加固等现代实践。
# 新建服务文件sudo vim /etc/systemd/system/gateway.service[Unit]Description=Gateway ServiceAfter=syslog.target network.target remote-fs.target nss-lookup.target# 添加依赖关系,确保在网络就绪后启动Wants=network-online.target
[Service]# 安全加固:使用专用用户运行(推荐)User=appGroup=app
# 工作目录WorkingDirectory=/home/app/gateway
# JDK 21 启动命令(推荐)ExecStart=/usr/bin/java \ -Xms256m -Xmx512m \ -XX:+UseZGC \ -Dspring.profiles.active=prod \ -jar gateway.jar
# 进程管理Restart=on-failureRestartSec=10sStartLimitBurst=5StartLimitIntervalSec=60
# 环境变量(可选)Environment=SPRING_PROFILES_ACTIVE=prodEnvironment=JAVA_HOME=/usr/lib/jvm/java-21-openjdk
# 日志配置StandardOutput=journalStandardError=journalSyslogIdentifier=gateway
# 资源限制(可选)LimitNOFILE=65536MemoryMax=1G
[Install]WantedBy=multi-user.target[Unit]Description=Gateway ServiceAfter=syslog.target network.target
[Service]User=appGroup=appWorkingDirectory=/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=60sKillMode=mixedKillSignal=SIGTERM
# 自动重启策略Restart=on-failureRestartSec=10sStartLimitBurst=5StartLimitIntervalSec=60
# 安全加固NoNewPrivileges=trueProtectSystem=strictProtectHome=trueReadWritePaths=/home/app/gateway/logsPrivateTmp=true
[Install]WantedBy=multi-user.target# 重载服务配置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:
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(低延迟) |
# 在 ExecStart 中添加虚拟线程参数ExecStart=/usr/bin/java \ -Xms256m -Xmx512m \ -XX:+UseZGC \ -Dspring.threads.virtual.enabled=true \ -jar gateway.jar| 特性 | Systemd | Docker |
|---|---|---|
| 部署复杂度 | 简单 | 需要学习曲线 |
| 资源占用 | 低 | 稍高 |
| 环境隔离 | 弱 | 强 |
| 可移植性 | 低 | 高 |
| 适合场景 | 单机部署、传统服务器 | 微服务、容器编排 |
建议:如果是单机部署且团队熟悉 Linux,优先使用 Systemd;如果是微服务架构或需要容器化,优先使用 Docker。
# 查看详细错误信息sudo journalctl -u gateway -n 50 --no-pager
# 检查配置文件语法sudo systemd-analyze verify /etc/systemd/system/gateway.service# 查找占用端口的进程sudo lsof -i:8080# 或sudo netstat -tlnp | grep 8080# 查看内存使用情况free -h
# 调整 JVM 内存参数ExecStart=/usr/bin/java -Xms128m -Xmx256m -jar gateway.jar# 确保应用用户有权限访问工作目录sudo chown -R app:app /home/app/gatewaysudo chmod -R 755 /home/app/gateway- 安全加固:使用专用用户运行,避免 root 权限
- 日志管理:配置日志轮转,防止磁盘占满
- 监控告警:结合 Prometheus + Grafana 监控服务状态
- 优雅停机:配置
TimeoutStopSig确保请求处理完成 - 环境隔离:使用
ProtectSystem和ProtectHome限制文件访问 - 资源限制:设置
LimitNOFILE和MemoryMax防止资源耗尽
- Ansible自动发布JavaWeb项目 - 使用Ansible自动发布Web项目到tomcat
- Tomcat配置HTTPS - Tomcat配置HTTPS证书