Nginx/Apacheのアクセスログを可視化してみる
今回は、Nginx/Apacheのアクセスログの可視化について書きたいと思います。
イートスマート社では、WEBサービスの解析にGoogleアナリティクスを利用しています。 Googleアナリティクスでサイトへ訪問するユーザーやアクセス状況の分析を行い、日々サービスの改善につなげています。 しかし、Googleアナリティクスだけではユーザーからのリクエストへどのような応答を行ったのか詳細はわかりません。 そこで、Nginx/Apacheのアクセスログを可視化することにしてみました。
アクセスログの可視化
アクセスログの可視化には、Kibanaを利用することにしました。 KibanaとElasticsearchの環境構築にはDocker Imageを利用しました。
アクセスログの設定変更
大量のアクセスを捌くためにサーバのチューニングは行っていましたが、応答の詳細を把握するためにアクセスログの項目を見直しました。
Nginxへ設定したのは以下の項目です。
項目 | 説明 |
---|---|
$request_uri | リクエストされたページを判別するため |
$status | ユーザーへの応答を把握するため |
$request_time | ユーザーへの応答にかかった時間を把握するため |
$upstream_addr | リクエストを処理したバックエンドサーバを特定するため |
$upstream_status | バックエンドサーバの応答を把握するため |
$upstream_response_time | バックエンドサーバの応答にかかった時間を把握するため |
$cookie_JSESSIONID | リクエストされたセッションを特定するため |
Apacheへ設定したのは以下の項目です。
項目 | 説明 |
---|---|
%T | ユーザーへの応答にかかった時間を把握するため |
%D | ユーザーへの応答にかかった時間を把握するため |
%{JSESSIONID}C | リクエストされたセッションを特定するため |
%{%Y-%m-%dT%T}t.%{msec_frac}t%{%z}t | Kibanaのリクエスト日時として利用するため |
既存のログ解析スクリプトへの影響を少なくするため、末尾に追加しました。
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %T %D %{JSESSIONID}C %{%Y-%m-%dT%T}t.%{msec_frac}t%{%z}t" combined-es
以上の設定を反映することで、可視化に必要なデータを揃えることが出来ました。
アクセスログの登録
Elasticsearchへアクセスログと登録する方法として、Bulk APIを利用しました。 当初はtd-agentを利用して登録しようとしましたが、以下の理由から利用を諦めました。
- td-agentが導入されていないサーバが存在する
- 本番環境のネットワークからElasticsearchが稼働するネットワークへ直接接続出来ない
登録するアクセスログは前日分のバックアップを利用します。(このため、可視化出来るのは翌日以降になってしまいます。) Bulk APIで登録するため、アクセスログをJSON形式へ変換する必要があります。JSONへの変換は、Nginx/Apacheそれぞれ以下のように行いました。
Nginx
JSON=`echo "${line}" | perl -F'\t' -nale '%h=map{split/:/,$_,2}@F;print"{\"index\":{}}\\\\n{\"\@timestamp\":\"$h{time}\",\"request_uri\":\"$h{request_uri}\", \"status\":$h{status}, \"request_time\":$h{request_time},\"jsessionid\":\"$h{jsessionid}\"}"'`
JSON=`echo ${line} | awk -F'\\\\[|\\\\]|"' '{print $4" "$5" "$9}' | awk '{print "{\"index\":{}}\\\\n{\"@timestamp\":\""$6"\", \"request_uri\":\""$2"\", \"status\":"$4", \"request_time\":"$7/1000000"}"}'`
まとめ
以上で、Nginx/Apacheのアクセスログの可視化を行うことが出来ました。 ここから、可視化したい内容のVisualizationやSaved Searchを作成してDashboardを作ることになります。 いまのところリクエスト応答の可視化に必要な項目に絞っていますが、今後必要に応じて項目の追加が行われると思います。