Apacheの高メモリ使用時に自動で再起動するスクリプト例を解説

Apacheは、多くのウェブサーバーで利用されている人気の高いソフトウェアですが、大規模なトラフィックや長時間の稼働によりメモリ消費が増加することがあります。特に、高負荷状態が続くとメモリ使用量が膨れ上がり、サーバー全体のパフォーマンスが低下することがあります。これを放置すると、応答が遅くなったり、最悪の場合サーバーがクラッシュするリスクがあります。

こうした状況を防ぐための一つの手段として、Apacheが一定以上のメモリを使用した際に自動で再起動するスクリプトを用いる方法があります。これにより、定期的にメモリを解放し、サーバーの安定稼働を維持することができます。

本記事では、Apacheのメモリ使用状況を確認する方法から、自動再起動を行うスクリプトの作成、実装手順、そして運用時の注意点までを具体的に解説します。Apacheを運用している方や、サーバー管理を担当している方にとって、有用な情報となるでしょう。

目次

Apacheのメモリ使用状況を確認する方法


Apacheのメモリ使用量を定期的に確認することは、サーバーの安定稼働を維持するために重要です。特に、Apacheのプロセスが増大しすぎると、サーバー全体のパフォーマンスに悪影響を及ぼします。以下では、Apacheのプロセスとそのメモリ使用量を確認するための具体的な方法を紹介します。

psコマンドを使用した確認方法


Linuxでは、psコマンドを使用してApacheのプロセス状況を確認できます。以下のコマンドは、Apacheのメモリ使用状況を一覧表示します。

ps aux | grep apache


または、httpdが使用されている環境では以下のようにします。

ps aux | grep httpd

このコマンドの出力には、各プロセスのCPU使用率やメモリ使用量が表示されます。%MEMがメモリ使用率を示します。

pmapコマンドを使用した詳細なメモリ確認


特定のApacheプロセスの詳細なメモリ状況を確認するには、pmapコマンドを使用します。

pmap <PID>

<PID>にはApacheプロセスのIDを指定します。プロセスIDは、psコマンドで確認できます。

topコマンドによるリアルタイム監視


リアルタイムでApacheのメモリ使用状況を監視する場合は、topコマンドが便利です。

top

topの画面でShift + Mを押すと、メモリ使用量が多いプロセス順に並び替えられます。Apacheプロセスが上位にある場合は、メモリ使用量が高いことが確認できます。

htopを使った視覚的な確認


htoptopよりも視覚的にプロセス管理がしやすいツールです。htopがインストールされていない場合は以下のコマンドでインストールします。

sudo apt install htop  # Debian系
sudo yum install htop  # RedHat系

起動後、htopでは色分けされたメモリバーが表示されるため、一目でApacheがどれだけメモリを消費しているか確認できます。

Apacheのメモリ使用状況を定期的に監視し、異常が発生していないかを確認することが、サーバー運用において重要です。次の項目では、Apacheが高メモリを消費する原因とその影響について掘り下げます。

高メモリ使用の問題とその影響


Apacheが過剰にメモリを消費することは、サーバー全体の安定性やパフォーマンスに深刻な影響を及ぼします。特に、複数のリクエストを処理するプロセスが増加すると、メモリ枯渇やスワップの発生により、応答遅延やサーバーダウンにつながる可能性があります。ここでは、高メモリ使用の主な原因とその影響について詳しく解説します。

Apacheが高メモリを消費する主な原因

1. 多数の同時接続


Apacheは同時接続数が増えると、それに伴いプロセスやスレッドが増加します。それぞれのプロセスがメモリを消費するため、大量の同時接続が続くとメモリ使用量が急増します。

2. 大量の静的・動的コンテンツ処理


画像、動画、PDFなどの大きな静的コンテンツを頻繁に提供する場合や、動的コンテンツ(PHPやCGIスクリプトなど)の処理が複雑な場合、Apacheは多くのメモリを使用します。

3. 長時間実行されるプロセス


メモリリークが発生している場合、プロセスが解放されずに徐々にメモリを消費し続けます。特に、PHPスクリプトやモジュールが原因となることが多いです。

4. 不適切なApache設定


MaxRequestWorkersKeepAliveTimeout の値が過剰に高い場合、必要以上にプロセスが保持され、メモリ消費が増加します。適切な値に設定しないと、無駄にメモリが消費されます。

高メモリ使用が与える影響

1. サーバーレスポンスの低下


メモリ使用率が高まると、サーバーの処理速度が低下し、レスポンスが遅くなります。これにより、ユーザーの満足度が低下する可能性があります。

2. サーバーダウンのリスク


メモリが不足するとスワップ領域が使用されますが、スワップが限界に達するとサーバーがクラッシュします。これにより、サービス全体が停止する恐れがあります。

3. 他のサービスへの影響


Apacheが大量のメモリを消費すると、同一サーバーで稼働しているデータベースやアプリケーションが必要なメモリを確保できず、パフォーマンスが低下します。

早期対応の重要性


高メモリ使用は、放置すると大きな障害へと発展します。そのため、定期的な監視と早期の自動再起動対応が不可欠です。次の項目では、Apacheの自動再起動スクリプトの概要と必要性について説明します。

自動再起動の概要と必要性


Apacheが高メモリを消費する状態を放置すると、サーバーのパフォーマンスが著しく低下し、最終的にはサービス停止に至る可能性があります。このような問題を防ぐために、自動でApacheを再起動する仕組みを導入することが効果的です。再起動によってメモリが解放され、安定したサーバー運用が可能になります。ここでは、自動再起動の概要とその必要性について解説します。

自動再起動の仕組み


自動再起動スクリプトは、Apacheのメモリ使用量を定期的に監視し、一定の閾値を超えた場合にApacheを自動的に再起動するよう設計されます。一般的な流れは以下の通りです。

  1. メモリ使用量の監視:Apacheプロセスのメモリ使用量を定期的に確認
  2. 閾値の設定:メモリ使用量が設定した閾値を超えた場合に再起動を実行
  3. 再起動の実施:Apacheを再起動してメモリを解放

自動再起動の必要性

1. 障害の未然防止


メモリ使用量が限界に達する前にApacheを再起動することで、サーバーダウンを防ぐことができます。これにより、ユーザーへの影響を最小限に抑えることが可能です。

2. サーバーの安定稼働


再起動によって不要なプロセスやメモリリークが解消され、サーバーのパフォーマンスが維持されます。特に、長時間稼働しているサーバーでは定期的な再起動が効果的です。

3. 管理の自動化による負担軽減


手動での監視や再起動は管理者にとって大きな負担となります。自動再起動スクリプトを導入することで、管理者の手間を省き、より重要な業務に集中できるようになります。

再起動の頻度と閾値の設定


閾値は、サーバーのメモリ容量やApacheの設定に応じて調整が必要です。一般的には、使用可能メモリの70~80%程度を閾値として設定することが推奨されます。また、1日のうちアクセスが少ない時間帯に定期的に再起動を行う設定も効果的です。

次の項目では、Apacheの自動再起動スクリプトの具体的な作成方法について詳しく解説します。

シェルスクリプトを使用した自動再起動の作成


Apacheの高メモリ使用を検出し、自動で再起動するシェルスクリプトを作成することで、サーバーの安定性を維持できます。ここでは、シンプルかつ効果的なスクリプトの例を紹介し、各部分の役割について詳しく解説します。

スクリプトの概要


このスクリプトは、psコマンドを使用してApacheのメモリ使用量を監視し、設定した閾値を超えた場合にApacheを自動的に再起動します。監視対象はhttpdまたはapache2プロセスです。

スクリプト例

#!/bin/bash

# 設定項目
THRESHOLD=500000  # メモリ使用量の閾値 (KB単位)
APACHE_SERVICE="apache2"  # Apacheのサービス名 (CentOSではhttpd)

# メモリ使用量の計測
MEM_USAGE=$(ps --no-headers -o rss -C $APACHE_SERVICE | awk '{sum+=$1} END {print sum}')

echo "Current Apache Memory Usage: $MEM_USAGE KB"

# 閾値を超えた場合の処理
if [ "$MEM_USAGE" -gt "$THRESHOLD" ]; then
  echo "Memory usage exceeds threshold. Restarting Apache..."
  systemctl restart $APACHE_SERVICE
  echo "Apache has been restarted."
else
  echo "Memory usage is within limits."
fi

スクリプトの解説

1. 設定項目


THRESHOLD はメモリ使用量の閾値を設定する部分です。サーバーの仕様に応じて調整します。APACHE_SERVICE には、環境に応じて apache2 もしくは httpd を設定してください。

2. メモリ使用量の取得

MEM_USAGE=$(ps --no-headers -o rss -C $APACHE_SERVICE | awk '{sum+=$1} END {print sum}')


この部分では、ps コマンドでApacheプロセスのメモリ使用量を合計し、awk で合計値を計算しています。

3. 再起動の条件分岐

if [ "$MEM_USAGE" -gt "$THRESHOLD" ]; then
  systemctl restart $APACHE_SERVICE
fi


メモリ使用量が閾値を超えた場合に systemctl restart コマンドでApacheを再起動します。再起動後にログを出力して、再起動が行われたことを記録します。

スクリプトの設置と実行権限の付与


作成したスクリプトは /usr/local/bin などに保存し、実行権限を付与します。

sudo chmod +x /usr/local/bin/apache_memory_check.sh

次の項目では、このスクリプトを cron ジョブで定期的に実行する方法について説明します。

cronジョブを使った定期実行の設定方法


作成したApache自動再起動スクリプトを定期的に実行することで、高メモリ使用の状況を自動的に監視・対応できます。cronを使用すれば、スクリプトを指定した間隔で実行でき、管理の手間を軽減できます。ここでは、cronジョブの設定方法を解説します。

cronジョブの基本


cronはLinuxで利用可能なタスクスケジューラで、決められた時間にコマンドやスクリプトを自動実行します。Apacheのメモリ監視スクリプトを1時間ごとに実行する設定を例に説明します。

cronジョブの設定手順

1. cronの編集画面を開く


以下のコマンドでcronジョブを編集します。

crontab -e

初めてcrontabを開く場合、使用するエディタを選択するプロンプトが表示されることがあります。vimnanoなど、使いやすいエディタを選択してください。

2. cronジョブの追加


ファイルの末尾に以下の行を追加します。

0 * * * * /usr/local/bin/apache_memory_check.sh >> /var/log/apache_memory_check.log 2>&1

この例では、毎時0分(1時間ごと)にスクリプトを実行し、実行結果を/var/log/apache_memory_check.logに記録します。
記述の意味は以下の通りです:

  • 0:毎時0分
  • *:毎時間
  • /usr/local/bin/apache_memory_check.sh:実行するスクリプト
  • >>:標準出力をログファイルに追記
  • 2>&1:エラー出力も標準出力に統合

3. cronジョブの確認


設定が正しく反映されたか確認します。

crontab -l

これで、設定したcronジョブの一覧が表示されます。

cronジョブの動作確認


cronジョブが正しく動作するかを即時確認したい場合は、手動でスクリプトを実行します。

/usr/local/bin/apache_memory_check.sh

エラーがないことを確認した後、ログファイルが更新されているかもチェックします。

cat /var/log/apache_memory_check.log

頻度の調整


スクリプトの実行頻度は以下のように調整可能です。

  • 30分ごと
  */30 * * * * /usr/local/bin/apache_memory_check.sh
  • 毎日午前3時
  0 3 * * * /usr/local/bin/apache_memory_check.sh
  • 週1回(日曜の午前3時)
  0 3 * * 0 /usr/local/bin/apache_memory_check.sh

注意点

  • 頻度が高すぎるとサーバーに負荷がかかるため、サーバーの状況に応じた間隔で設定してください。
  • cronジョブが正常に動作しない場合は、/var/log/syslog/var/log/cronを確認し、エラーが記録されていないか確認します。

次の項目では、スクリプトの動作テストとデバッグ方法について解説します。

スクリプトの動作テストとデバッグ方法


自動再起動スクリプトが正しく動作するかを確認することは、安定したサーバー運用のために重要です。誤動作や設定ミスがあると、必要ないタイミングでApacheが再起動されてしまう可能性があります。ここでは、スクリプトのテスト方法と、トラブルが発生した際のデバッグ方法について解説します。

スクリプトの動作テスト方法

1. スクリプトの手動実行


まずは手動でスクリプトを実行し、正常に動作するか確認します。

sudo /usr/local/bin/apache_memory_check.sh
  • 正常に動作していれば、「Memory usage is within limits.」もしくは「Restarting Apache…」と表示されます。
  • Apacheが再起動された場合は、以下のコマンドで状態を確認します。
sudo systemctl status apache2  # または httpd

再起動時間が更新されているか確認し、正しく処理されているかを確認します。

2. 意図的に閾値を低く設定してテスト


メモリ使用量の閾値を非常に低く設定し、確実にApacheが再起動されるようにします。

THRESHOLD=100  # 100KBに設定して確実に超える状態を作る

再度スクリプトを実行し、Apacheが再起動されることを確認します。テスト後は元の閾値に戻してください。

3. ログの確認


スクリプトの出力結果はログに記録されます。ログを確認して、想定通りの動作をしているかを確認します。

cat /var/log/apache_memory_check.log

ログの内容例:

Current Apache Memory Usage: 650000 KB
Memory usage exceeds threshold. Restarting Apache...
Apache has been restarted.

cronジョブの動作テスト

1. cronの即時実行


cronジョブが正しく動作しているか確認するには、ジョブの実行時間を短く設定します。例えば、1分ごとに実行する設定を追加します。

* * * * * /usr/local/bin/apache_memory_check.sh >> /var/log/apache_memory_check.log 2>&1
  • 1分後にログを確認し、スクリプトが実行されていることを確認します。
  • テスト後は元の頻度に戻します。

2. cronのログを確認


cronが正しく実行されているかをログで確認します。

grep CRON /var/log/syslog

該当のジョブが記録されているかを確認します。

デバッグ方法

1. スクリプトのエラー確認


スクリプトが正常に実行されていない場合、エラーメッセージを確認します。以下の方法でスクリプトの問題点を特定できます。

bash -x /usr/local/bin/apache_memory_check.sh
  • -xオプションにより、スクリプトが逐次実行され、どこでエラーが発生しているかが表示されます。

2. Apacheのエラーログ確認


Apache自体に問題がある場合は、以下のログも確認します。

cat /var/log/apache2/error.log  # Ubuntu/Debian
cat /var/log/httpd/error_log    # CentOS/RHEL

3. cronのエラー確認


cronが動作していない場合、syslogcronのログを確認します。

tail -f /var/log/syslog  # Ubuntu/Debian
tail -f /var/log/cron    # CentOS/RHEL

エラーが出ている場合は、スクリプトのパスや実行権限を再確認してください。

よくあるトラブルと解決法

  • Apacheが再起動しないsystemctl restart apache2 の部分が環境によって異なる可能性があります。httpdを使用している場合は apache2httpd に置き換えてください。
  • スクリプトが動作しないbashスクリプトに実行権限があるか確認します。
sudo chmod +x /usr/local/bin/apache_memory_check.sh

次の項目では、実運用環境での注意点とベストプラクティスについて解説します。

実運用環境での注意点とベストプラクティス


Apacheの自動再起動スクリプトを本番環境で運用する際には、いくつかの注意点と最適な方法があります。誤った設定や過剰な再起動は、サービスの安定性に悪影響を与える可能性があります。ここでは、安全で効果的にスクリプトを運用するためのポイントを解説します。

実運用での注意点

1. 再起動の頻度を適切に設定する


Apacheの再起動は、接続が途切れる原因になります。頻繁な再起動はサービスの安定性を損なうため、閾値や実行頻度を適切に設定することが重要です。

  • 閾値設定:メモリ使用量が実際にサーバーへ影響を与えるレベルに設定する(例:使用メモリの70~80%)。
  • 実行頻度:1時間に1回や1日数回など、必要最低限の間隔で実行する。

2. トラフィックが少ない時間帯に再起動する


高負荷時にApacheを再起動すると、ユーザー体験が低下します。

  • 深夜や早朝など、アクセスが少ない時間帯にスクリプトを実行するようにcronを設定します。
  • 例:
  0 3 * * * /usr/local/bin/apache_memory_check.sh


上記の設定で、午前3時に再起動が実施されます。

3. 事前の通知とログ記録


Apache再起動が発生した際に、通知やログ記録を行うことで再起動の理由や頻度を確認できます。

  • メール通知を追加:スクリプトにメール送信機能を追加し、再起動が行われた際に管理者に通知します。
  • ログファイルの活用/var/log内にスクリプトの実行履歴を残すことで、後から再起動状況を確認できます。
echo "Apache restarted at $(date)" >> /var/log/apache_memory_check.log

4. 依存サービスの考慮


Apacheの再起動は、他のサービスにも影響を与える場合があります。特に、データベースやキャッシュサービスと連携している場合は注意が必要です。

  • 再起動の順番を管理するか、依存サービスを一時停止せずにApacheだけを再起動するようにします。
sudo systemctl restart apache2

ベストプラクティス

1. 冗長化構成を利用する


負荷分散を行い、複数のApacheサーバーを運用している場合は、一台ずつ再起動することでサービスのダウンタイムを回避できます。

  • ロードバランサを導入し、再起動対象のApacheを一時的に切り離してから再起動する方法が有効です。

2. メモリ使用の根本的な原因を調査する


Apacheの高メモリ消費は、アプリケーションや設定が原因であることが多いため、スクリプトによる再起動だけでなく、根本的な問題解決を目指します。

  • ApacheのモジュールやPHP設定を見直し、不要なモジュールの無効化キャッシュ機能の強化を行います。
  • KeepAlive設定を最適化し、接続が長時間保持されないようにします。
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 5

3. アラートシステムと組み合わせる


Apacheのメモリ使用状況を監視ツール(NagiosやZabbixなど)と連携し、事前にアラートを受け取れるようにします。これにより、メモリ使用量が高まる前に手動で対応できます。

設定例:ApacheとZabbixの連携

zabbix_agentd.conf
UserParameter=apache.memory,ps --no-headers -o rss -C apache2 | awk '{sum+=$1} END {print sum}'


ZabbixでApacheのメモリ使用状況を監視し、閾値を超えた場合に自動再起動するアクションを設定できます。

スクリプトの改良


再起動の前にメモリ状況を詳しく記録し、再起動後に比較することで、再起動が有効であったかを確認できます。

#!/bin/bash
THRESHOLD=500000
APACHE_SERVICE="apache2"
MEM_USAGE=$(ps --no-headers -o rss -C $APACHE_SERVICE | awk '{sum+=$1} END {print sum}')
echo "$(date): Current Memory Usage: $MEM_USAGE KB" >> /var/log/apache_memory_check.log

if [ "$MEM_USAGE" -gt "$THRESHOLD" ]; then
  echo "$(date): Memory threshold exceeded. Restarting Apache..." >> /var/log/apache_memory_check.log
  systemctl restart $APACHE_SERVICE
  echo "$(date): Apache restarted." >> /var/log/apache_memory_check.log
fi

次の項目では、再起動スクリプトにログ記録や通知機能を追加する方法について詳しく解説します。

追加機能の拡張例(ログ記録や通知)


Apache自動再起動スクリプトにログ記録や通知機能を追加することで、再起動の履歴を確認したり、管理者に即座にアラートを送ることができます。これにより、障害対応が迅速に行え、問題が発生した際の状況把握が容易になります。ここでは、スクリプトの拡張例を紹介します。

ログ記録の追加


再起動スクリプトにログ記録機能を組み込むことで、Apacheのメモリ使用状況や再起動の履歴を記録できます。

スクリプトへのログ機能追加


以下のようにスクリプトを修正して、実行結果をログファイルに記録します。

#!/bin/bash

# 設定項目
THRESHOLD=500000  # メモリ使用量の閾値 (KB)
APACHE_SERVICE="apache2"
LOG_FILE="/var/log/apache_memory_check.log"

# メモリ使用量の計測
MEM_USAGE=$(ps --no-headers -o rss -C $APACHE_SERVICE | awk '{sum+=$1} END {print sum}')
DATE=$(date '+%Y-%m-%d %H:%M:%S')

# ログ記録
echo "$DATE - Current Apache Memory Usage: $MEM_USAGE KB" >> $LOG_FILE

# 閾値を超えた場合の処理
if [ "$MEM_USAGE" -gt "$THRESHOLD" ]; then
  echo "$DATE - Memory usage exceeds threshold. Restarting Apache..." >> $LOG_FILE
  systemctl restart $APACHE_SERVICE
  echo "$DATE - Apache has been restarted." >> $LOG_FILE
else
  echo "$DATE - Memory usage is within normal limits." >> $LOG_FILE
fi

ポイント解説

  • LOG_FILE 変数にログファイルのパスを設定し、すべての出力がそこに記録されます。
  • dateコマンドで実行日時を記録し、ログが時系列で整理されます。

メール通知機能の追加


メモリ使用量が閾値を超えてApacheが再起動された場合に、管理者にメール通知を送信する機能を追加します。

mailコマンドを使った通知機能


スクリプトに以下のコードを追加します。

EMAIL="admin@example.com"
SUBJECT="Apache Memory Alert on $(hostname)"
MESSAGE="Apache memory usage exceeded the threshold and was restarted on $(date)."

if [ "$MEM_USAGE" -gt "$THRESHOLD" ]; then
  echo "$MESSAGE" | mail -s "$SUBJECT" $EMAIL
fi

メール通知の設定手順

  1. mail コマンドがインストールされていない場合は、以下のコマンドでインストールします。
sudo apt install mailutils  # Debian系
sudo yum install mailx      # RedHat系
  1. メールが送信されるかテストします。
echo "Test message" | mail -s "Test Subject" admin@example.com

Slack通知機能の追加


Apache再起動の通知をSlackに送信することも可能です。SlackのWebhookを利用して、スクリプトから直接通知を送ります。

Slack通知スクリプト例

SLACK_WEBHOOK_URL="https://hooks.slack.com/services/XXXXX/YYYYY/ZZZZZ"
SLACK_MESSAGE="Apache memory usage exceeded on $(hostname). Apache was restarted at $(date)."

if [ "$MEM_USAGE" -gt "$THRESHOLD" ]; then
  curl -X POST -H 'Content-type: application/json' --data \
  "{\"text\":\"$SLACK_MESSAGE\"}" $SLACK_WEBHOOK_URL
fi

Webhookの取得方法

  1. Slackの「App管理」から、新しいWebhookを作成します。
  2. Webhook URLを取得し、スクリプトに設定します。
  3. テスト通知を送信して動作を確認します。
curl -X POST -H 'Content-type: application/json' --data '{"text":"Test message from server."}' https://hooks.slack.com/services/XXXXX/YYYYY/ZZZZZ

通知・ログ機能の効果

  • 障害対応が迅速化:Apacheの再起動が即座に通知されるため、予期せぬダウンタイムにも素早く対応できます。
  • 履歴の可視化:ログファイルにより、どの程度の頻度で再起動が行われているか確認できます。

次の項目では、スクリプトの改良方法や、再起動以外のメモリ対策について解説します。

まとめ


本記事では、Apacheが高メモリを使用した際に自動的に再起動するスクリプトの作成方法について解説しました。Apacheの安定稼働を維持するためには、定期的なメモリ使用状況の監視と、自動再起動の仕組みが有効です。

シェルスクリプトを用いてApacheのメモリ使用量を計測し、閾値を超えた場合に再起動するプロセスを紹介しました。また、cronジョブを活用してスクリプトを定期実行する方法や、スクリプトにログ記録や通知機能を追加する方法についても詳しく説明しました。

適切な閾値設定や通知システムの導入により、障害発生時の迅速な対応が可能となり、サーバーのダウンタイムを最小限に抑えることができます。本記事を参考に、自身の環境に合わせたスクリプトを構築し、Apacheの安定運用に役立ててください。

コメント

コメントする

目次