こんにちは。😺
カスタマーサクセス部の山本です。
12月25 日の記事です。メリークリスマス!😀
Qiita のアドベントカレンダー、25 日目のお題です。
- 背景
- 関連ブログ
- ドキュメント
- 前提
- Apache のインストール
- mod_statusを有効化
- collectd をインストール
- collectd の apache プラグインをインストール
- collectd の設定・起動
- CloudWatch Agent 側の設定変更
- 確認
- 留意点
- まとめ
- 余談
背景
2日くらい前に、以下の記事を執筆しました。
Amazon Linux 2023 のストレージ空き容量を CloudWatch Agent で監視する。 - サーバーワークスエンジニアブログ
その際に公式ドキュメントを読んでいると、
サーバー上の Apache の統計情報を、 CloudWatch メトリクスとして取得できることを発見しました。
具体的には、mod_status
モジュールの出力する Apache HTTP Server の統計情報を CloudWatch のメトリクスにできるようです。
関連ブログ
調べてみると、CloudWatch エージェントで collectd を使用して、ロードアベレージを取得する弊社のブログ記事がありました。
CloudWatchとcollectdでLoadAverageのグラフを作成する - サーバーワークスエンジニアブログ
ドキュメント
- AWS のドキュメント:collectd を使用してカスタムメトリクスを取得する - Amazon CloudWatch
- collectd のドキュメント:collectd | The system statistics collection daemon
- collectd の apache プラグイン:collectd.conf(5) | collectd
- collectd の Github リポジトリ:GitHub - collectd/collectd: The system statistics collection daemon. Please send Pull Requests here!
- mod_status:mod_status - Apache HTTP サーバ バージョン 2.4
前提
- Amazon Linux 2023
- ami-023ff3d4ab11b2525
- al2023-ami-2023.6.20241121.0-kernel-6.1-x86_64
- ami-023ff3d4ab11b2525
- CloudWatch エージェントがインストールされていること
Apache のインストール
検証のため、まず Apache のインストールをします。
インストール:sudo yum install httpd
Apache 有効化:systemctl enable httpd
確認:sudo systemctl status httpd
Apache 起動:sudo systemctl start httpd
確認:sudo systemctl status httpd
localhost に curl すると、It works
と返るようになりました。
curl http://localhost/
mod_status
を有効化
mod_status
は、Apache HTTP Server におけるモジュールの一つで、パフォーマンスやリソース使用状況を監視するための便利なインターフェースを提供します。
CloudWatch Agent と連携する collectd では、この mod_status
の情報をメトリクスにします。
sudo vi /etc/httpd/conf/httpd.conf
ファイル末尾に以下を追記
ExtendedStatus on <IfModule mod_status.c> <Location /mod_status> SetHandler server-status </Location> </IfModule>
mod_status
を有効にします。
Apache 再起動:sudo systemctl restart httpd
確認:sudo systemctl status httpd
パス /mod_status
に、クエリ auto
を付与して curl すると、統計情報を取得できるようになりました。
curl localhost/mod_status?auto
collectd をインストール
mod_status
の情報を CloudWatch Agent に連携するパイプ役を担う collectd をインストールします。
sudo yum install collectd
collectd の apache プラグインをインストール
collectd が mod_status
の情報を CloudWatch Agent に連携するには、 apache プラグインも必要です。
sudo yum -y install collectd-apache
collectd の設定・起動
collectd の設定ファイルを編集します。
sudo vi /etc/collectd.conf
94行目に LoadPlugin apache
のコメントアウト部分などもありますが、分かりにくいので、ファイル末尾にまとめて追記します。
LoadPlugin logfile <Plugin "logfile"> LogLevel info File "/var/log/collectd.log" Timestamp true PrintSeverity false </Plugin> LoadPlugin apache <Plugin "apache"> <Instance "localhost"> URL "http://127.0.0.1/mod_status?auto" </Instance> </Plugin> LoadPlugin network <Plugin network> <Server "127.0.0.1" "25826"> SecurityLevel "Encrypt" Username "user" Password "secret" </Server> </Plugin>
1 行目:LoadPlugin logfile
collectd のログを有効にします。
/var/log/collectd.log
に出力します。
9 行目:LoadPlugin apache
Apache HTTP Server の mod_status
モジュールの情報を collectd で取得します。
http://127.0.0.1/mod_status?auto
にアクセスし、情報を取得します。
16 行目:LoadPlugin network
CloudWatch エージェントが udp://127.0.0.1:25826
で待ち受けているため、送信先に指定します。
Username
と Password
で認証するようにします。
collectd の起動
collectd を有効化し起動します。
collectd 有効化:sudo systemctl enable collectd
collectd 起動:sudo systemctl start collectd
確認:systemctl status collectd.service
/var/log/collectd.log
に Initialization complete, entering read-loop.
と出ていれば正常に起動しています。
CloudWatch Agent 側の設定変更
CloudWatch Agent が参照するユーザー・パスワードのファイルを作成します。
collectd の network プラグインに指定したUsername
と Password
と同一のものを記載します。
vi /etc/collectd.d/auth_file
user: secret
CloudWatch エージェント の設定ファイル用ディレクトリに、collectd 用の設定ファイルを追加します。
vi /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.d/collectd_20241225
{ "metrics":{ "metrics_collected": { "collectd": { "collectd_security_level":"encrypt", "collectd_auth_file":"/etc/collectd.d/auth_file", "metrics_aggregation_interval": 60 } } } }
CloudWatch Agent を再起動します。
sudo systemctl restart amazon-cloudwatch-agent
CloudWatch Agent のログを見ると、正しく読み込まれたようです。
vi /opt/aws/amazon-cloudwatch-agent/logs/amazon-cloudwatch-agent.log
読み込まれた複数のコンフィグファイルは、以下のファイルに yaml 形式でまとめられています。
vi /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.toml
CloudWatch エージェントは、udp://127.0.0.1:25826
で collectd からの情報をリッスンしています。
確認
CloudWatch メトリクスの CWAgent
名前空間に、mod_status
の提供するメトリクスが出ています。
ワーカーの状態に関するメトリクス
メトリクス | 説明 |
---|---|
Waiting | ワーカーは新しい接続を待機中です。 |
Sending | ワーカーはクライアントに応答を送信中です。 |
Open | 接続が開いている状態です。 |
Starting | ワーカーが起動中です。 |
Idle Cleanup | アイドル状態で不要なリソースをクリーンアップ中です。 |
KeepAlive | Keep-Alive接続を維持しています。 |
Closing | 接続を閉じている状態です。 |
Reading | クライアントからのリクエストを読み込み中です。 |
DNS Lookup | DNSルックアップを実行中です。 |
Logging | ログを記録中です。 |
Finishing | ワーカーが優雅に終了中です。 |
これらの状態を確認して、Apache のワーカープロセスを増やすか、サーバーのスペックを上げるか、などの検討ができます。
"metrics_aggregation_interval": 60
に設定しているので、1 分間隔のメトリクスまでドリルダウンして見れます。
Apache の状態に関するメトリクス
メトリクス | 説明 |
---|---|
apache_idle_workers | アイドル状態のワーカーの数を示します。 |
apache_bytes | 送受信したデータの総バイト数を示します。 |
apache_connections | 現在アクティブな接続の総数を示します。 |
apache_requests | 処理したリクエストの総数を示します。 |
Apache HTTP Server 全体の負荷状況が分かります。
留意点
/var/log/collectd.log
のローテーションなど、collectd が起因して、メモリやストレージを圧迫する可能性があるので、要注視かなと思います。
まとめ
collectd
を用いて Apache の統計情報を集約し、CloudWatch Agent を介して AWS CloudWatch にメトリクスを送信する手順を書いてみました。
- Apache のセットアップと
mod_status
の有効化:- Apache をインストールし、
mod_status
を有効化することで、サーバーの状態情報を取得可能にしました。
- Apache をインストールし、
- collectdの導入:
collectd
とapache
プラグインをインストールし、Apache のパフォーマンスデータを収集する設定を行いました。
- CloudWatch Agent の設定:
collectd
からのデータを CloudWatch Agent が受信し、AWS CloudWatch にメトリクスとして送信するための設定を行いました。
- CloudWatch メトリクスの確認:
- CloudWatchの
CWAgent
名前空間に、Apache のワーカー状態や全体の統計情報が正しくメトリクスとして表示されていることを確認しました。
- CloudWatchの
Apache の各ワーカーの状態や Apache 全体のパフォーマンスメトリクスを監視することで、サーバーリソースの最適化に役立てることができそうです。
余談
そろそろ雪山登山に行きたいです。
山本 哲也 (記事一覧)
カスタマーサクセス部のエンジニア。2024 Japan AWS Top Engineers に選んでもらいました。
今年の目標は Advanced Networking – Specialty と Machine Learning - Specialty を取得することです。
山を走るのが趣味です。今年の目標は 100 km と 100 mile を完走することです。 100 km は Gran Trail みなかみで完走しました。OSJ koumi 100 で 100 mile 砕け散りました。どこかで 100 mile やりたいです。
基本的にのんびりした性格です。座右の銘は「いつか着く」