シンプルなWebサーバーサービス

シンプルなWebサーバープロセスのためのsystemdサービスユニットファイルを作成します。simpleサービスタイプ、基本的な依存関係、systemdがフォアグラウンドプロセスを管理する方法について学びます。

Simple Services

詳細な説明

systemdでWebサーバーを実行する

最も一般的なsystemdサービスタイプはsimpleです。Type=simpleを設定すると、systemdはExecStartプロセスが起動した時点でサービスが開始されたと見なします。プロセスはフォアグラウンドに留まる必要があり、fork()やデーモン化を行ってはいけません

[Unit]
Description=My Web Server
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/bin/my-webserver --port 8080
Restart=on-failure
RestartSec=5
User=www-data
Group=www-data

[Install]
WantedBy=multi-user.target

主要ディレクティブの解説

  • After=network.target: サービス開始前にネットワークスタックが初期化されることを保証します。ハード依存関係は作成しません — そのためにはRequires=を使用します。
  • Type=simple: デフォルトのタイプ。ExecStartで起動されるプロセスがメインサービスプロセスです。systemdはそのPIDを追跡し、直接監視します。
  • Restart=on-failure: プロセスが非ゼロの終了コードで終了した場合、またはシグナルで終了された場合に自動的に再起動します(コード0の正常終了は除く)。
  • RestartSec=5: システムを圧迫する高速な再起動ループを防ぐため、再起動の試行間に5秒待機します。
  • User=www-data: 最小権限の原則に従い、www-dataユーザーとしてプロセスを実行します。

Simpleタイプを使用する場面

アプリケーションが以下の条件を満たす場合にType=simpleを使用します:

  • フォアグラウンドで実行し、forkしない
  • 起動後すぐに接続を受け付ける準備ができる
  • 最新のアプリケーション(Goバイナリ、Node.js、フォアグラウンドモードのPython with Gunicorn)

サービスのライフサイクル

  1. systemctl start mywebserver → systemdがExecStartを実行
  2. プロセスがフォアグラウンドに留まる → systemdがPIDを追跡
  3. プロセスがクラッシュ → systemdが終了を検出し、RestartSec待機後に再起動
  4. systemctl stop mywebserver → systemdがSIGTERMを送信、TimeoutStopSec待機後にSIGKILL

ユースケース

フォアグラウンドで実行し、障害時の自動再起動と適切なユーザー分離が必要な軽量Webサーバー(Go HTTPサーバーや静的ファイルサーバーなど)をデプロイする場合に使用します。

試してみる — Systemd Unit File Generator

フルツールを開く