EatSmartシステム部ブログ

ウェブサイトの開発や運営に関する情報です。

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}\"}"'`

Apache

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を作ることになります。 いまのところリクエスト応答の可視化に必要な項目に絞っていますが、今後必要に応じて項目の追加が行われると思います。