這是一個針對 Ubuntu 系統優化的 .service 檔案範本,非常適合放在部落格中教學:
🐧 完美 Linux (Ubuntu) Systemd Service 範本
在 Ubuntu 伺服器上,我們會透過 systemd 來管理服務。這能確保你的應用程式在開機時自動啟動,並在崩潰時自動重新啟動。
1. 建立 Service 檔案
請在 /etc/systemd/system/ 目錄下建立一個以 .service 結尾的檔案,例如:my_rails_app.service。
Ini, TOML
[Unit]
Description=Rails Application Service (Ubuntu Optimized)
# 確保在網路與資料庫啟動後再啟動
After=network.target postgresql.service
[Service]
# --- 執行權限與路徑 ---
Type=simple
User=deploy
Group=deploy
WorkingDirectory=/var/www/my_rails_app/current
# --- 環境變數 ---
# 這裡建議使用絕對路徑,確保讀取正確的 Ruby 版本
Environment=RAILS_ENV=production
Environment=PORT=3000
# --- 啟動指令 ---
# 使用 bundle exec 啟動你的伺服器(如 Puma)
ExecStart=/home/deploy/.rbenv/shims/bundle exec puma -C /var/www/my_rails_app/shared/config/puma.rb
# --- 崩潰處理機制 ---
# 這是最核心的部分:崩潰後 5 秒自動重啟,並在 1 分鐘內嘗試 3 次
Restart=always
RestartSec=5
StartLimitIntervalSec=60
StartLimitBurst=3
# --- 日誌紀錄 ---
StandardOutput=append:/var/www/my_rails_app/shared/log/stdout.log
StandardError=append:/var/www/my_rails_app/shared/log/stderr.log
SyslogIdentifier=rails-app
[Install]
# 設定為多使用者模式下啟動(即正常開機流程)
WantedBy=multi-user.target
2. Ubuntu 常用管理指令
寫部落格時,提供讀者這幾行指令能大大提升實用性:
動作 指令 重新載入設定sudo systemctl daemon-reload
啟動服務
sudo systemctl start my_rails_app
開機自動啟動
sudo systemctl enable my_rails_app
檢查狀態
sudo systemctl status my_rails_app
查看即時日誌
journalctl -u my_rails_app -f
3. 為什麼這個範本適合 Ubuntu?
-
重啟機制(Self-Healing):
Restart=always確保了服務的穩定性,這在 Ubuntu 生產環境中是標準做法。 -
相依性管理:
After=network.target避免了伺服器剛開機、網路還沒通就急著啟動 App 導致報錯的問題。 -
日誌隔離: 透過
StandardOutput將日誌存放到特定路徑,方便以後排查問題,而不是全部塞進syslog。
💡 教學小筆記:
如果讀者使用的是 rbenv 或 rvm,
ExecStart的路徑必須寫成絕對路徑(例如/home/user/.rbenv/shims/bundle),否則系統會找不到bundle指令。
這個 Linux 版的 Service 範本對於要架設 Ubuntu 伺服器的開發者非常有幫助。