実動用の構築:Webアプリケーション—集中ログ

前書き

最終的に、本番アプリケーションのセットアップ用に集中ログを設定する準備が整いました。 集中ログは、サーバーのログを収集して視覚化する優れた方法です。 一般に、精巧なロギングシステムのセットアップは、確実なバックアップとモニタリングのセットアップほど重要ではありませんが、アプリケーションの傾向や問題を特定する場合に非常に役立ちます。

image:https://assets.digitalocean.com/articles/architecture/production/centralized_logging.png [集中ロギング図]

このチュートリアルでは、ELKスタック(Elasticsearch、Logstash、Kibana)を設定し、アプリケーションを構成するサーバーを構成して、関連するログをログサーバーに送信します。 また、https://www.digitalocean.com/community/tutorials/adding-logstash-filters-to-improve-centralized-logging [Logstash filters]を設定します。これにより、ログを簡単に検索および構造化できます。フィルタして、Kibanaの視覚化で使用します。

前提条件

ドメイン名を介してロギングダッシュボードにアクセスする場合は、「logging.example.com」など、ドメインの下に* logging サーバーのパブリックIPアドレスを指す A Record *を作成します。 または、パブリックIPアドレス経由で監視ダッシュボードにアクセスできます。 HTTPSを使用するようにロギングWebサーバーを設定し、VPNの背後に配置することにより、アクセスを制限することをお勧めします。

LoggingサーバーにELKをインストールする

次のチュートリアルに従って、*ロギング*サーバーでELKをセットアップします。https://www.digitalocean.com/community/tutorials/how-to-install-elasticsearch-logstash-and-kibana-4-on-ubuntu-14- 04 [Ubuntu 14.04にElasticsearch、Logstash、Kibana 4をインストールする方法]。

名前解決にプライベートDNSを使用している場合は、https://www.digitalocean.com/community/tutorials/how-to-install-elasticsearch-logstash-and-kibana-4の*オプション2 *に従ってください。 -on-ubuntu-14-04#generate-ssl-certificates [SSL証明書の生成セクション]。

  • Logstash Forwarderのセットアップ*セクションに到達したら停止します。

クライアントでのLogstash Forwarderのセットアップ

クライアントサーバーにログシッパーであるLogstash Forwarderをセットアップ db1、app1、app2、lb1、https://www.digitalocean.com/community/tutorials/how-to-install-elasticsearch-logstash-and-kibana-4-on-ubuntu-14-04# ELKチュートリアルのset-up-logstash-forwarder-(add-client-servers)[Logstash Forwarderセクションのセットアップ]。

終了したら、* logging *サーバーのパブリックネットワークアドレスを介してKibanaにログインし、各サーバーのsyslogを表示できるはずです。

収集するログを特定する

正確なアプリケーションと設定に応じて、ELKスタックに収集されるさまざまなログが利用可能になります。 この場合、次のログを収集します。

  • MySQLスロークエリログ(db1)

  • Apacheアクセスおよびエラーログ(app1およびapp2)

  • HAProxyログ(lb1)

これらのログを選択したのは、トラブルシューティングや傾向の特定を試みる際に役立つ情報を提供できるためです。 サーバーには、収集したい他のログがある場合がありますが、これは開始に役立ちます。

MySQLログを設定する

MySQLスロークエリログは通常、 `+ / var / log / mysql / mysql-slow`にあります。 「遅いクエリ」と見なされるほど実行に時間がかかるログで構成されているため、これらのクエリを特定すると、アプリケーションの最適化やトラブルシューティングに役立ちます。

MySQLスロークエリログを有効にする

スロークエリログはデフォルトでは有効になっていないため、これらのタイプのクエリを記録するようにMySQLを設定しましょう。

MySQL構成ファイルを開きます。

sudo vi /etc/mysql/my.cnf

コメントされた「logslowqueries」行を見つけて、次のようにコメントを外します。

/etc/mysql/my.cnf

log_slow_queries        = /var/log/mysql/mysql-slow.log

保存して終了。

変更を有効にするには、MySQLを再起動する必要があります。

sudo service mysql restart

これで、MySQLは構成で指定されたログファイルに長時間実行されているクエリを記録します。

MySQLログファイルの配布

Logstash Forwarderを設定して、MySQLスロークエリログをログサーバーに送信する必要があります。

データベースサーバーdb1で、Logstash Forwarder構成ファイルを開きます。

sudo vi /etc/logstash-forwarder.conf

既存のエントリの下の「files」セクションに以下を追加して、MySQLスロークエリログを「mysql-slow」タイプとしてLogstashサーバーに送信します。

logstash-forwarder.conf-MySQLの遅いクエリ

,
   {
     "paths": [
       "/var/log/mysql/mysql-slow.log"
      ],
     "fields": { "type": "mysql-slow" }
   }

保存して終了。 これにより、Logstash ForwarderがMySQLスロークエリログを出荷し、「mysql-slow」タイプのログをマークするように設定します。これは、後でフィルタリングに使用されます。

Logstash Forwarderを再起動して、ログの配布を開始します。

sudo service logstash-forwarder restart

マルチライン入力コーデック

MySQLスロークエリログは複数行形式です(つまり、 各エントリは複数行にまたがっています)、Logstashの複数行コーデックがこのタイプのログを処理できるようにする必要があります。

ELKサーバー* logging *で、Lumberjack入力が定義されている構成ファイルを開きます。

sudo vi /etc/logstash/conf.d/01-lumberjack-input.conf

`+ lumberjack +`入力定義内で、次の行を追加します。

   codec => multiline {
     pattern => "^# User@Host:"
     negate => true
     what => previous
   }

保存して終了。 これにより、指定されたパターンを含むログ(つまり、 「#User @ Host:」で始まります)。

次に、MySQLログのLogstashフィルターを設定します。

MySQLログフィルター

ELKサーバー* logging *で、新しいファイルを開いてMySQLログフィルターをLogstashに追加します。 `+ 11-mysql.conf `という名前を付けるので、Logstashの入力設定の後に読み込まれます( ` 01-lumberjack-input.conf +`ファイル内):

sudo vi /etc/logstash/conf.d/11-mysql.conf

次のフィルター定義を追加します。

11-mysql.conf

filter {
 # Capture user, optional host and optional ip fields
 # sample log file lines:
 if [type] == "mysql-slow" {
   grok {
     match => [ "message", "^# User@Host: %{USER:user}(?:\[[^\]]+\])?\s+@\s+%{HOST:host}?\s+\[%{IP:ip}?\]" ]
   }
   # Capture query time, lock time, rows returned and rows examined
   grok {
     match => [ "message", "^# Query_time: %{NUMBER:duration:float}\s+Lock_time: %{NUMBER:lock_wait:float} Rows_sent: %{NUMBER:results:int} \s*Rows_examined: %{NUMBER:scanned:int}"]
   }
   # Capture the time the query happened
   grok {
     match => [ "message", "^SET timestamp=%{NUMBER:timestamp};" ]
   }
   # Extract the time based on the time of the query and not the time the item got logged
   date {
     match => [ "timestamp", "UNIX" ]
   }
   # Drop the captured timestamp field since it has been moved to the time of the event
   mutate {
     remove_field => "timestamp"
   }
 }
}

保存して終了。 これにより、Logstashは、 `+ match `ディレクティブで指定されたGrokパターンで ` mysql-slow `タイプのログをフィルタリングするように設定されます。 ` apache-access `タイプのログは、デフォルトのApacheログメッセージ形式に一致するLogstash提供のGrokパターンによって解析され、 ` apache-error +`タイプのログは、一致するように記述されたGrokフィルターによって解析されますデフォルトのエラーログ形式。

これらのフィルターを機能させるために、Logstashを再起動しましょう。

sudo service logstash restart

この時点で、構成エラーが原因でLogstashが失敗するため、Logstashが正しく実行されていることを確認する必要があります。

画像:https://assets.digitalocean.com/articles/architecture/production/lamp/kibana.png [Kibana Dashboard]

また、KibanaがフィルタリングされたApacheログを表示できることを確認する必要があります。

Apacheログ

Apacheのログは通常、「+。/ var / log / apache2 +」にあり、「access.log」と「error.log」という名前が付けられています。 これらのログを収集すると、Apacheが報告するエラーメッセージに加えて、サーバーにアクセスしているユーザーのIPアドレス、サーバーが要求しているもの、使用しているOSおよびWebブラウザーを確認できます。

Apacheログファイルを出荷する

Logstash Forwarderを設定して、Apacheアクセスおよびエラーログをログサーバーに送信する必要があります。

アプリケーションサーバーのapp1とapp2で、Logstash Forwarder構成ファイルを開きます。

sudo vi /etc/logstash-forwarder.conf

既存のエントリの下の「ファイル」セクションに次を追加して、Apacheログを適切なタイプとしてLogstashサーバーに送信します。

logstash-forwarder.conf-Apacheアクセスおよびエラーログ

,
   {
     "paths": [
       "/var/log/apache2/access.log"
      ],
     "fields": { "type": "apache-access" }
   },
   {
     "paths": [
       "/var/log/apache2/error.log"
      ],
     "fields": { "type": "apache-error" }
   }

保存して終了。 これにより、Logstash ForwarderがApacheアクセスおよびエラーログを出荷し、それぞれのタイプとしてマークするように設定されます。これらはログのフィルタリングに使用されます。

Logstash Forwarderを再起動して、ログの配布を開始します。

sudo service logstash-forwarder restart

現在、すべてのApacheログには、HAProxyリバースプロキシがインターネットからアプリケーションサーバーにアクセスする唯一の方法であるため、HAProxyサーバーのプライベートIPアドレスと一致するクライアントソースIPアドレスがあります。 これを変更してサイトにアクセスしている実際のユーザーのソースIPを表示するために、デフォルトのApacheログ形式を変更して、HAProxyが送信する `+ X-Forwarded-For +`ヘッダーを使用できます。

Apache構成ファイル(apache2.conf)を開きます。

sudo vi /etc/apache2/apache2.conf

次のような行を見つけます。

[Label apache2.conf - Original "combined" LogFormat]
LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined

%h *を%\ {X-Forwarded-For} i *に置き換えると、次のようになります。

[Label apache2.conf - Updated "combined" LogFormat]
LogFormat " %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined

保存して終了。 これにより、HAProxyサーバーのプライベートIPアドレスではなく、実際のユーザーのソースIPアドレスが含まれるようにApacheアクセスログが構成されます。

Apacheを再起動して、ログの変更を有効にします。

sudo service apache2 restart

これで、ApacheログフィルターをLogstashに追加する準備が整いました。

Apacheログフィルター

ELKサーバー* logging *で、新しいファイルを開き、ApacheログフィルターをLogstashに追加します。 「+ 12-apache.conf 」という名前を付けるので、Logstashの入力設定の後に読み込まれます(「 01-lumberjack-input.conf +」ファイル内):

sudo vi /etc/logstash/conf.d/12-apache.conf

次のフィルター定義を追加します。

12-apache.conf

filter {
 if [type] == "apache-access" {
   grok {
     match => { "message" => "%{COMBINEDAPACHELOG}" }
   }
 }
}
filter {
 if [type] == "apache-error" {
   grok {
     match => { "message" => "\[(?<timestamp>%{DAY:day} %{MONTH:month} %{MONTHDAY} %{TIME} %{YEAR})\] \[%{DATA:severity}\] \[pid %{NUMBER:pid}\] \[client %{IPORHOST:clientip}:%{POSINT:clientport}] %{GREEDYDATA:error_message}" }
   }
 }
}

保存して終了。 これは、それぞれの `+ match `ディレクティブで指定されたGrokパターンで ` apache-access `および ` apache-error`タイプのログをフィルタリングするようにLogstashを設定します。 `+ apache-access `タイプのログは、デフォルトのApacheログメッセージ形式に一致するLogstash提供のGrokパターンによって解析され、 ` apache-error +`タイプのログは、一致するように記述されたGrokフィルターによって解析されますデフォルトのエラーログ形式。

これらのフィルターを機能させるために、Logstashを再起動しましょう。

sudo service logstash restart

この時点で、構成エラーが原因でLogstashが失敗するため、Logstashが正しく実行されていることを確認する必要があります。 また、KibanaがフィルタリングされたApacheログを表示できることを確認する必要があります。

HAProxyログ

HAProxyのログは通常、 `+ / var / log / haproxy.log +`にあります。 これらのログを収集すると、ロードバランサーにアクセスしているユーザーのIPアドレス、要求元、要求を処理しているアプリケーションサーバー、および接続に関するさまざまな詳細を確認できます。

HAProxyログファイルの配布

HAProxyログを送信するようにLogstash Forwarderを構成する必要があります。

HAProxyサーバー* lb1 *で、Logstash Forwarder構成ファイルを開きます。

sudo vi /etc/logstash-forwarder.conf

既存のエントリの下の「files」セクションに以下を追加して、HAProxyログを「haproxy-log」タイプとしてLogstashサーバーに送信します。

logstash-forwarder.conf-HAProxyログ

,
   {
     "paths": [
       "/var/log/haproxy.log"
      ],
     "fields": { "type": "haproxy-log" }
   }

保存して終了。 これにより、Logstash ForwarderがHAProxyログを出荷し、ログのフィルタリングに使用される「+ haproxy-log +」としてマークするように設定されます。

Logstash Forwarderを再起動して、ログの配布を開始します。

sudo service logstash-forwarder restart

HAProxyログフィルター

ELKサーバー* logging *で、新しいファイルを開き、HAProxyログフィルターをLogstashに追加します。 `+ 13-haproxy.conf `という名前を付けるので、Logstashの入力設定の後に読み込まれます( ` 01-lumberjack-input.conf +`ファイル内):

sudo vi /etc/logstash/conf.d/13-haproxy.conf

次のフィルター定義を追加します。

filter {
 if [type] == "haproxy-log" {
   grok {
     match => { "message" => "%{SYSLOGTIMESTAMP:timestamp} %{HOSTNAME:hostname} %{SYSLOGPROG}: %{IPORHOST:clientip}:%{POSINT:clientport} \[%{MONTHDAY}[./-]%{MONTH}[./-]%{YEAR}:%{TIME}\] %{NOTSPACE:frontend_name} %{NOTSPACE:backend_name}/%{NOTSPACE:server_name} %{INT:time_request}/%{INT:time_queue}/%{INT:time_backend_connect}/%{INT:time_backend_response}/%{NOTSPACE:time_duration} %{INT:http_status_code} %{NOTSPACE:bytes_read} %{DATA:captured_request_cookie} %{DATA:captured_response_cookie} %{NOTSPACE:termination_state} %{INT:actconn}/%{INT:feconn}/%{INT:beconn}/%{INT:srvconn}/%{NOTSPACE:retries} %{INT:srv_queue}/%{INT:backend_queue} "(%{WORD:http_verb} %{URIPATHPARAM:http_request} HTTP/%{NUMBER:http_version})|<BADREQ>|(%{WORD:http_verb} (%{URIPROTO:http_proto}://))" }
   }
 }
}

保存して終了。 これは、それぞれの `+ match `ディレクティブで指定されたGrokパターンで ` haproxy-log `タイプのログをフィルタリングするようにLogstashを設定します。 ` haproxy-log +`タイプのログは、デフォルトのHAProxyログメッセージ形式に一致するLogstash提供のGrokパターンによって解析されています。

これらのフィルターを機能させるために、Logstashを再起動しましょう。

sudo service logstash restart

この時点で、構成エラーが原因でLogstashが失敗するため、Logstashが正しく実行されていることを確認する必要があります。

Kibanaビジュアライゼーションのセットアップ

ログを中央の場所で収集しているので、Kibanaを使用してログを視覚化できます。 このチュートリアルは、https://www.digitalocean.com/community/tutorials/how-to-use-kibana-dashboards-and-visualizations [Kibanaダッシュボードとビジュアライゼーションの使用方法]を開始するのに役立ちます。

Kibanaにある程度慣れたら、このチュートリアルを試して、ユーザーを興味深い方法で視覚化してください:https://www.digitalocean.com/community/tutorials/how-to-map-user-location-with-geoip-and -elk-elasticsearch-logstash-and-kibana [GeoIPおよびELKを使用してユーザーの場所をマップする方法]。

結論

おめでとうございます。 Production Web Application Setupチュートリアルシリーズを完了しました。 すべてのチュートリアルを実行した場合は、概要チュートリアルで説明したような設定が必要です(プライベートDNSとリモートバックアップを使用)。

image:https://assets.digitalocean.com/articles/architecture/production/lamp/final.png [生産セットアップ]

つまり、バックアップ、監視、および集中ログコンポーネントによってサポートされる、分離されたコンポーネントを備えた動作中のアプリケーションが必要です。 必ずアプリケーションをテストし、すべてのコンポーネントが期待どおりに機能することを確認してください。

Related