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 #サービス管理 #自動起動