エンジニアリング

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にアクセスすると、次のような画面が表示されます。

「Welcome to Kibana」画面

オプションとしてサンプルデータを試すことができますが、ここでは[Explore on my own]をクリックします。

KibanaでNGINXデータを可視化

次に、Kibanaを使用してデータの表示と分析を行う方法を見ていきます。

インフラストラクチャー

Kibanaのサイドバーにある[Infrastructure]アプリから、インフラストラクチャーの最新のスナップショットを見ることができます。使用された構成に応じて、非自動探知ベースのセットアップではHostsの下でデータにアクセスできます。自動探知セットアップの場合は、DockerボタンまたはKubernetesボタン(使用プロバイダーに基づく)から、正しいデータセットにアクセスできます。

Hosts、Kubernetes、Dockerの各ボタン

ここではホストベースのセットアップを使用していたので、[Hosts]ボタンをクリックすることで下記のようにMetricbeatから送信されたデータを見ることができます。

[Hosts]ボタンをクリックして、送信されているデータを確認

ノードの1つを選択して[View Metrics]を選択すると、その単一のNGINXサーバーの詳細なメトリックページを見ることができます。

サーバーメトリックを表示するKibanaグラフ

ログ

[Logs]アプリ を見てみると、Filebeatから送信された、アクセスおよびエラーログを見ることができます。

エラーおよびアクセスログを表示するKibana Logsアプリ

事前設定済みのNGINXダッシュボード

アクセス可能なKibanaのインスタンスが実行されているので、事前に設計されたダッシュボードをロードすることができます。

Metricbeatダッシュボードをロードするために、Metricbeatディレクトリで以下を実行します。

sudo ./metricbeat setup --dashboards

Filebeatでも同様に実行します。

sudo ./filebeat setup --dashboards

Kibanaの[Dashboards]タブにアクセスすると、以下のようになっています。

利用可能なダッシュボードを表示するKibanaページ

「nginx」で検索すると、次のダッシュボードに絞り込まれます。

利用可能なNGINXダッシュボードを表示するKibanaページ

例として、[Filebeat NGINX] Access and error logs ECSダッシュボードは次のようになります。

Filebeat NGINX Access and error logs ECS

Elastic Stackを使用してNGINXサーバーを監視する方法を見てきました。さらにさまざまなグルーピングオプションやフィルタリングオプションなどの多数のオプションがあり、自分にとって重要な情報にドリルダウンすることができます。

はじめましょう

Elastic Stackは簡単に開始できます。curlコマンドでさまざまな製品をダウンロードでき、またdownloadsページにアクセスしてダウンロードすることもできます。さらに簡単な方法としては、Elasticsearch Serviceの14日間無料トライアルを開始し、試してみることもできます。ご質問がある場合はディスカッションフォーラムにアクセスしてください。