Elastic StackでNGINX Webサーバーを監視する方法
この記事では、Elastic Stackのさまざまなコンポーネントを使用してNGINXを監視する方法について説明します。データ収集にはMetricbeatとFilebeatを使用します。そのデータはElasticsearchに送信されて保存されます。そして最後に、そのデータをKibanaで確認します。
Metricbeatは、接続(アクティブ、対応済み、受け入れ済みなど)に関するデータとクライアントリクエストの総数を収集します。Filebeatは、アクセスおよびエラーログに関するデータを収集します。有用性はさまざまなセットアップによって変わりますが、ほとんどの場合において、これらの情報は次のような特定の状況を推定するために使用できます。
- 特定のリソースでのエラーログの急増は、まだ必要なリソースを削除してしまったことを示している可能性があります。
- アクセスログでサービスのピーク時間が把握できます(つまり、メンテナンスなどの実行に最適なタイミングが分かります)。
- クライアントリクエストの急増は、悪意のある行為(DDoS攻撃など)を示している可能性があります。
この記事の重要ポイントは監視機能であるため、Elasticsearchのセットアップなどについては手短に説明します。ここではMacを使用するため、Elasticsearch、Metricbeat、Filebeat、およびKibanaのMacディストリビューションを使用します。その他のプラットフォーム用のディストリビューションについては、ダウンロードページから取得できます。
Elasticsearchのインストール
MetricbeatおよびFilebeat(実際にはすべてのBeats)は、データを保存するためにElasticsearchクラスターが必要です。ここでは、ローカルにシンプルなElasticsearchクラスターをセットアップします。Elasticsearchを外部に露出させることがないため、セキュリティ設定の時間は不要です。
手順1:Elasticsearchをダウンロード
curl -L -O https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.1.0-darwin-x86_64.tar.gz
手順2:アーカイブを解凍
tar -xvf elasticsearch-7.1.0-darwin-x86_64.tar.gz
手順3:binディレクトリに変更
cd elasticsearch-7.1.0/bin
手順4:単一ノードクラスターを起動
./elasticsearch
デフォルトでは、クラスターはlocalhost:9200
で実行されます。
NGINXの実行
NGINXを実行する方法は多数あります。ホストでのスタンドアローン、Dockerコンテナー経由、Kubernetesセットアップ内などです。BeatsにはコンテナーAPIイベントをリッスンして、サーバーコンテナーのスピンアップや削除を追跡する自動探知機能があります。
NGINXのセットアップおよび構成方法は多数ありますが、この記事ではさまざまな想定を行うのではなく、ホスト構成と自動探知(ここではDocker)の例について説明します。
MetricbeatとFilebeatの構成
それでは、Beatsを構成してデータの収集と送信を開始しましょう。
Metricbeat
メトリックの収集にMetricbeatを使用します。
手順1:Metricbeatをダウンロード
curl -L -O https://artifacts.elastic.co/downloads/beats/metricbeat/metricbeat-7.1.0-darwin-x86_64.tar.gz
手順2:アーカイブを解凍
tar -xvf metricbeat-7.1.0-darwin-x86_64.tar.gz
手順3:ディレクトリを変更
cd metricbeat-7.1.0-darwin-x86_64
次は構成です。
デフォルトでは、構成ファイル(metricbeat.yml)はlocalhost:9200で実行されているElasticsearchクラスターを検索します。これは先ほど構成したものです。
手順4:該当するMetricbeatモジュールを有効化
デフォルトでは、システムレベルのメトリックのみが収集されます。
./metricbeat modules enable nginx
手順5:ファイル所有権を変更
Metricbeatをルートとして実行するため、ファイルの所有権をいくつか変更する必要があります(または、コマンドラインから--strict.perms=falseオプションを使用して、厳密なパーミッションチェックを無効化することもできます)。
sudo chown root metricbeat.yml sudo chown root modules.d/system.yml sudo chown root modules.d/nginx.yml
手順6:メトリックセットを有効化
modules.d/nginx.yml
ファイルを開くとstubstatus
メトリックセットを有効化できます。そのためには以下のコメントアウトを解除します。
#metricsets: # - stubstatus
このメトリックセットはNGINX ngx_http_stub_statusモジュールからのデータを収集するため、メトリックセットが機能するようにこのNGINXモジュールが構成されていることが重要です。
ここで、監視対象のホストを変更することもできます。デフォルトでは<a href="http://127.0.0.1">http://127.0.0.1</a>
が監視されます。ホストベースのセットアップについては、以上が必要な作業になります。
手順7:自動探知のセットアップ(代替手段)
自動探知のセットアップでは、Docker、Kubernetes、Jolokiaの3つのプロバイダー間で同等の構成が異なります。Dockerの例は次のようになります。metricbeat.yml
構成ファイルの最下部にmetricbeat.autodiscover
を追加しています。
metricbeat.autodiscover: providers: - type: docker templates: - condition: contains: docker.container.image: nginx config: - module: nginx metricsets: ["stubstatus"] hosts: "${data.host}:${data.port}"
この構成では、名前にNGINXを含むイメージを使用するすべてのDockerコンテナーが一致します(containsは完全一致ではなく部分文字列一致を実行)。また、「stubstatus」メトリックセットでNGINXモジュールを有効にするconfigを使用しています。
手順8:Metricbeatを実行
これで構成が完了しました。フラグ( ログをstderrに送信し、syslog /ファイル出力を無効にする)を付けてMetricbeatを実行できます。
sudo ./metricbeat -e
すべてが正常に機能すると、いくつかの初期の出力を見ることができます。そして、Metricbeatがクラスターにデータを送信するたびに、さらに出力されます。
Filebeat
ログの収集にFilebeatを使用します。
手順1:Filebeatをダウンロード
curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.1.0-darwin-x86_64.tar.gz
手順2:アーカイブを解凍
tar -xvf filebeat-7.1.0-darwin-x86_64.tar.gz
手順3:ディレクトリを変更
cd filebeat-7.1.0-darwin-x86_64
手順4:NGINXモジュールを有効化
./filebeat modules enable nginx
デフォルトでは、アクセスおよびエラーログが収集されます。ログファイルのパスについては、FilebeatはOSに基づいて決定を試行します。別のパスに明示的に設定する必要がある場合は、モジュールのd/nginx.yml構成ファイルで設定できます。
手順5:ファイル所有権を変更
sudo chown root filebeat.yml sudo chown root modules.d/nginx.yml sudo chown root module/nginx/access/manifest.yml sudo chown root module/nginx/error/manifest.yml
ホストベースのセットアップについては、以上が必要な作業になります。
手順6:自動探知のセットアップ(代替手段)
Metricbeatの場合と同様、自動探知には追加の構成が必要です。前のセクションと同様に、Dockerの例では構成に自動探知セクションを追加する必要があり、filebeat.ymlは次のようになります。
filebeat.autodiscover: providers: - type: docker templates: - condition: contains: docker.container.image: nginx config: - module: nginx access: input: type: docker containers.ids: - "${data.docker.container.id}" error: input: type: docker containers.ids: - "${data.docker.container.id}"
ここではDocker入力を使用するように、アクセスおよびエラーオプションを構成しています。Docker入力は、パス(Dockerログが存在するベースパス。デフォルトでは/var/lib/docker/containers)
の下でコンテナーログを検索します。上記では、テンプレートの条件に一致したコンテナーのIDを使用してcontainers.ids
を指定しています。まとめると、ログは(デフォルトで)/var/lib/docker/containers/ac29b98ad83ca43bb4c15ae8f0d03aff8c7d57bf5dee9024124374b92b14b0f2/
から取得されます(IDは異なります)。
手順7:Filebeatを実行
sudo ./filebeat -e
Kibanaのインストール
これで、MetricbeatおよびFilebeatによるNGINXサーバー関連のデータ送信が完了しました。次に必要なのはこのデータを見る方法です。ここで役立つのがKibanaです。
手順1:Kibanaをダウンロード
curl -O https://artifacts.elastic.co/downloads/kibana/kibana-7.1.0-darwin-x86_64.tar.gz
手順2:アーカイブを解凍しディレクトリを変更
tar -xzf kibana-7.1.0-darwin-x86_64.tar.gz
cd kibana-7.1.0-darwin-x86_64
手順3:Kibanaを実行
./bin/kibana
デフォルトでは、KibanaはElasticsearchホストのhttp://localhost:9200
を使用します。そして、http://localhost:5601
でアクセスできます。
http://localhost:5601
にアクセスすると、次のような画面が表示されます。
オプションとしてサンプルデータを試すことができますが、ここでは[Explore on my own]をクリックします。
KibanaでNGINXデータを可視化
次に、Kibanaを使用してデータの表示と分析を行う方法を見ていきます。
インフラストラクチャー
Kibanaのサイドバーにある[Infrastructure]アプリから、インフラストラクチャーの最新のスナップショットを見ることができます。使用された構成に応じて、非自動探知ベースのセットアップではHostsの下でデータにアクセスできます。自動探知セットアップの場合は、DockerボタンまたはKubernetesボタン(使用プロバイダーに基づく)から、正しいデータセットにアクセスできます。
ここではホストベースのセットアップを使用していたので、[Hosts]ボタンをクリックすることで下記のようにMetricbeatから送信されたデータを見ることができます。
ノードの1つを選択して[View Metrics]を選択すると、その単一のNGINXサーバーの詳細なメトリックページを見ることができます。
ログ
[Logs]アプリ を見てみると、Filebeatから送信された、アクセスおよびエラーログを見ることができます。
事前設定済みのNGINXダッシュボード
アクセス可能なKibanaのインスタンスが実行されているので、事前に設計されたダッシュボードをロードすることができます。
Metricbeatダッシュボードをロードするために、Metricbeatディレクトリで以下を実行します。
sudo ./metricbeat setup --dashboards
Filebeatでも同様に実行します。
sudo ./filebeat setup --dashboards
Kibanaの[Dashboards]タブにアクセスすると、以下のようになっています。
「nginx」で検索すると、次のダッシュボードに絞り込まれます。
例として、[Filebeat NGINX] Access and error logs ECSダッシュボードは次のようになります。
Elastic Stackを使用してNGINXサーバーを監視する方法を見てきました。さらにさまざまなグルーピングオプションやフィルタリングオプションなどの多数のオプションがあり、自分にとって重要な情報にドリルダウンすることができます。