VPS systemdサービス設定ガイド

自作アプリをsystemdで自動起動・管理する手順。


systemdとは

Linuxのサービス管理システム。アプリを:

  • サーバー起動時に自動起動
  • クラッシュ時に自動再起動
  • ログ管理

手順

01. サービスファイル作成

sudo nano /etc/systemd/system/myapp.service

02. 設定を記述

[Unit]
Description=My Python App
After=network.target

[Service] Type=simple User=myuser WorkingDirectory=/home/myuser/myproject ExecStart=/home/myuser/myproject/venv/bin/python app.py Restart=always RestartSec=3

[Install] WantedBy=multi-user.target

03. systemd再読み込み

sudo systemctl daemon-reload

04. サービス起動

sudo systemctl start myapp

05. 自動起動有効化

sudo systemctl enable myapp

06. 状態確認

sudo systemctl status myapp
active (running) ならOK。

07. 完了


参考リンク


ここから先は、設定の詳細とトラブル対応を解説します。


Q&A - 基本操作

起動・停止・再起動

sudo systemctl start myapp
sudo systemctl stop myapp
sudo systemctl restart myapp

設定再読み込み(ダウンタイムなし)

sudo systemctl reload myapp

※アプリがreloadに対応している場合のみ

自動起動の有効/無効

sudo systemctl enable myapp   # 有効化
sudo systemctl disable myapp  # 無効化

Q&A - ログ確認

ログを見る

journalctl -u myapp

リアルタイムで見る

journalctl -u myapp -f

最新100行

journalctl -u myapp -n 100

今日のログ

journalctl -u myapp --since today

Q&A - 設定オプション

環境変数を設定

[Service]
Environment="API_KEY=xxxxx"
Environment="DEBUG=false"

または外部ファイル:

[Service]
EnvironmentFile=/home/myuser/myproject/.env

再起動の条件

Restart=always          # 常に再起動
Restart=on-failure      # 失敗時のみ
Restart=no              # 再起動しない

起動順序の指定

[Unit]
After=network.target postgresql.service
Requires=postgresql.service

Q&A - トラブル

「Failed to start」

1. ログを確認:

journalctl -u myapp -n 50

2. 手動で実行してエラー確認:

/home/myuser/myproject/venv/bin/python app.py

パスが見つからない

フルパスを使用する。~は展開されない。

# NG
ExecStart=~/myproject/venv/bin/python app.py

OK

ExecStart=/home/myuser/myproject/venv/bin/python app.py

権限エラー

User=で指定したユーザーに必要な権限があるか確認。
ls -la /home/myuser/myproject/

Q&A - 実用例

Gunicorn(Python WSGI)

[Service]
ExecStart=/home/myuser/myproject/venv/bin/gunicorn -w 4 -b 127.0.0.1:5000 app:app

Node.js

[Service]
ExecStart=/usr/bin/node /home/myuser/myproject/server.js

タグ: #systemd #Linux #VPS #サービス管理 #自動起動
← VPS構築シリーズ一覧へ