コース一覧
サーバー運用実践:セキュリティ・監視・デプロイ
systemdタイマー

サーバー運用実践:セキュリティ・監視・デプロイ

構築済みのnginxサーバーを、専用ユーザー・SSH鍵認証・ufwで保護し、HTTPS化、ログとヘルスチェックの監視、systemdタイマー、リリース切替、ロールバック、障害復旧までを実践します。本番を想定した安全な公開・監視・デプロイの基本を身につける30レッスンのコースです。

1
セキュリティのきほん
01. 専用ユーザーで動かす16分
02. SSH鍵認証16分
03. sshdを固める16分
04. ufwファイアウォール16分
05. ポートの棚卸し16分
06. ミッション サーバーを固める16分
07. 第4章クイズ12分
2
HTTPS
01. HTTPSとTLSのしくみ16分
02. 自己署名証明書を作る16分
03. nginxにHTTPSを設定16分
04. HTTPからのリダイレクト16分
05. ミッション HTTPS化完了16分
06. 第5章クイズ12分
3
運用と監視
01. tmuxで多重端末16分
02. ログローテーション16分
03. エラーログ監視16分
04. ヘルスチェック16分
05. systemdタイマー16分
06. ミッション 監視の自動化16分
07. 第6章クイズ12分
4
デプロイ
01. デプロイの型16分
02. シンボリックリンク16分
03. deploy.sh v216分
04. ロールバック16分
05. ミッション ワンコマンドデプロイ16分
06. 第7章クイズ12分
5
総合制作
01. ゼロから構築ミッション16分
02. 障害対応演習16分
03. 自由拡張16分
04. 完成と次のステップ16分

systemdタイマー

打たなくても回るようにする

前のレッスンで、死活を判定して記録するスクリプトができました。あとは、これを決まった間隔で勝手に走らせるだけです。

Linux で定期実行といえば長く cron でしたが、systemd を使うサーバーではタイマーという別のやり方があります。2章で .service を書いたので、下地はもうできています。

cron との違い

cron でも同じことはできます。それでもタイマーを選ぶ理由は次のとおりです。

  • 実行の記録が journalctl に残る。cron はメールに送るのが既定で、届かないと消える
  • systemctl list-timers で、次にいつ動くかを一覧で見られる
  • サーバーが止まっていて実行を逃したぶんを、起動後に取り戻せる
  • 失敗したときの扱いを .service 側に書ける

2章から使ってきた systemctl と journalctl が、そのまま定期実行にも効く。道具が1つで済むのがいちばんの利点です。

2つのファイルで1組

タイマーは何をするかといつするかを分けて書きます。

ini

[Unit]
Description=Run healthcheck

[Service]
Type=oneshot
ExecStart=/root/bin/healthcheck.sh

これが /etc/systemd/system/healthcheck.service です。2章で書いた .service とほぼ同じですが、Type=oneshot が違います。走って終わる処理だという宣言で、常駐しないので終わっても「落ちた」とは扱われません。[Install] も要りません。自分では起動せず、タイマーから呼ばれるだけだからです。

ini

[Unit]
Description=Run healthcheck periodically

[Timer]
OnCalendar=*:0/2
Persistent=true

[Install]
WantedBy=timers.target

これが /etc/systemd/system/healthcheck.timer です。拡張子の前の名前を揃えるのが決まりで、healthcheck.timer は自動的に healthcheck.service を呼びます。

いつ動かすかの書き方

OnCalendar は時刻を指定する書き方です。

  • *:0/2 — 2分ごと
  • hourly — 毎時 0 分
  • daily — 毎日 0 時
  • Mon *-*-* 09:00:00 — 毎週月曜の 9 時

Persistent=true は、止まっていて逃した回のぶんを起動後すぐに走らせる指定です。日次のバックアップのように「1日1回は必ず」という処理で効きます。

有効にして確かめる

2章と同じ手順です。ファイルを置いたら読み直させます。

ターミナル

systemctl daemon-reload
systemctl enable --now healthcheck.timer

有効にするのは .timer のほうです。.service を enable してしまうと、起動のたびに1回走るだけの設定になります。ここも取り違えの多いところです。

ターミナル

systemctl list-timers healthcheck.timer
# NEXT                        LEFT     LAST  PASSED  UNIT             ACTIVATES
# Sat 2026-08-08 12:02:00 UTC 1min 30s -     -       healthcheck.timer healthcheck.service

NEXT が次の実行時刻です。ここが空なら、タイマーは動いていません。

待たずに中身だけ試したいときは、.service のほうを直に走らせます。

ターミナル

systemctl start healthcheck.service
journalctl -u healthcheck.service -n 20 --no-pager

タイマーの設定と、中身が正しいかは別々に確かめる。この切り分けができると、動かないときに迷いません。

手を動かす

ヘルスチェックを呼ぶ .service と .timer を書き、2分ごとに回る状態にします。

ヒント

enable するのは .timer のほうです。.service を enable すると起動時に1回走るだけになります

動かないときは、タイマーの設定と中身の正しさを別々に確かめてください

  • 1. healthcheck.service を書く。Type=oneshot と ExecStart=/root/bin/healthcheck.sh を入れる
  • 2. healthcheck.timer を書く。OnCalendar=*:0/2 と Persistent=true、WantedBy=timers.target を入れる
  • 3. systemctl daemon-reload で読み直させる
  • 4. systemctl enable --now healthcheck.timer で有効にする
  • 5. systemctl list-timers healthcheck.timer > /root/timers.txt で次の実行時刻を保存する
  • 6. systemctl start healthcheck.service で中身も直に試す

Linux は使うときに起動します(初回は約102MB通信します)

10 項目で採点します