【Apache自動化講座 第2回】サーバーダウンを秒で検知!死活監視と自動復旧スクリプトの全貌

【Apache自動化講座 第2回】「サーバー落ちてますよ」と客に言われる屈辱をなくす

こんにちは!「リナックス先生」です。
前回は、Apacheの起動や停止を簡単にする管理スクリプトを作りました。
コウ君、その後サーバーの調子はどう?

コウ君

先生…聞いてくださいよ。
昨日の夜中、急にアクセスが増えたらしくて、朝起きたらApacheが止まってたんです!
SNSで「あのサイト落ちてる」って書かれてて、慌てて手動で再起動しましたけど、もっと早く気づければ…。

リナックス先生

それは災難だったわね。でも、エンジニアあるあるよ。
24時間365日、人間が画面を見張り続けるのは不可能。
だからこそ、今回は「Apacheが止まっていたら、勝手に再起動して、報告してくれるロボット」を作るわよ。
これがあれば、寝ている間にトラブルが解決していることもあるわ!

全3回のApache自動化講座、第2回のテーマは「監視と自動復旧」です。
サーバーが停止するダウンタイムを最小限に抑えるためのスクリプトを作成し、さらにサーバー停止の隠れた主犯である「ログの肥大化」を防ぐメンテナンス術も学びます。

本講座のカリキュラム(全3回)

AlmaLinux 9 (RHEL 9) 環境を前提に進めます。

  1. 基本操作の自動化:起動・停止スクリプトの作成と、変数・引数の活用
  2. 【今回】監視とメンテナンス:プロセス監視、ログの自動ローテーション、アラート通知
  3. 高度な自動化:バーチャルホスト作成の自動化と、設定ファイルの構文チェック

1. 「死活監視」とは何か?

サーバーやアプリケーションが正常に動いているかを確認することを「死活監視(Alive Monitoring)」と呼びます。
Webサーバーの場合、主に以下の2つの方法があります。

方法 チェック内容 難易度
ポート監視 外部から80番ポートにアクセスできるか?
curl コマンドなど)
プロセス監視 サーバー内部で httpd プロセスが存在するか?
systemctlpgrep コマンド)

今回は、サーバー内部で動くシェルスクリプトを作るので、より確実で簡単な「プロセス監視」を採用します。

プロセスの確認方法

RHEL 9 / AlmaLinux 9 では、systemctl is-active コマンドを使うのが最もスマートです。

# 動いている時
[root@localhost ~]# systemctl is-active httpd
active
[root@localhost ~]# echo $?
0

# 止まっている時
[root@localhost ~]# systemctl is-active httpd
inactive
[root@localhost ~]# echo $?
3

このように、「動いていれば終了ステータスが0、止まっていればそれ以外」になる性質を利用します。

2. 自動復旧スクリプトの作成

では、ロジックを組み立てましょう。

  1. Apacheが動いているかチェックする。
  2. 動いていれば、「正常」とログに残して終了。
  3. 止まっていたら、「異常検知」とログに残し、再起動を試みる。
  4. 再起動の結果を確認し、成功・失敗を記録する。

スクリプト作成 (httpd_monitor.sh)

[root@localhost ~]# vi ~/bin/httpd_monitor.sh

ソースコード:

#!/bin/bash

# ================================
# 設定エリア
# ================================
SERVICE="httpd"
LOG_FILE="/var/log/httpd_monitor.log"
DATE=$(date "+%Y-%m-%d %H:%M:%S")

# ================================
# ログ出力関数
# ================================
log() {
    echo "[$DATE] $1" >> "$LOG_FILE"
}

# ================================
# メイン処理
# ================================

# 1. ステータスチェック
systemctl is-active "$SERVICE" > /dev/null 2>&1

# 終了ステータス($?)が 0 なら正常稼働中
if [ $? -eq 0 ]; then
    # 正常時は何もせず終了(ログが膨大になるのを防ぐためコメントアウト推奨)
    # log "OK: $SERVICE is running."
    exit 0
else
    # 2. 異常検知時の処理
    log "WARNING: $SERVICE is DOWN! Trying to restart..."
    
    # 再起動を試みる
    systemctl restart "$SERVICE"
    
    # 3. 再起動結果の確認
    if [ $? -eq 0 ]; then
        log "RECOVERY: $SERVICE has been restarted successfully."
    else
        log "CRITICAL: Failed to restart $SERVICE! Please check manually."
        # ここでメール通知などを入れる(後述)
    fi
fi

権限付与:

[root@localhost ~]# chmod +x ~/bin/httpd_monitor.sh

動作テスト

わざとApacheを停止させて、スクリプトを実行してみましょう。

# わざと止める
[root@localhost ~]# systemctl stop httpd

# 監視スクリプト実行
[root@localhost ~]# ~/bin/httpd_monitor.sh

# ログ確認
[root@localhost ~]# cat /var/log/httpd_monitor.log
[2024-01-01 12:00:00] WARNING: httpd is DOWN! Trying to restart...
[2024-01-01 12:00:01] RECOVERY: httpd has been restarted successfully.

# ステータス確認(起動しているはず!)
[root@localhost ~]# systemctl is-active httpd
active
コウ君

おおお!勝手に生き返りました!
これでもう夜中に叩き起こされなくて済むんですね!

3. 緊急事態をメールで知らせる

自動復旧に成功したなら良いですが、設定ミスなどで「再起動しても直らない」場合が一番怖いです。
そんな時は管理者にメールを飛ばすようにしましょう。

※VPSからメールを送るには mailx (s-nail) パッケージが必要です。

[root@localhost ~]# dnf install s-nail

スクリプトへの追記

先ほどのスクリプトの CRITICAL の部分を以下のように書き換えます。

    else
        log "CRITICAL: Failed to restart $SERVICE! Please check manually."
        
        # メール送信処理
        # 件名: [Alert] Server Error
        # 本文: ログの最後の1行
        # 宛先: admin@example.com (自分のメアドに変えてね)
        
        tail -n 1 "$LOG_FILE" | mail -s "[Alert] $SERVICE Down on $(hostname)" admin@example.com
    fi
リナックス先生

最近のVPSやクラウドでは、迷惑メール対策で25番ポートが塞がれていて、これだけではメールが届かないこともあるわ。
その場合は、GmailのSMTPサーバー経由で送る設定をするか、SlackやDiscordのWebhookを使って通知する方法が主流ね。
(※Slack通知については「curlコマンド」を使うと簡単よ)

4. Cronで定期実行する

スクリプトを作っても、人間が手動で実行していたのでは意味がありません。
Cron(クーロン)を使って、1分ごとにこの監視スクリプトが走るように設定します。

[root@localhost ~]# crontab -e

エディタが開いたら、以下の1行を追記して保存します。

# 1分ごとに監視スクリプトを実行
* * * * * /root/bin/httpd_monitor.sh > /dev/null 2>&1

これで、「1分間隔でApacheを見張り、落ちていたら即蘇生させるシステム」の完成です。

5. もう一つの脅威:ログの肥大化とlogrotate

さて、これで安心…と思いきや、もう一つサーバーを停止させる大きな要因があります。
それが「アクセスログの肥大化によるディスク容量不足」です。

Apacheは、アクセスがあるたびに /var/log/httpd/access_log に記録し続けます。
放置するとこのファイルが数GB、数TBになり、ディスクがいっぱいになってサーバーが止まります。

コウ君

ええっ!? ログって勝手に消えないんですか?
僕のサーバー、ディスクが20GBしかないからすぐ埋まっちゃいます!

救世主「logrotate(ログローテート)」

Linuxには、ログを定期的に新しいファイルに切り替え、古いものを削除してくれる logrotate という仕組みが標準で入っています。
AlmaLinux 9 の場合、Apache用の設定ファイルは /etc/logrotate.d/httpd にあります。

中身を見てみましょう。

[root@localhost ~]# cat /etc/logrotate.d/httpd
/var/log/httpd/*log {
    missingok
    notifempty
    sharedscripts
    delaycompress
    postrotate
        /bin/systemctl reload httpd.service > /dev/null 2>/dev/null || true
    endscript
}

デフォルトでは詳細な設定が書かれていない(全体設定 /etc/logrotate.conf に従う)ことが多いです。
より安全に運用するために、以下のように書き換えることを推奨します。

推奨設定例

/var/log/httpd/*log {
    daily           # 毎日ローテーションする
    rotate 30       # 30日分(30世代)保存する
    missingok       # ログがなくてもエラーにしない
    notifempty      # ログが空なら何もしない
    compress        # 古いログはgzip圧縮して容量節約
    delaycompress   # 1つ前のログは圧縮せず残す
    sharedscripts
    postrotate
        # ローテート後にApacheに「新しいファイルに書き込んでね」と教える
        /bin/systemctl reload httpd.service > /dev/null 2>/dev/null || true
    endscript
}

これで、「毎日新しいファイルに切り替わり、30日前の古いログは自動で消える」ようになります。
圧縮オプション(compress)をつけることで、ディスク容量を劇的に節約できます。

まとめ:24時間戦うための自動化

第2回では、サーバーの安定稼働に欠かせない2つの仕組みを作りました。

  • 死活監視スクリプト: プロセスを常に見張り、ダウン時に自動復旧させる。
  • logrotate設定: ログの肥大化を防ぎ、ディスクあふれを回避する。

これらは、プロのインフラエンジニアがサーバーを構築する際、最初に必ず設定する項目です。
「動けばいい」ではなく「動き続ける」システムを作ることが、信頼への第一歩です。

次回予告:面倒な設定作業をコマンド一発で

サーバーは落ちなくなりましたが、Webサイトの運営には「新しいドメインを追加する」といった作業が発生します。
Apacheでバーチャルホストを追加するには、ディレクトリを作って、権限を変えて、設定ファイルを書いて、再起動して…と手順が盛りだくさん。

次回、最終回は「バーチャルホスト自動追加スクリプト」を作成します。
add_vhost.sh example.com と打つだけで、Web公開ディレクトリから設定ファイルまで全自動で生成する「魔法の杖」を作りましょう!

リナックス先生

次回までに、logrotateの設定ファイルを開いてみて、自分のサーバーが何日分のログを保存する設定になっているか確認してみてね。
デフォルトのままだと、意外とすぐに容量がいっぱいになっちゃうかもよ?

▼監視スクリプトのテストに最適!おすすめVPS

【2026年最新】Linuxサーバー構築におすすめのVPS比較3選!現役エンジニアが速度とコスパで厳選
Linuxの勉強、まだ「自分のPC」でやって消耗していませんか?「Linuxを覚えたいけど、環境構築でエラーが出て先に進めない…」「VirtualBoxを入れたらパソコンが重くなった…」これは、Linux学習を始める9割の人がぶつかる壁です...

コメント