Raspberry PiにWEBページのログ解析ソフトwebalizerを導入してWEBサイトへのアクセス統計をブラウザから確認できるようにします。
せっかく自分でサーバーを立てたので、WEBページにコードを埋め込む方式ではなくApacheのログを解析する方式にしてみました。
他にもAWStatsというソフトもあるようですが、Raspberry Piのコミュニティではwebalizerを使えと書かれていました。(http://www.raspberrypi.org/forums/viewtopic.php?t=49915&p=387773)
実はこの前にAWStatsをインストールしてみましたが、セキュリティホールがあるようなので敬遠してwebalizerに変更。
Webalizerでは自分自身によるアクセスを分離することができないようなので、事前準備としてApacheのログを分割して自分自身のアクセスやロボットによる検索を別ファイルで保存するように設定します。
過去ログは全部いっしょくたになっていますが、月別に表示できるので今日中に設定すれば6月以降のログは分離した状態で表示できるようになる目論見です。
今回の流れ
1.Apacheのログの分割設定とローテーション設定
2.webalizerのインストール
3.webalizerの設定
4.解析の実行
参考URL
お便利サーバー.com
Apacheでログを振り分ける
デフォルト以外のアクセス解析
Webalizerの設定ファイル(webalizer.conf ) の簡単解説
Webalizer DNS インフォメーション
【1.Apacheのログの分割設定とローテーション設定】
さて、設定を行う前にどんな分割設定にするのがいいか考えてみます。
前提として、個人サイトなのでそれほど厳密にアクセス解析する必要はありません。
必要に応じてあとで修正もできるので大雑把に運営するうえで必要な切り分けを考えます。
まず、自分自身のアクセスは含まないようにします。
アクセス数が少ないので自分のアクセスを含むとほとんど自分のアクセスになってしまい解析の統計的な意味がなくなってしまいます。
自分のアクセスはLAN内からのアクセスとiPhoneからのアクセスの2つがありますが、iPhoneからのアクセスはそれほど頻度が無いのでLAN内からのアクセスのみを選別してやればよさそうです。
次に検索エンジンのロボットによるアクセスも別にします。
ロボットのアクセスは非常に多種多様にあって、すべてを切り分けるのはしんどいです。
なので今までのログをみて大量のアクセスを行っているロボットに限定してログを分けます。
最後に、攻撃試行と思われるアクセスの切り分けですが、いまはやめておきます。
まだサイト公開して1カ月程度ですが、すでに毎日攻撃試行と思われるアクセスがあります。
今まで成功した様子は無く、大抵が404エラー(Not found)に分類されているので、まだはいいかな?
ログもどうなっているかよく分からない状態なので、もう少し調べてから実施することにします。
んでは、さっそくApacheに設定を追加していきます。
Raspbian(Debian)のapacheをデフォルトの状態で使っているなら、変更するファイルは/etc/apache2/sites-available/defaultです。
コピーして自サイト用のファイルを作成している場合はそちらを編集します。
設定の大枠は
SetEnvIfエントリーを追加し分離する条件に合致するアクセスに環境変数(ENV 分類名として使う)を登録
→CustomLogエントリでこのENVごとにログファイルを分ける
という処理になります。
設定ファイル変更内容
ファイルの最後のほうにある以下ログ出力の設定をコメントアウト
#CustomLog ${APACHE_LOG_DIR}/access.log combined
①分割条件を追加
# 自分自身のアクセス
# ローカルIPによるアクセスに”ownlog”と”nolog”と2つの環境変数を付けてます。
# 2行目はraspberry pi自身によるアクセスも同様の処理をしています。
SetEnvIf Remote_Addr “192.168.0.” ownlog nolog
SetEnvIf Remote_Addr “127.0.0.1” ownlog nolog
# ロボットによるアクセス
# ここは私のLogにあったロボットを主にUser-Agentで選別してます。一部選別できなかったものはIPアドレスで選別。
# ロボットと思われるアクセスに対しては”robotlog”と”nolog”の2つの環境変数を付加してます。
SetEnvIf User-Agent “Googlebot” robotlog nolog
SetEnvIf User-Agent “bingbot” robotlog nolog
SetEnvIf User-Agent “MJ12bot” robotlog nolog
SetEnvIf User-Agent “YahooFeedSeeker” robotlog nolog
SetEnvIf User-Agent “ichiro/mobile goo” robotlog nolog
SetEnvIf User-Agent “360Spider” robotlog nolog
SetEnvIf User-Agent “SurveyBot” robotlog nolog
SetEnvIf User-Agent “ia_archiver” robotlog nolog
SetEnvIf Remote_Addr “208.43.225.84” robotlog nolog
SetEnvIf Remote_Addr “208.43.225.85” robotlog nolog
SetEnvIf User-Agent “crowler” robotlog nolog
②環境変数でログを分ける。
# まず環境変数がownlog(自分自身のアクセス)となっているものはaccess_own.logとして保存。
# つぎに環境変数 robotlog(ロボットのアクセス)はaccess_robot.logとして保存。
# 最後にそれ以外のログをaccess.logに保存。これは環境変数nologが付いたアクセスを記載しないことで実現。
CustomLog ${APACHE_LOG_DIR}/access_own.log common env=ownlog
CustomLog ${APACHE_LOG_DIR}/access_robot.log combined env=robotlog
CustomLog ${APACHE_LOG_DIR}/access.log combined env=!nolog
ログローテーション設定
Apacheのログは肥大化しないようにlogrotateというプログラムで古いものが別名保存されていき、ある一定期間で順番に古いものから削除されていくようになっています。
アクセス解析を実施するにあたって、このログローテーションを毎日行うようにし、別名保存された前日分のログに対して解析を行うように設定したいと思います。(最新のログファイルで実施しないのは、ログ解析中に新たにログが書き換わることを嫌っての対応です。)
logrotateは初期状態でインストールされているのでApache用の設定ファイルを変更します。
sudo vi /etc/logrotate.d/apache2
以下のように変更しました。
・ログローテーション間隔を1週間毎→毎日に変更
・保存ログの個数を52(52週=1年)から90(90日=3か月)に変更。
/var/log/apache2/*.log {
#weekly
daily
missingok
#rotate 52
rotate 90
compress
delaycompress
notifempty
create 640 root adm
sharedscripts
postrotate
/etc/init.d/apache2 reload > /dev/null
endscript
prerotate
if [ -d /etc/logrotate.d/httpd-prerotate ]; then \
run-parts /etc/logrotate.d/httpd-prerotate; \
fi; \
endscript
}
webalizerもインストールした時点で/etc/cron.dailyに登録されていて毎日実行されるようになります。
cron.dailyで実行される順番は実行スクリプトのファイル名順で、cron.daily内に登録されているスクリプト名はそれぞれlogrotateとwebalizerになっているので、webalizerのが後に実行されるはず。なので、実行順の設定はいじりません。
【2.webalizerのインストール】
アパッチのログ分割設定が終わったのでwebalizerをインストールします。
インストールはコマンド一発で終了です。
sudo apt-get install webalizer
【3.webalizerの設定】
デフォルト設定ファイルは/etc/webalizer/webalizer.confです。
また日々のログ解析は/etc/cron.daily/webalizerによって実行されます。
この日々実行させるスクリプトを見ると、/etc/webalizer/ディレクトリにある.confファイルを全て実行するようなので、分割した各ログファイル毎に設定ファイルを書いて設定ファイルディレクトリにぶち込んでおけば、あとは毎日自動実行してくれそうです。
解析結果ファイル用ディレクトリの作成
設定に入る前に解析結果を保存するディレクトリを作成します。
結果はhtmlで出力されるのでwwwのドキュメントルート以下にwebalizerディレクトリを作ってここに入れるようにします。
また、今回ログを3つに分割しましたが自分のログは解析不要なので、webalizerディレクトリ以下にデフォルトログの結果を保存し、直下にrobotディレクトリを作ってそこにロボットのアクセス解析結果を入れるようにします。
以下、doc_root部は自分の環境に合わせて変更してください。
mkdir /var/www/doc_root/webalizer
mkdir /var/www/doc_root/webalizer/robot
デフォルト設定ファイルの設定
まずデフォルトの設定ファイルで設定します。
sudo cp /etc/webalizer/webalizer.conf /etc/webalizer/webalizer.conf.org
sudo vi /etc/webalizer/webalizer.conf
・30行目付近 解析するログファイルを指定します。
デフォで1つ前のログファイルが指定されている。ローテーション後のファイルはこの名前になるのでそのままにしておく。
LogFile /var/log/apache2/access.log.1
・45行目付近 解析結果の出力先
デフォルトで/var/www/webalizerが指定されています。
WWWのドキュメントルートを変更している場合はドキュメントルートの下になるよう変更します。
例えば以下のように。
OutputDir /var/www/doc_root/webalizer
・70行目付近 解析結果を追記にする
過去の解析結果に最新の結果を追加していくように変更します。
#Incremental no
Incremental yes
・97行目付近 ホスト名
変えなくてもOK。デフォはシステムでhostnameに設定されている値になる。私はドメインに変更。
変更例
HostName yourdomain.com
・115行目付近 対象アクセスタイプ
plも解析対象に追加します(コメントアウトを外す)。他の追加もお好みで。
PageType pl
・174行目付近 DNSキャッシュを有効にします。
DNS lookupを行い、ログのIPアドレスをホスト名へ変更するために必要なのでコメントアウトを外します。
DNSCache dns_cache.db
・188行目付近 DNSキャッシュ作成プログラムの実行数
DNS lookupを実施する子プロセスの数を指定します。多くするとスピードは上がりますが多くのCPUパワーが必要。5ぐらいにしておきます。コメントアウトを外して数字を0→5に変更
DNSChildren 5
・250行目付近 出力HTMLヘッダにcharset宣言追加
一応この設定で検索文字列も文字化けせず出力されている。
HTMLHead <META HTTP-EQUIV=”content-Type” CONTENT=”text/html; charset=UTF-8″>
・720行目付近 サーチエンジンの設定
サーチエンジンのアクセスワードの読み込み設定です。yahooがyahoo.comのみになっているので以下のように設定してyahoo.co.jpも検索に引っかかるようにします。あと、MSのbingも検索エンジンに追加しておきます。
SearchEngine yohoo.com p=
↓ 変更
SearchEngine .yahoo. p=
以下追加
SearchEngine bing.co q=
※日本語化はしていません。
日本語化する場合は、以下を実施するといいみたいです。
①truetypeフォントをインストール
②フォントディレクトリを指定。以下は例。
TrueTypeFont /usr/share/fonts/truetype/kochi/kochi-gothic.ttf
ロボット用の設定ファイル作成
先に作ったデフォの設定ファイルをコピーして編集します。
sudo cp /etc/webalizer/webalizer.conf /etc/webalizer/robot.conf
sudo vi /etc/webalizer/robot.conf
・30行目付近 ログファイルをボット用のログファイルに変更
LogFile /var/log/apache2/access_robot.log.1
・45行目付近 結果の保存場所を変更
OutputDir /var/www/doc_root/webalizer/robot
・174行目付近 DNSキャッシュはデフォルトと一緒のものを使うことにします。
DNSCache ../dns_cache.db
【4.初期解析の実行】
今までのログが溜まっているので初期の解析を実行して過去のアクセス解析を出力しておきます。
DNSキャッシュの作成
Apacheログ内のIPアドレスをホスト名へ変換した結果を保持するキャッシュを作成し、ログ解析の時間短縮を行います。
一度作っておけばあとはこのファイルが使われます。作成は以下のコマンド一発
webazolver
暫く待つと解析ファイルのディレクトリ(/var/www/doc_root/webalizer)にデータベースファイルが作成されます。
デフォルトログの解析実施
デフォルトのログファイルの解析を実行します。
古いログは/var/log/apache2/以下のaccess.log.1、access.log.2.gz、…(これ以降数字が増えていく)です。
これら古いもの(末尾の数字の大きいもの)から順に解析を実施します。
webalizer -c /etc/webalizer/webalizer.conf /var/log/apache2/access.log.4.gz
webalizer -c /etc/webalizer/webalizer.conf /var/log/apache2/access.log.3.gz
webalizer -c /etc/webalizer/webalizer.conf /var/log/apache2/access.log.2.gz
webalizer -c /etc/webalizer/webalizer.conf /var/log/apache2/access.log.1
webalizer -c /etc/webalizer/webalizer.conf /var/log/apache2/access.log
続いてロボットのログについても一度解析を実施します。
webalizer -c /etc/webalizer/robot.conf /var/log/apache2/access_robot.log
設置は以上です。
自サイトのアドレスに/webalizerをつけてアクセスすればアクセス解析が見られます。
ロボットの解析結果は/webalizer/robotをつけてアクセス
これだと外部からもアクセス出来てしまうので、嫌な場合は.htaccessファイルで制御します。
以下、ローカル内からにアクセス制限する場合の例です。
vi /var/www/doc_root/webalizer/.htaccess
以下を記載して保存終了
order deny,allow
deny from all
allow from 192.168.0.
allow from 127.0.0.1
allow from localhost
以上でログ分割とアクセス解析の導入は終了です。
2014年5月31日作成
2014年6月1日公開
2014年6月15日誤記訂正