SlideShare a Scribd company logo
Rails3+devise,nginx,fluent,S3構成での
       アクセスログ収集と蓄積
         アクセス分析に活用することを前提として、
          上記構成で構築したアプリケーションの
         アクセスログ収集と蓄積方法を説明します



              2012年8月22日
            三上威 (@takemikami)
     ※本文書の詳細は以下のブログでも説明しています。
      http://takemikami.com/technote/archives/658

        Copyright(C) 2012 Takeshi Mikami. All rights reserved.
目次
 本文書は次の構成をとります

 •    概要
 •    アクセスログ収集・蓄積の全体像
 •    trackingIDの付与とアクセスログへの出力
 •    アプリケーション上のユーザIDとアクセスログの紐付け
 •    詳細アクセスログの出力
 •    fluentdによるログ抽出と転送




Copyright(C) 2012 Takeshi Mikami. All rights reserved.
概要
 本文書の概要を示します

 • ユーザ認証が存在するWebアプリのアクセスログを有効に分析
   したい
   ⇒以下の2点を行う必要がある
       – Webサーバからアクセスログを集める
       – Webアプリのユーザとアクセスログを紐付ける


 • 本文書では、次の構成のWebアプリケーションで「アクセスログ
   の収集と蓄積」を行う流れを説明します
       –    Webサーバ: nginx
       –    開発フレームワーク: Ruby on Rails (認証プラグインとしてdevise)
       –    ログ集約: fluentd
       –    ログの格納先: Amazon S3


Copyright(C) 2012 Takeshi Mikami. All rights reserved.
アクセスログ収集・蓄積の全体像
 本スライドでは、アクセスログ収集と蓄積の全体像を示します。
                                                                                        ログの出力
          ①ユーザの訪問


                                        nginx                   Rails
                                                                         アプリDB
              ユーザ

          ④tracking用の                                    ②アプリからユーザID情報を送信
          cookie情報を送信
                                                   ③アクセスログにユーザID
                                                   トラッキング用cookie情報を出力
                                       ログ


           ①ログを監視し、条件
           に合うログを抽出                                        S3
                                                                                 抽出したログを集計し、
                             fluentd                                             分析に活用する想定
                                         抽出                             抽出
                                         ログ                             ログ

                               ②定期的にS3に転送
                                                                                       マーケター
 ログの収集・分析
Copyright(C) 2012 Takeshi Mikami. All rights reserved.
trackingIDの付与とアクセスログへの出力
 本スライドでは、nginxの機能を用いたtrackingIDの付与方法を示します。


 再訪問時のcookieイメージ                 ⇒2度目以降の訪問についてクライアントを一意に特定できる
                                   度目以降の訪問についてクライアントを一意に特定できる
                                          についてクライアント
  Cookie: uid=XXXXXXXXXXXXXXXXXXXXXXXX;

  ユーザの訪問
  初回訪問:cookie無し                                                  nginxの設定
  再訪問:cookie有り
                                                                    ■/etc/nginx/conf.d/default.confに追加
                                                                    userid on;
                                                                    userid_name uid;
                                                                    userid_path /;
                                          nginx                     userid_expires 365d;

             ユーザ


    tracking用のcookie情
    報を送信(初回訪問時
    のみ)
   初回訪問時のcookie設定イメージ
    Set-Cookie: uid=XXXXXXXXXXXXXXXXXXXXXXXX; path=/; expires=Thu, 20-Aug-2013 09:25:55 GMT; HttpOnly



Copyright(C) 2012 Takeshi Mikami. All rights reserved.
アプリケーション上のユーザIDとアクセスログの紐付け
 本スライドでは、RailsアプリのユーザIDをアクセスログに紐づける方法を示します。

 HTTP応答ヘッダ イメージ                     HTTP応答ヘッダ イメージ
                                      X-App-Userid: 2
  X-App-Userid: 2


  ユーザIDは送信さ                           アプリからユーザIDを送信                       ⇒アプリから送信した会員IDと
                                                                           アプリから送信した会員 と
                                                                                から送信した会員
  れない                                                                      nginxのログを紐付けできる
                                                                                のログを紐付けできる

                                nginx
                                                           Rails
                                                                      アプリDB
      ユーザ

                                                    Railsアプリへの改修
  nginxでユーザID
  ヘッダを削除                                             ■「app/controllers/application_controller.rb」
                                                     class ApplicationController < ActionController::Base
 nginxの設定                                             protect_from_forgery
                                                      after_filter :add_userid_toheader
                                                      def add_userid_toheader
   ■/etc/nginx/conf.d/default.confに追加
                                                        response.headers["X-App-Userid"]
   proxy_hide_header X-App-Userid;
                                                         = "#{user_signed_in? ? session['warden.user.user.key'][1][0] : nil}"
                                                      end
                                                     end



Copyright(C) 2012 Takeshi Mikami. All rights reserved.
詳細アクセスログの出力
 本スライドでは、詳細アクセスログの出力方法を示します。

                           nginxの設定

                               ■/etc/nginx/conf.d/default.confに追加
                               log_format detail_accesslog
          nginx                '"$time_local","$remote_addr","$uid_got","$upstream_http_x_app_userid","$remote_user","$re
                               quest","$status","$body_bytes_sent","$http_referer","$http_user_agent","$http_x_forwarded_f
                               or","$gzip_ratio"';
                               access_log /var/log/nginx/detail_access.log detail_accesslog;


                           ※ログ出力フォーマットの指定
                           trackingID: $uid_got
                           例)uid=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
                           ユーザID: $upstream_http_x_app_userid
                           例)2
         ログ


   出力ログのイメージ

    "21/Aug/2012:14:10:09 +0900","192.168.199.1","uid=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX","2","-","GET /
    HTTP/1.1","304","0","-","Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.79
    Safari/537.1","-","-"



Copyright(C) 2012 Takeshi Mikami. All rights reserved.
fluentdによるログ抽出と転送
 本スライドでは、fluentdによるログ抽出と転送について示します。

                   fluentdの設定         ■/etc/fluent/fluent.confに追加
                                                                                                      正規表現にマッチ
                                      <source>                                                        するログを抽出
         ログを監視し、条件に                     type tail
         合うログを抽出                        format
                                      /^"(?<time_local>[^"]*)","(?<remote_addr>[^"]*)","(?<uid_got>[^"]*)","(?<upstream_http_x
                                      _app_userid>[^"]*)","(?<remote_user>[^"]*)","(?<request>[^"]*)","(?<status>[^"]*)","(?<bo
  ログ                                  dy_bytes_sent>[^"]*)","(?<http_referer>[^"]*)","(?<http_user_agent>[^"]*)","(?<http_x_for
                                      warded_for>[^"]*)","(?<gzip_ratio>[^"]*)"$/
                                        path /var/log/nginx/detail_access.log
                                        pos_file /tmp/td-agent/apache-web.pos
                                        tag nginx.access
   fluentd                            </source>
              抽出
              ログ

                                       ■/etc/fluent/fluent.confに追加
                    定期的に               <match nginx.access>
                    S3に転送               type s3
                                        aws_key_id <ここにaccess_key_idを入れる>
                    fluentdの設定          aws_sec_key <ここにsecret_access_keyを入れる>
                                        s3_bucket <ここにbucket名を入れる>
  S3                                    s3_endpoint s3-ap-northeast-1.amazonaws.com
                                        path log/
                                        buffer_path /var/log/fluent/s3
                                        time_slice_format /nginx/%Y%m/detail_access-jp.tabine.www-web.log.%Y%m%d%H
              抽出                        time_slice_wait 10m
              ログ                       </match>

Copyright(C) 2012 Takeshi Mikami. All rights reserved.

More Related Content

What's hot (8)

PDF
スレッド単位で権限分離を行うWebサーバのアクセス制御アーキテクチャ
Ryosuke MATSUMOTO
 
PPTX
FIWARE Big Data Ecosystem : Cygnus and STH Comet
fisuda
 
PDF
OpenStack Study#9 JOSUG
Hideki Saito
 
PPTX
標的型攻撃からどのように身を守るのか
abend_cve_9999_0001
 
PDF
Rablock applicatin dev_guide_v1.2
Yoshi Nagase
 
PDF
The Latest Specs of OpenID Connect at #idcon 9
Ryo Ito
 
PDF
MongoDBざっくり解説
知教 本間
 
PPTX
IoT Agents をデバッグする方法 - FIWARE WednesdayWebinars
fisuda
 
スレッド単位で権限分離を行うWebサーバのアクセス制御アーキテクチャ
Ryosuke MATSUMOTO
 
FIWARE Big Data Ecosystem : Cygnus and STH Comet
fisuda
 
OpenStack Study#9 JOSUG
Hideki Saito
 
標的型攻撃からどのように身を守るのか
abend_cve_9999_0001
 
Rablock applicatin dev_guide_v1.2
Yoshi Nagase
 
The Latest Specs of OpenID Connect at #idcon 9
Ryo Ito
 
MongoDBざっくり解説
知教 本間
 
IoT Agents をデバッグする方法 - FIWARE WednesdayWebinars
fisuda
 

Similar to Rails3+devise,nginx,fluent,S3構成でのアクセスログ収集と蓄積 (20)

KEY
Rails and twitter #twtr_hack
i7a
 
PPTX
NginxとLuaを用いた動的なリバースプロキシでデプロイを 100 倍速くした
toshi_pp
 
PDF
mod_auth_ticket - Bringing Single-Sign-On to lighttpd
Taisuke Yamada
 
PDF
deviseを利用した認証について@Minamirb
Jun Fukaya
 
PDF
Fluentd meetup #2
Tomohiro Ikeda
 
PDF
スマートフォン向けサービスにおけるサーバサイド設計入門
Hisashi HATAKEYAMA
 
PDF
Movable TypeのWebアプリケーションフレームワークの基本
Hajime Fujimoto
 
PDF
ログにまつわるエトセトラ
菊池 佑太
 
PDF
泥臭い運用から、プログラマブルインフラ構築(に行きたい)
Akihiro Kuwano
 
PDF
Webサーバ勉強会#5
oranie Narut
 
PPTX
シラサギハンズオン 1015 1016
Yu Ito
 
PPTX
シラサギハンズオン 東京
Yu Ito
 
PDF
Fluentd Casual Talks LT #fluentd #fluentdcasual
Hitoshi Asai
 
PDF
Jaws days ランキング1位の人気スマホアプリを カジュアル×セキュアに運用する
Hirotomo Oi
 
PDF
Couchbase MeetUP Tokyo - #11 Omoidenote
kitsugi
 
PDF
20101220 pixiv tech_meeting
semind
 
PPTX
シラサギハンズオン 大阪
Yu Ito
 
PDF
Herokumeetup8 growライトニングトーク
淳 竹野
 
PPTX
Jenkinsとhadoopを利用した継続的データ解析環境の構築
Kenta Suzuki
 
PDF
データマイニング+WEB勉強会資料第6回
Naoyuki Yamada
 
Rails and twitter #twtr_hack
i7a
 
NginxとLuaを用いた動的なリバースプロキシでデプロイを 100 倍速くした
toshi_pp
 
mod_auth_ticket - Bringing Single-Sign-On to lighttpd
Taisuke Yamada
 
deviseを利用した認証について@Minamirb
Jun Fukaya
 
Fluentd meetup #2
Tomohiro Ikeda
 
スマートフォン向けサービスにおけるサーバサイド設計入門
Hisashi HATAKEYAMA
 
Movable TypeのWebアプリケーションフレームワークの基本
Hajime Fujimoto
 
ログにまつわるエトセトラ
菊池 佑太
 
泥臭い運用から、プログラマブルインフラ構築(に行きたい)
Akihiro Kuwano
 
Webサーバ勉強会#5
oranie Narut
 
シラサギハンズオン 1015 1016
Yu Ito
 
シラサギハンズオン 東京
Yu Ito
 
Fluentd Casual Talks LT #fluentd #fluentdcasual
Hitoshi Asai
 
Jaws days ランキング1位の人気スマホアプリを カジュアル×セキュアに運用する
Hirotomo Oi
 
Couchbase MeetUP Tokyo - #11 Omoidenote
kitsugi
 
20101220 pixiv tech_meeting
semind
 
シラサギハンズオン 大阪
Yu Ito
 
Herokumeetup8 growライトニングトーク
淳 竹野
 
Jenkinsとhadoopを利用した継続的データ解析環境の構築
Kenta Suzuki
 
データマイニング+WEB勉強会資料第6回
Naoyuki Yamada
 
Ad

More from Takeshi Mikami (20)

PDF
rdflintのvscode拡張の紹介とその実装方法
Takeshi Mikami
 
PDF
適切なクラスタ数を機械的に求める手法の紹介
Takeshi Mikami
 
PDF
OAuth 2.0による認可の流れ
Takeshi Mikami
 
PDF
MapReduceによるConnected Components(連結成分)の見つけ方
Takeshi Mikami
 
PDF
RDFチェックツール「rdflint」のご紹介 (LODチャレンジ2019受賞作品紹介 基盤技術部門優秀賞)
Takeshi Mikami
 
PDF
データサイエンスアイドル「小日向美穂」と考える「つながり」
Takeshi Mikami
 
PDF
RDFのチェックツール「rdflint」と コミュニティによるオープンデータの作成
Takeshi Mikami
 
PDF
CircleCIを使ったSpringBoot/GAEアプリ開発の効率化ノウハウ
Takeshi Mikami
 
PDF
GitHubの機能を活用したGitHub Flowによる開発の進め方
Takeshi Mikami
 
PDF
HBase CompleteBulkLoadその仕組み&発生した問題
Takeshi Mikami
 
PDF
RDFチェックツール「rdflint」のご紹介
Takeshi Mikami
 
PDF
アーリース情報技術株式会社 会社案内 (2019/02/13)
Takeshi Mikami
 
PDF
Spark MLlib ML Pipelines の概要 及びpysparkからの扱い方
Takeshi Mikami
 
PDF
SPARQL入門
Takeshi Mikami
 
PDF
センサーによるデータ計測と異常検知の基本
Takeshi Mikami
 
PDF
Webサイトのアクセスログによるユーザー属性推定
Takeshi Mikami
 
PDF
Google Cloud Dataflowによる データ変換処理入門
Takeshi Mikami
 
PDF
IoTでの機械学習活用イメージと強化学習のご紹介
Takeshi Mikami
 
PDF
協調フィルタリング・アソシエーション分析によるレコメンド手法の紹介
Takeshi Mikami
 
PDF
SparkMLlibで始めるビッグデータを対象とした機械学習入門
Takeshi Mikami
 
rdflintのvscode拡張の紹介とその実装方法
Takeshi Mikami
 
適切なクラスタ数を機械的に求める手法の紹介
Takeshi Mikami
 
OAuth 2.0による認可の流れ
Takeshi Mikami
 
MapReduceによるConnected Components(連結成分)の見つけ方
Takeshi Mikami
 
RDFチェックツール「rdflint」のご紹介 (LODチャレンジ2019受賞作品紹介 基盤技術部門優秀賞)
Takeshi Mikami
 
データサイエンスアイドル「小日向美穂」と考える「つながり」
Takeshi Mikami
 
RDFのチェックツール「rdflint」と コミュニティによるオープンデータの作成
Takeshi Mikami
 
CircleCIを使ったSpringBoot/GAEアプリ開発の効率化ノウハウ
Takeshi Mikami
 
GitHubの機能を活用したGitHub Flowによる開発の進め方
Takeshi Mikami
 
HBase CompleteBulkLoadその仕組み&発生した問題
Takeshi Mikami
 
RDFチェックツール「rdflint」のご紹介
Takeshi Mikami
 
アーリース情報技術株式会社 会社案内 (2019/02/13)
Takeshi Mikami
 
Spark MLlib ML Pipelines の概要 及びpysparkからの扱い方
Takeshi Mikami
 
SPARQL入門
Takeshi Mikami
 
センサーによるデータ計測と異常検知の基本
Takeshi Mikami
 
Webサイトのアクセスログによるユーザー属性推定
Takeshi Mikami
 
Google Cloud Dataflowによる データ変換処理入門
Takeshi Mikami
 
IoTでの機械学習活用イメージと強化学習のご紹介
Takeshi Mikami
 
協調フィルタリング・アソシエーション分析によるレコメンド手法の紹介
Takeshi Mikami
 
SparkMLlibで始めるビッグデータを対象とした機械学習入門
Takeshi Mikami
 
Ad

Rails3+devise,nginx,fluent,S3構成でのアクセスログ収集と蓄積

  • 1. Rails3+devise,nginx,fluent,S3構成での アクセスログ収集と蓄積 アクセス分析に活用することを前提として、 上記構成で構築したアプリケーションの アクセスログ収集と蓄積方法を説明します 2012年8月22日 三上威 (@takemikami) ※本文書の詳細は以下のブログでも説明しています。 http://takemikami.com/technote/archives/658 Copyright(C) 2012 Takeshi Mikami. All rights reserved.
  • 2. 目次 本文書は次の構成をとります • 概要 • アクセスログ収集・蓄積の全体像 • trackingIDの付与とアクセスログへの出力 • アプリケーション上のユーザIDとアクセスログの紐付け • 詳細アクセスログの出力 • fluentdによるログ抽出と転送 Copyright(C) 2012 Takeshi Mikami. All rights reserved.
  • 3. 概要 本文書の概要を示します • ユーザ認証が存在するWebアプリのアクセスログを有効に分析 したい ⇒以下の2点を行う必要がある – Webサーバからアクセスログを集める – Webアプリのユーザとアクセスログを紐付ける • 本文書では、次の構成のWebアプリケーションで「アクセスログ の収集と蓄積」を行う流れを説明します – Webサーバ: nginx – 開発フレームワーク: Ruby on Rails (認証プラグインとしてdevise) – ログ集約: fluentd – ログの格納先: Amazon S3 Copyright(C) 2012 Takeshi Mikami. All rights reserved.
  • 4. アクセスログ収集・蓄積の全体像 本スライドでは、アクセスログ収集と蓄積の全体像を示します。 ログの出力 ①ユーザの訪問 nginx Rails アプリDB ユーザ ④tracking用の ②アプリからユーザID情報を送信 cookie情報を送信 ③アクセスログにユーザID トラッキング用cookie情報を出力 ログ ①ログを監視し、条件 に合うログを抽出 S3 抽出したログを集計し、 fluentd 分析に活用する想定 抽出 抽出 ログ ログ ②定期的にS3に転送 マーケター ログの収集・分析 Copyright(C) 2012 Takeshi Mikami. All rights reserved.
  • 5. trackingIDの付与とアクセスログへの出力 本スライドでは、nginxの機能を用いたtrackingIDの付与方法を示します。 再訪問時のcookieイメージ ⇒2度目以降の訪問についてクライアントを一意に特定できる 度目以降の訪問についてクライアントを一意に特定できる についてクライアント Cookie: uid=XXXXXXXXXXXXXXXXXXXXXXXX; ユーザの訪問 初回訪問:cookie無し nginxの設定 再訪問:cookie有り ■/etc/nginx/conf.d/default.confに追加 userid on; userid_name uid; userid_path /; nginx userid_expires 365d; ユーザ tracking用のcookie情 報を送信(初回訪問時 のみ) 初回訪問時のcookie設定イメージ Set-Cookie: uid=XXXXXXXXXXXXXXXXXXXXXXXX; path=/; expires=Thu, 20-Aug-2013 09:25:55 GMT; HttpOnly Copyright(C) 2012 Takeshi Mikami. All rights reserved.
  • 6. アプリケーション上のユーザIDとアクセスログの紐付け 本スライドでは、RailsアプリのユーザIDをアクセスログに紐づける方法を示します。 HTTP応答ヘッダ イメージ HTTP応答ヘッダ イメージ X-App-Userid: 2 X-App-Userid: 2 ユーザIDは送信さ アプリからユーザIDを送信 ⇒アプリから送信した会員IDと アプリから送信した会員 と から送信した会員 れない nginxのログを紐付けできる のログを紐付けできる nginx Rails アプリDB ユーザ Railsアプリへの改修 nginxでユーザID ヘッダを削除 ■「app/controllers/application_controller.rb」 class ApplicationController < ActionController::Base nginxの設定 protect_from_forgery after_filter :add_userid_toheader def add_userid_toheader ■/etc/nginx/conf.d/default.confに追加 response.headers["X-App-Userid"] proxy_hide_header X-App-Userid; = "#{user_signed_in? ? session['warden.user.user.key'][1][0] : nil}" end end Copyright(C) 2012 Takeshi Mikami. All rights reserved.
  • 7. 詳細アクセスログの出力 本スライドでは、詳細アクセスログの出力方法を示します。 nginxの設定 ■/etc/nginx/conf.d/default.confに追加 log_format detail_accesslog nginx '"$time_local","$remote_addr","$uid_got","$upstream_http_x_app_userid","$remote_user","$re quest","$status","$body_bytes_sent","$http_referer","$http_user_agent","$http_x_forwarded_f or","$gzip_ratio"'; access_log /var/log/nginx/detail_access.log detail_accesslog; ※ログ出力フォーマットの指定 trackingID: $uid_got 例)uid=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ユーザID: $upstream_http_x_app_userid 例)2 ログ 出力ログのイメージ "21/Aug/2012:14:10:09 +0900","192.168.199.1","uid=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX","2","-","GET / HTTP/1.1","304","0","-","Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.79 Safari/537.1","-","-" Copyright(C) 2012 Takeshi Mikami. All rights reserved.
  • 8. fluentdによるログ抽出と転送 本スライドでは、fluentdによるログ抽出と転送について示します。 fluentdの設定 ■/etc/fluent/fluent.confに追加 正規表現にマッチ <source> するログを抽出 ログを監視し、条件に type tail 合うログを抽出 format /^"(?<time_local>[^"]*)","(?<remote_addr>[^"]*)","(?<uid_got>[^"]*)","(?<upstream_http_x _app_userid>[^"]*)","(?<remote_user>[^"]*)","(?<request>[^"]*)","(?<status>[^"]*)","(?<bo ログ dy_bytes_sent>[^"]*)","(?<http_referer>[^"]*)","(?<http_user_agent>[^"]*)","(?<http_x_for warded_for>[^"]*)","(?<gzip_ratio>[^"]*)"$/ path /var/log/nginx/detail_access.log pos_file /tmp/td-agent/apache-web.pos tag nginx.access fluentd </source> 抽出 ログ ■/etc/fluent/fluent.confに追加 定期的に <match nginx.access> S3に転送 type s3 aws_key_id <ここにaccess_key_idを入れる> fluentdの設定 aws_sec_key <ここにsecret_access_keyを入れる> s3_bucket <ここにbucket名を入れる> S3 s3_endpoint s3-ap-northeast-1.amazonaws.com path log/ buffer_path /var/log/fluent/s3 time_slice_format /nginx/%Y%m/detail_access-jp.tabine.www-web.log.%Y%m%d%H 抽出 time_slice_wait 10m ログ </match> Copyright(C) 2012 Takeshi Mikami. All rights reserved.