nozaq's diary

ソーシャルな会社でデータ解析やマイニングやってます。 その前は起業してベンチャーやってました。更に前は未踏とかやってました。http://twitter.com/nozaq

EC2インスタンス上でnginxのログをfluentd経由でS3へ飛ばしてみる

このエントリでEC2インスタンスにfluentdをインストールした続き. EC2インスタンスのAMIはUbuntu Server Cloud Guest 11.10 64Bitを使用. 

  1. nginxをインストール
    公式ドキュメントを参考に, apt-get用リポジトリにnginxを追加.
    > cd work_dir # 適当な作業ディレクトリへ異動
    > wget http://nginx.org/keys/nginx_signing.key
    > sudo apt-key add nginx_signing.key
    > sudo vi /etc/apt/sources.list
    ファイル末尾に下記リポジトリを追加.
    deb http://nginx.org/packages/debian/ squeeze nginx
    deb-src http://nginx.org/packages/debian/ squeeze nginx 
    > sudo apt-get update
    > sudo apt-get install nginx
    > sudo service nginx start
    ブラウザで80番ポートにアクセスして"Welcome to nginx!"が見えたら成功.
  2. nginxのLogFormatをApacheと合わせる
    fluentdには標準でapacheのCombined形式ログを読み込む処理が組み込まれているので, それを利用すべくnginxのLogFormatを以下に変更する.
    > sudo vi /etc/nginx/nginx.conf
         log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                          '$status $body_bytes_sent "$http_referer" '
                          '"$http_user_agent"'; 
  3. fluentdでaccess_logの更新を監視
    nginxログファイルの更新を監視し, 自動で収集するように設定する. まだS3連携はせず, ローカルファイルに出力できるか確認.
    > sudo vi /etc/td-agent/td-agent.conf
    <source>
      type tail
      format apache
      path /var/log/nginx/access.log
      tag nginx.access
    pos_file /tmp/td-agent/nginx.pos </source> <match nginx.access> type file path /var/log/fluent/access_log
    </match>  
    > mkdir -p /tmp/td-agent
    > sudo chown td-agent:td-agent /tmp/td-agent
    > sudo service td-agent restart 
  4. nginxへHTTPリクエストを投げて動作テスト
    > curl http://localhost
    > cat /var/log/fluentd/access_log.*
    リクエスト内容が出力されれば正常に動作している.
  5. fluent-plugin-s3を設定
    > sudo /usr/lib/fluent/ruby/bin/fluent-gem install fluent-plugin-s3

    Githubリポジトリ内の説明を参考に設定ファイルを編集. 先程の<match nginx.access>...</match>内を以下のように変更する.
    この設定ではログファイルがバッファリングされてすぐにS3へ反映されないので, #でコメントアウトしてあるflush_intervalを短め(例では5秒)に設定してやると動作確認がやりやすい.
    > sudo vi /etc/td-agent/td-agent.conf
     <match pattern>
      type s3
    
      aws_key_id YOUR_AWS_KEY_ID
      aws_sec_key YOUR_AWS_SECRET/KEY
      s3_bucket YOUR_S3_BUCKET_NAME
      s3_endpoint s3-ap-northeast-1.amazonaws.com
      path logs/
      buffer_path /var/log/fluent/s3
    
      time_slice_format %Y%m%d-%H
      time_slice_wait 10m
    #flush_interval 5s utc </match>
    > sudo service td-agent restart  
  6. nginxへHTTPリクエストを投げて動作テスト
    > curl http://localhost
     S3の指定したバケット直下logsディレクトリ以下にログファイルが生成されていれば成功.