2016.03.14

fluentdでNginxのWebサーバーのアクセスログをオブジェクトで安く保管しちゃう方法

160314_altuscosol_main

ALTUSオブジェクトストレージは非常に廉価で簡単に使えます。しかし、オブジェクトストレージと聞くと従来のファイルストレージと比較して使い方が難しそう、写真や動画を入れるにはいいけど業務での使いどころがなかなか見いだせないと思われている方がいるかもしれません。確かにリレーショナルデータベースサーバーのデータストアの用途であるとか、大規模で高度な計算を必要とするサーバーのメインストレージで使うような頻繁に更新が起こるシステムにはあまり向いていませんが、一定期間大量のデータを保存して後から分析に利用するであるとか、半永久的にバックアップを保存するなどの二次ストレージとして利用する用途として非常に便利なストレージです。
ALTUS オブジェクトストレージ

ALTUS オブジェクトストレージはAmazon S3がベースになっていますので、インターネットのテクノロジーを使ってWebサーバーにアクセスするかのようにストレージシステムを使うことができます。Amazon S3に接続できるサードパーティーのアプリケーションやミドルウェア、またインターネットで公開されているオープンソースが数多くあり、これらを活用して様々な用途で利用できます。

さて、今回はオブジェクトストレージをWebサーバーのログ保存用ストレージとして使う方法を紹介いたします。ここでは、WebサーバーにNginxを使いサーバーのアクセスログを定期的にオブジェクトストレージに保存します。fluentdと呼ばれる便利なログ収集用ミドルウェアがありますので、このソフトウェアを使って環境を構築していきます。


Ⅰ.仮想サーバーとオブジェクトストレージの準備

今回はALTUS Basicシリーズに仮想サーバーを作成し、Webサーバーとfluentdをセットアップします。
下記の資料を参照して仮想サーバーを作成しました。

コンソールから仮想サーバーを作成する場合:
仮想サーバーの作成

 Ⅰ-ⅰ.仮想サーバーの作成
今回用意した仮想サーバーは、次の設定で作成しました。
・ホスト名: nginxServer
・テンプレート: CentOS 6.4 64bit_20140926
・サーバープラン: Custom Server (CPU 2 コア、メモリ 2048 MB)
rootディスク サイズ: 20.00 GB
・アフィニティグループ: 指定なし
・ファイアーウォール通信許可設定(セキュリティーグループ): 受信規則にてTCP 21番ポート(*SSH)80番ポート(HTTP)を開放
・仮想サーバーに静的NATでグローバル IP アドレスを割り当て
*SSHのポート番号は21番を使用しました。

Ⅰ-ⅱ.オブジェクトストレージの利用を開始
ALTUSオブジェクトストレージを利用するために、ポータルの「コンソール」画面からオブジェクトストレージ用のアカウントを有効にします。

160314_altuscosol_capture

オブジェクトストレージのエンドポイントはオブジェクトストレージにアクセスするためのFQDNです。アクセスキー、シークレットキーは認証で使います。この後の、fluentds3cmdの設定でこれらの値を使いますのでメモ帳などに控えておいてください。

 


  • Ⅱ.Webサーバーとfluentdのセットアップ

以下の順番で、Webサーバーとfluentdをセットアップしていきます。

  1. 1.fluentdをインストールします
  2. 2.fluent-plugin-s3のバージョンを変更します
  3. 3.Nginxをインストールし、ベーシック認証を有効にします
  4. 4.s3cmdをインストールし、オブジェクトストレージにログ保存用のバケットを作成します
  5. 5.fluentdをオブジェクトストレージに接続するための設定をします
    6.fluentdを使うためのWebサーバーのセットアップをします

この手順を実施する前に、万一に備えて仮想サーバーのスナップショットを作成することをお勧めします。

 


  • Ⅱ-ⅰ.fluentdのインストール
    ここでは、fluentdtd-agentを使います。

1).仮想サーバーに接続
ローカルマシンのターミナルで、作成した仮想サーバーに割り当てたグローバルIPアドレスを使い、rootユーザーでSSH接続します。

2).パッケージの更新
以下のコマンドを実行して、現在のCentOSのバージョンとカーネルのバージョンを確認します。

# cat /etc/redhat-release
CentOS release 6.4 (Final)
# uname -r
2.6.32-431.29.2.el6.x86_64

ここでは、カーネルのバージョンを変更せずにパッケージを更新します。
そのため、/etc/sysconfig/kernelファイルを下記のように編集します。

# vi /etc/sysconfig/kernel
------------------------------------------
#UPDATEDEFAULT=yes
UPDATEDEFAULT=no
------------------------------------------

以下のコマンドを実行して、パッケージを最新の状態にします。

# yum -y update

以下のコマンドを実行して、アップデート後のCentOSのバージョンとカーネルのバージョンを確認します。

# cat /etc/redhat-release
CentOS release 6.7 (Final)
# uname -r
2.6.32-431.29.2.el6.x86_64

3).fluentdのインストール
以下のコマンドを実行して、td-agentをインストールします。

# curl -L http://toolbelt.treasuredata.com/sh/install-redhat.sh | sh

以下のコマンドを実行して、インストールされたtd-agentのバージョンを確認します。

# td-agent --version
td-agent 0.10.55

以下のコマンドを実行して、fluentdのバージョンを確認することができます。

# /usr/lib64/fluent/ruby/bin/fluentd --version
fluentd 0.10.55

両方ともバージョン0.10.55がインストールされていることが分かります。


Ⅱ-ⅱ.fluent-plugin-s3プラグインのバージョン変更

1).現在のバージョンの確認
fluentdでオブジェクトストレージにログをアップロードするために、fluent-plugin-s3プラグインを使います。
以下のコマンドを実行して、現在インストールされているプラグインのバージョンを確認します。

# /usr/lib64/fluent/ruby/bin/fluent-gem list | grep s3
fluent-plugin-s3 (0.4.1)

上記の例ではバージョン0.4.1がインストールされていることが分かります。このバージョンのプラグインで使われるオブジェクトストレージの認証方式(Amazon S3の署名バージョン)ALTUSオブジェクトストレージでは使えないため、プラグインのバージョンを変更します。

2).プラグインのバージョン変更

ここでは、動作確認済みの0.3.4を使います。以下のコマンドを実行して、現在のプラグインを削除します。

# /usr/lib64/fluent/ruby/bin/fluent-gem uninstall fluent-plugin-s3
Successfully uninstalled fluent-plugin-s3-0.4.1

Successfully uninstalled...と出力されれば削除に成功しています。

以下のコマンドを実行して、プラグインが削除されたことを確認します。

# /usr/lib64/fluent/ruby/bin/fluent-gem list | grep s3
#

今度は何も表示されずにコマンドプロンプトに戻ります。

次に、以下のコマンドを実行して、fluent-plugin-s3バージョン0.3.4をインストールします。

# /usr/lib64/fluent/ruby/bin/fluent-gem install fluent-plugin-s3 --version "= 0.3.4" --no-rdoc --no-ri

Fetching: aws-sdk-1.8.5.gem (100%)
Fetching: fluent-plugin-s3-0.3.4.gem (100%)

~ 途中省略 ~

Successfully installed tzinfo-data-1.2015.7
Successfully installed mini_portile2-2.0.0.rc2
6 gems installed

以下のコマンドを実行して、プラグインのバージョン0.3.4 がインストールされたことを確認します。

# /usr/lib64/fluent/ruby/bin/fluent-gem list | grep s3
fluent-plugin-s3 (0.3.4)

Ⅱ-ⅲ.Nginx のインストールとBasic認証の設定

1).Nginxのインストール
Nginxをmainline からインストールします。
以下のコマンドを実行して、Nginxリポジトリ―をインストールします。

# yum install -y http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm

2).リポジトリ―ファイルの編集
/etc/yum.repos.d/nginx.repo を下記のように書き換えます。

# vi /etc/yum.repos.d/nginx.repo
# baseurl=http://nginx.org/packages/centos/6/$basearch/
baseurl=http://nginx.org/packages/mainline/centos/6/$basearch/

3).Nginxのインストール
以下のコマンドを実行して、Nginxをインストールします。

# yum install -y nginx

4). httpd-toolsのインストール
NginxでBasic認証を使うため、以下のコマンドを実行してhttpd-toolsをインストールします。

# yum install -y httpd-tools

5).Nginxのユーザー作成
以下のコマンドを実行して、Basic認証のユーザー・パスワードを設定します。
ここでは、nginxtestユーザーを作成します。

# cd /etc/nginx
# htpasswd -c .htpasswd nginxtest
New password: nginxtestユーザーのパスワード(任意)
Re-type new password: もう一度入力します
Adding password for user nginxtest

Adding password...が表示されればユーザーの作成に成功しています。

6). Basic認証の設定

Nginxの設定ファイルに以下の行を追加して、Basic認証を有効にします。

# vi /etc/nginx/conf.d/default.conf
server {
listen 80;
server_name localhost;location / {

auth_basic "Restricted";
auth_basic_user_file /etc/nginx/.htpasswd;

}
}

auth_basic_user_fileには5)で作成したBasic認証用ファイル(.htpasswd)のパスを指定します。

  • ・特定のパスにBasic認証を適用したいときは、"location / "を適宜変更します。

 

  • 7). Nginxサービスの起動

    以下のコマンドを実行して、Nginxを起動します。

# service nginx start

以下のコマンドを実行して、Nginxのサービスが正常に起動していることを確認します。

# service nginx status

8). Webサーバーの動作確認
グローバルIPアドレスを使ってNginxにブラウザでアクセスして、Basic認証が有効になっていることを確認します。ローカルマシンのブラウザから、Webサーバーに割り当てられているグローバルIP にアクセスします。

http://グローバルIP/

Nginxにログインするためのユーザー名とパスワードを入力して、Nginxのデフォルト画面が表示されれば、正常にアクセスできています。160314_nginx_scr


  • Ⅱ-ⅳ.s3cmdのインストールとログ保存用のバケット作成
    Nginxサーバーにs3cmdをインストールします。インストールと設定方法は下記 URLを参照しました。
    s3cmdのご利用方法

今回ALTUS環境以外からのアクセスを行わないため、s3cmdの設定のエンドポイントはIDC内の「inter-st.gmocloud.com」を指定します。

s3cmdのインストールおよび設定が完了しましたら、仮想サーバーからオブジェクトストレージへのストレージアクセスを確認するため、以下のコマンド(バケット一覧表示コマンド)を実行し、エラーがないことを確認します。

# s3cmd ls

※まだ、バケットを作成していないため何も表示されません。

以下のコマンドを実行して、ログ保存用のバケットを作成します。
今回はnginxlogバケットを作成します。

# s3cmd mb s3://nginxlog
Bucket 's3://nginxlog/' created

バケットが作成されたことを確認するため、もう一度バケット一覧を表示します。

# s3cmd ls
2016-01-04 06:44  s3://nginxlog

nginxlogバケットを作成できない場合、すでに同じ名前のバケットが存在していることが考えられます(この執筆後にも私が引き続き使っているかもしれません)。この場合、別の名前のバケットを作成してください。

 


  • Ⅱ-ⅴ.fluentdの設定変更
    1). td-agent.confのバックアップ作成
    fluentdをオブジェクトストレージに接続するため、/etc/td-agent.confを編集します。

以下のコマンドを実行して、編集前のtd-agent.confのバックアップを作成します。

# cd /etc/td-agent
# cp -p td-agent.conf td-agent.conf.bak

2). td-agent.confの修正
以下のコマンドを実行して、td-agent.confファイルを一旦空にします。

# cd /etc/td-agent
# cat /dev/null > td-agent.conf

td-agent.confを以下の内容に書き換え、保存します。

<source>
type tail
path /var/log/nginx/access.log
pos_file /var/td-agent/nginx.pos
tag nginx.access
format /^(?<remote>[^ ]*) (?<host>[^ ]*) (?<user>[^ ]*) \[(?<time>[^\]]*)\] "(?<method>\S+)(?: +(?<path>[^ ]*) +\S*)?" (?<code>[^ ]*) (?<size>[^ ]*)(?: "(?<referer>[^\"]*)" "(?<agent>[^\"]*)" "(?<forwarder>[^\"]*)")?/
time_format %d/%b/%Y:%H:%M:%S %z
</source><match nginx.access>
type s3
aws_key_id XXXXXXXXXXXXXXXXXXXX
aws_sec_key XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
s3_bucket nginxlog
s3_endpoint inter-st.gmocloud.com
check_apikey_on_start false
s3_object_key_format %{path}%{time_slice}_%{index}.%{file_extension}
path logs/
buffer_path /var/log/fluent
flush_interval 10s
time_slice_format %Y%m%d-%H
</match>

aws_key_id      オブジェクトストレージのアクセスキーを入力します。
aws_sec_key     オブジェクトストレージのシークレットキーを入力します。
s3_bucket       ログ保存用に作成したバケット名を入力します。
s3_endpoint     IDC内のエンドポイントを入力します。
NginxのログフォーマットはApacheと異なり、上記のように設定すると「pattern not match」エラーを回避できます。


Ⅱ-ⅵ.fluentdを使うためのWebサーバーのセットアップとfluentdの起動
1). fluentdが利用するディレクトリの作成

以下のコマンドを実行して、/var/log/fluentディレクトリと/var/td-agentディレクトリを作成し、それぞれのディレクトリのオーナーの変更を下記のように行います。

# mkdir /var/log/fluent
# chown td-agent:td-agent /var/log/fluent
# mkdir /var/td-agent
# chown td-agent:td-agent /var/td-agent/

2). fluentdの起動

以下のコマンドを実行して、fluentdを起動します。

# service td-agent start

以下のコマンドを実行して、fluentdが正常に起動していることを確認します。

# service td-agent status
td-agent (pid 19136) is running...

td-agent (pid  XXX) is running... と表示されれば正常に起動しています。

  • 以下のコマンドを実行して、サーバー再起動後に自動でtd-agentを起動するようにします。

  • # chkconfig td-agent on
  • 以下のコマンドを実行して、設定が有効になっていることを確認します。

    • # chkconfig td-agent --list

      Ⅲ.動作確認

1)ブラウザからグローバルIPへアクセス
もう一度ローカルマシンのブラウザから、Webサーバーに割り当てられているグローバルIP にアクセスします。

http://グローバルIP/

Nginxのデフォルト画面が表示されれば、正常にアクセスできています。

今度は、ブラウザで複数回アクセスしてみてください。CNTL+F5ボタンを押下するとブラウザをリフレッシュできます。

2) オブジェクトストレージにログが保存されていることの確認
s3cmdコマンドでアクセスログがオブジェクトストレージに保存されていることを確認します。ログファイルは前項で作成したバケットの下のlogsというディレクトリに保存されます。
以下のコマンドを実行して、オブジェクトストレージにログが保存されていることを確認します。

# s3cmd ls s3://nginxlog/logs/
2016-01-04 10:14       348   s3://nginxlog/logs/20160104-19_0.gz
2016-01-05 02:22       321   s3://nginxlog/logs/20160105-11_0.gz
2016-01-05 02:22       317   s3://nginxlog/logs/20160105-11_1.gz

※ログファイルは圧縮した状態で保存されます。
logsディレクトリの後にスラッシュ(/)を入れるとディレクトリの下にあるファイル名  (、ディレクトリ名)の一覧を確認できます。

3) アクセスログの解凍
確認のため、以下のコマンドを実行して、オブジェクトストレージに保存されたアクセスログをNginxサーバーのローカルマシン上にダウンロードして解凍します。

# cd /tmp
# s3cmd get s3://nginxlog/logs/20160105-11_1.gz
# gunzip 20160105-11_1.gz

ログファイルを解凍したらアクセスログの中を確認します。

# head 20160105-11_1
2016-01-05T11:22:29+09:00       nginx.access    {"remote":"xxx.xxx.xxx.xxx","host":"-","user":"nginxtest","method":"GET","path":"/","code":"200","size":"612","referer":"-","agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36","forwarder":"-"}~ 途中省略 ~

nginxtestユーザーからのアクセスが記録されていることが分かります。
xxx.xxx.xxx.xxx には送信元のIPアドレスが入ります。


  • Ⅳ.最後に

ALTUS オブジェクトストレージは、ここで紹介しましたログストレージ以外にも様々な用途で安価に利用できます。ストレージにはHTTPベースのシンプルなAPIでアクセスできますので複雑な設定なしにすぐに利用できます。オブジェクトストレージはURIをキーとして、ファイル(オブジェクト)そのものをバリューとした一種のキーバリューストアに例えることができますので、このような特徴があることを知っていると、特にプログラマーの方にとってはより理解が深まるかもしれません。

本記事が今後の業務にお役に立てば幸いです。

 


  • Ⅴ.参考情報

仮想サーバーの作成

s3cmdのご利用方法

nginx: Linux packages

Getting Data From Nginx Into S3 Using Fluentd

bna_storage

この記事を書いた人

東京エレクトロンデバイス 中林稔

東京エレクトロンデバイス 中林稔

東京エレクトロン デバイス株式会社 CNカンパニー社員。
これまで、ネットワーク、セキュリティ関連の技術者として従事しており、
現在はインフラ周りのソフトウェアを研究中です。
弊社のホームページでは様々なITソリューションを紹介していますので
お悩みがあれば、お気軽にご相談ください。

http://cn.teldevice.co.jp/

インタビュー記事

この記事を書いた人

東京エレクトロンデバイス 中林稔

東京エレクトロンデバイス 中林稔

東京エレクトロン デバイス株式会社 CNカンパニー社員。
これまで、ネットワーク、セキュリティ関連の技術者として従事しており、
現在はインフラ周りのソフトウェアを研究中です。
弊社のホームページでは様々なITソリューションを紹介していますので
お悩みがあれば、お気軽にご相談ください。

http://cn.teldevice.co.jp/

IoTの窓口

docker-tips_bnr

writer