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ディレクトリ以下にログファイルが生成されていれば成功.

 

EC2インスタンス上でfluentdを動かしてみたメモ

EC2インスタンスのAMIはUbuntu Server Cloud Guest 11.10 64Bitを使用. パッケージはfluentdの安定版をRubyインタープリタ等込みでパッケージングしているtd-agentを利用する. 

    1. fluentd(td-agent)をインストール
      Treasure Data社のDebian/Ubuntu用ドキュメントを参照しながらapt-get用のリポジトリを追加し,インストール(RedHat/CentOS用はこちら).
      > sudo apt-add-repository 'deb http://packages.treasure-data.com/debian/ lucid contrib'
      > sudo apt-get update
      > sudo apt-get install td-agent
    2. 動作検証
      動作検証用に設定ファイルを下記のように編集する.
      > sudo vi /etc/td-agent/td-agent.conf
       <match debug.**>
        type file
        path /var/log/fluentd/debug.log
      </match>
      <source>
        type tcp
      </source>
      td-agentユーザに所有権を設定したログディレクトリを作成し, デーモンを起動.
      > mkdir -p /var/log/fluentd
      > chown td-agent:td-agent /var/log/fluentd
      > sudo /etc/init.d/td-agent start 

      fluent-catコマンドでメッセージを送信し, '/var/log/fluentd/'以下にログが作成されていれば正常に動作している.
      > echo '{"json":"message"}' | /usr/lib/fluent/ruby/bin/fluent-cat debug.test
      > less /var/log/fluentd/debug.log.***

Mac上で手軽にMapReduceする環境を構築するメモ

Macのローカル上で手軽にMapReduceジョブ開発をしたくなったので色々やってみた.
Cloudera社がHadoopが動作するLinuxのVMイメージを提供しているので, Macの環境を汚さずにHadoop環境がローカルに構築できます.

  1. CDH3のVMイメージをダウンロード.
    僕はVMWare Fusion用をダウンロードしましたが、 VirtualBox用イメージもあるのでフリーで環境構築できるはず.
  2. CDH3用のHadoop Eclipse Pluginをダウンロード.
    Hadoop Eclipse PluginはHadoopをソースからビルドすると生成されるんですが(参考),CDH3にバンドルされているHadoopとの接続に問題があるらしいので代わりにこちらをダウンロード. 
  3. Hadoop Eclipse Pluginをインストール.
    eclipseホームディレクトリ以下のpluginsディレクトリに2.でダウンロードしたjarファイルをコピーするだけ.
    > cp hadoop-eclipse-plugin-0.20.2-cdh3u0.jar /Applications/eclipse/plugins
  4. CDH3のVMを起動, ホストOS(Mac OS)側からSSHで接続確認.
    正常にVMが動作していればSSHで接続できます(ユーザ名・パスワード共にcloudera).
    CDH3> ifconfig # VMのIPアドレスを確認
    > ssh cloudera@192.168.*.* # IPアドレスは上記で確認したものを入力
  5. eclipseからVM上のHadoopに接続.
    Window > Open Perspective > Other > Map/Reduceでパースペクティブを変更.
    Map/Reduce Locationsビュー(Eclipseウインドウ下部コンソールの並びにある)を選択し, 右上の"New hadoop location..."を選択.
    Hostに上記IPアドレス, Map/Reduce MasterのPortに8021, DFS MasterのPortに8020, User nameにclouderaを指定.
  6. Project ExplorerのDFS LocationsからHDFSが見えているか確認.
  7. MapReduce Jobのプロジェクトを作成
    New > Other > Map/Reduce Project 

nginx + uWSGI + Pyramidでウェブアプリを動かす

Pyramidアプリをnginx上で動かしてみた. nginxはビルトインでuWSGI連携をサポートしているのでPyramidデフォルトのwaitressではなくuWSGIを利用.

  1. 下準備
    > yum install python-devel
    > easy_install virtualenv
  2. Pyramidインストール
    > mkdir -p /path/to/app; cd /path/to/app
    > virtualenv env
    > source env/bin/activate
    > pip install pyramid
    > pcreate -s starter MyProject
    > cd MyProject
  3. uWSGIインストール
    > pip install uwsgi
    python-develパッケージがインストールされていないとエラーになるので注意. 
  4. development.ini / production.iniにuWSGI連携設定を追加
    Pyramidはデフォルトでwaitress用の設定しか無いので, uWSGIのサイトを参考に設定ファイルにuWSGI用設定を追記.
  5. nginxにuWSGI連携を設定.
    nginxのサイトを参考に, nginx.confにHttpUwsgiModuleの設定を追記.
  6. uWSGIを起動
    > uwsgi --ini-paste-logged developmenet.ini
  7. nginxの設定を再読み込み
    > /etc/init.d/nginx reload 

参考ページ: Pyramid + Nginx + uWSGI + MySQL

EC2環境上でのNginxセットアップ

Amazon Linux 64bitのインスタンス上でnginxを動かすまでのメモ.
Amazon Linuxのyumリポジトリにあるものはバージョンが古い(記事現在0.8系)のでソースからビルド.
  1. EC2インスタンス起動
  2. yum updateで最新状態へ更新
    > sudo su -
    > yum update 
  3. 依存するパッケージをインストール
    > yum install gcc make pcre pcre-devel zlib zlib-devel openssl openssl-devel  
  4. nginxサイトからソースをダウンロード
    > mkdir /usr/local/src; cd /usr/local/src
    > wget http://nginx.org/download/nginx-1.0.12.tar.gz
    > tar xvzf nginx-1.0.12.tar.gz
    > cd ..; mv src/nginx-1.0.12 .
    > ln -s nginx-1.0.12 nginx
  5. ビルド
    > cd /usr/local/nginx
    > ./configure
    > make install
  6.  Initスクリプトを設置(サンプル)
    /etc/init.d/nginxにスクリプトを設置.
    NGINX_CONF_FILEがconfファイルの設置先なので/etc/nginx/confへ変更.
    'nginx=/usr/sbin/nginx'をインストールしたnginxバイナリのパス(/usr/local/nginx/sbin/nginx)へ変更.
     > chkconfig --add nginx
  7. 設定ファイルを設置
    > mkdir -p /etc/nginx/conf
    > cp /usr/local/nginx/conf/* /etc/nginx/conf/ 
  8. 起動
    > /etc/init.d/nginx start