在實際部署 Spring Boot 項目的生產環境中,如何確保服務自動啟動(如開機自動運行、宕機自動恢復)是一項基礎而關鍵的運維能力。本文將系統介紹如何在 Linux 中將 Spring Boot 應用注冊為 systemd
服務,實現進程守護與自動啟動。
📌 為什么使用 systemd 管理 Spring Boot
相比傳統的 nohup
啟動方式,使用 systemd
有以下優勢:
自動啟動:系統啟動時自動拉起服務
異常重啟:服務異常退出后可自動重啟
統一日志管理:支持標準輸出日志與 GC 日志分離
安全資源限制:可定義 CPU、內存、文件數限制
進程守護:無需人工寫監控腳本
🧱 一、準備工作
1. 創建應用部署目錄結構(推薦)
/opt/nbsaas/
├── db/
│ ├── nbsaas-baison-db.jar
│ ├── start.sh
│ └── logs/
2. 編寫啟動腳本 start.sh
#!/bin/bashAPP_NAME="nbsaas-baison-db.jar"
JAR_PATH="/opt/nbsaas/db/$APP_NAME"
LOG_DIR="/opt/nbsaas/db/logs"mkdir -p $LOG_DIRJAVA_OPTS=""
JAVA_OPTS+=" -XX:+UseG1GC -XX:MaxGCPauseMillis=200"
JAVA_OPTS+=" -XX:+UseStringDeduplication"
JAVA_OPTS+=" -XX:+UseContainerSupport -XX:MaxRAMPercentage=50"
JAVA_OPTS+=" -Dfile.encoding=UTF-8 -Duser.timezone=Asia/Shanghai"
JAVA_OPTS+=" -Xlog:gc*:file=${LOG_DIR}/gc.log:time,level,tags"exec java $JAVA_OPTS -jar $JAR_PATH
?? 使用
exec
而非nohup
,確保systemd
能正確追蹤進程 PID。
?? 二、創建 systemd 服務文件
在 /etc/systemd/system/nbsaas-db.service
中創建如下內容:
[Unit]
Description=Nbsaas DB Service
After=network.target[Service]
Type=simple
User=root
WorkingDirectory=/opt/nbsaas/db
ExecStart=/opt/nbsaas/db/start.sh
ExecStop=/bin/kill -TERM $MAINPID
Restart=on-failure
RestartSec=5s
StandardOutput=append:/opt/nbsaas/db/logs/stdout.log
StandardError=append:/opt/nbsaas/db/logs/stderr.log[Install]
WantedBy=multi-user.target
說明:
字段 | 含義 |
---|---|
WorkingDirectory | 程序啟動目錄 |
ExecStart | 啟動命令(調用你自定義的腳本) |
Restart=on-failure | 非 0 退出時自動重啟 |
WantedBy=multi-user.target | 多用戶模式下自動啟動 |
🚀 三、啟動服務并設置開機啟動
# 重新加載 systemd 配置
sudo systemctl daemon-reload# 啟動服務
sudo systemctl start nbsaas-db.service# 查看狀態
sudo systemctl status nbsaas-db.service# 設置開機自啟動
sudo systemctl enable nbsaas-db.service
🔍 四、常見運維命令
# 查看日志
journalctl -u nbsaas-db.service -f# 停止服務
sudo systemctl stop nbsaas-db.service# 重啟服務
sudo systemctl restart nbsaas-db.service# 禁止開機啟動
sudo systemctl disable nbsaas-db.service
🧠 五、實用優化建議
項目 | 建議 |
---|---|
多服務部署 | 為每個服務單獨創建一個 service 文件 |
異常退出日志 | 可通過 stderr.log + journalctl 排查 |
內存控制 | 使用 -XX:MaxRAMPercentage=50 控制內存 |
安全用戶隔離 | 推薦使用非 root 用戶運行(可修改 User=xxx ) |
服務依賴 | 可配置 After=mysql.service 等依賴 |
? 六、自動重啟腳本和部署流程推薦
將多個服務統一寫成 systemd 服務,每個服務獨立部署目錄、獨立日志,便于問題快速排查與水平擴展。
建議結合 DevOps 工具鏈(如 Jenkins、Ansible)自動部署服務與注冊 systemd 文件。
?? 結語
通過將 Spring Boot 程序以 systemd 服務方式部署在 Linux 上,不僅提升了應用的穩定性和運維效率,也為后續自動化部署、彈性伸縮打下了堅實基礎。作為軟件架構師或運維工程師,應當將 systemd 部署方式納入標準交付規范。