Mais conteúdo relacionado
Semelhante a Rails3+devise,nginx,fluent,S3構成でのアクセスログ収集と蓄積 (20)
Mais de Takeshi Mikami (20)
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.