このページではWebサーバーApache/httpdWebalizerによるアクセス解析結果で検索文字列の日本語化についてビギナー向けに解説します。
お便利サーバー.com+相互リンクサイト内をキーワードで検索
webalizerでアクセス解析

Webアクセス解析とは

Webalizer日本語版の導入

Webalizerの基本設定

httpdログの構造を理解する

Apacheでログを振り分ける

検索文字列の日本語化

統計データの見方について

解析データの最適化と分析法

解析スケジュールの設定

デフォルト以外のアクセス解析


検索文字列の「文字化け」を解消する

Webalizer は比較的不具合が少ない アプリケーション ですし、適当に インストール を行えば日本語でタイトルを表示することもできます。 Webalizer日本語版の導入について

ところが一つとても困ることがあります。

それは "Total Search Strings" の解析結果、つまり「どういった言葉で検索されたページからアクセスされたのか」という情報が文字化けしてしまうことです。

実は、Googleを始めとする検索サイトの多くは日本語、中国語などの2 バイト 文字で検索が行われるとき、他の言語との整合性をとるために UTF-8 文字コードセット を変換してから検索を行うようになっています。

そしてその検索結果はそのまま ログ データの リファラー の位置に記録されるわけですが、Webalizer自身はこれを自分自身の表示文字セットである EUC に変換する機能を持っていないため、UTF-8のまま表示してしまうために「文字化け」となってしまうわけです。

この "Total Search Strings" は、この コンテンツ がどういう検索語で「引っ掛けられているのか」を知る上でとても重要な解析データなので、これはなんとか対策し、きちんと検索語が表示できるようにしたいものです。

要は、UTF-8に変換されている文字をEUCに変換し直せば良いわけですから、

1.ログファイル中でUTF-8に変換されている文字列をEUCに変換した別のログファイルを作成し、そのログファイルに対してWebalizerによる解析処理を行う。

2.Webalizerでよる解析処理で出力された HTML ファイルの中でUTF-8に変換されている文字列をEUCに変換してHTMLファイルを作り直す。

という二つの方法が考えられます。

結果としてはどちらも同じになるはずですが、膨大な容量になる可能性のあるログファイルに対して直接変換処理を行う1.よりも、既に解析が終わってデータ量が小さくなっている解析結果に対して処理を行う2.のほうが ホスト機 への負担も小さく、処理にかかる時間も少ないので、ここでは2.の方法について解説します。

文字コードの変換には日本語の扱いに長けた Perl を利用し、ファイル操作にはファイル処理に長けた bash を利用し、それぞれの シェル スクリプト を組み合わせて変換システムを作ります。作業は、

1.文字コード変換に必要なPerlのモジュールを インストール する。

2.文字コード変換用のシェルスクリプトを作成する。

3.Webalizer実行用のシェルスクリプトを作成する。

4.作成した3.を crond で自動実行できるように設定する。

という手順で行います。

このページの先頭へ↑

日本語処理モジュール"Jcode.pm"のインストール

Jcode.pm は、 Perl を使って日本語の様々な文字コードを相互に変換することを可能にするモジュールです。

この お便利サーバー.com のアクセス解析結果を公開中ですのでご覧ください。
メインコンテンツのアクセス解析結果 お便利サーバー.com
お便利サーバー.comへの検索ロボットのアクセス状況 検索ロボット

このモジュールは今回行う Webalizer の文字化け対策だけではなく、 Webサーバー 上で CGI を利用する際も利用できますから、ぜひ インストール しておきましょう。

Jcode.pmは、 "CPAN" という Perl のライブラリ サーバー から、使用中のバージョンのPerlに対応するものを簡単にインストールすることができます。

まず、 サブネット 内の適当な クライアント機 から SSHクライアント 構築中のLinuxサーバー ログイン します SSHクライアントでサーバーに接続する(WBEL3) SSHクライアントでサーバーに接続する(CentOS3) SSHクライアントでサーバーに接続する(WBEL4) SSHクライアントでサーバーに接続する(CentOS4) SSHクライアントでサーバーに接続する(CentOS5)

CPAN は結構接続が切れやすいので、接続が怪しい状況(のような)メッセージが表示されるときは Ctrl+c で操作を中断し、最初からやり直してください。
なお、このとんでもなく面倒な接続作業が必要なのは最初の一回だけです。次からはすぐ "cpan>" が表示されるようになります。
安心してください。
また、既に CPANへの接続設定(Pop-before-smtpのインストール) などで一度CPANの接続設定を済ませている場合は、 "perl -MCPAN -e shell" を実行するとすぐにCPANを利用できる状態になります。

それから su コマンド アカウント "root" に変更し、以下のようにコマンドを実行して接続設定を行います。

なお、以下はWBEL3での接続設定の際のメッセージですが、これはサーバーの構成により異なる場合があります。

[tanaka@web1 ~]$ su -Enter
Password: "root"のパスワードを入力します。 Enter
[root@web1 ~]# perl -MCPAN -e shellEnter

/usr/lib/perl5/5.8.0/CPAN/Config.pm initialized.


CPAN is the world-wide archive of perl resources. It consists of about
100 sites that all replicate the same contents all around the globe.
Many countries have at least one CPAN site already. The resources
found on CPAN are easily accessible with the CPAN.pm module. If you
want to use CPAN.pm, you have to configure it properly.

If you do not want to enter a dialog now, you can answer 'no' to this
question and I'll try to autoconfigure. (Note: you can revisit this
dialog anytime later by typing 'o conf init' at the cpan prompt.)

Are you ready for manual configuration? [yes]Enter

      .
      .
  以下20くらい質問が続きますが、すべて
Enterで回答します。
      .
      .


First, pick a nearby continent and country (you can pick several of
each, separated by spaces, or none if you just want to keep your
existing selections). Then, you will be presented with a list of URLs
of CPAN mirrors in the countries you selected, along with previously
selected URLs. Select some of those URLs, or just keep the old list.
Finally, you will be prompted for any extra URLs -- file:, ftp:, or
http: -- that host a CPAN mirror.

(1) Africa
(2) Asia
(3) Central America
(4) Europe
(5) North America
(6) Oceania
(7) South America
Select your continent (or several nearby continents) [] 2(Asiaを選びます)Enter
Sorry! since you don't have any existing picks, you must make a
geographic selection.

(1) China
(2) Hong Kong
(3) India
(4) Indonesia
(5) Iran
(6) Israel
(7) Japan
(8) Malaysia
(9) Philippines
(10) Republic of Korea
(11) Russian Federation
(12) Saudi Arabia
(13) Singapore
(14) Taiwan
(15) Thailand
(16) Turkey
Select your country (or several nearby countries) [] 7(Japanを選びます)Enter
Sorry! since you don't have any existing picks, you must make a
geographic selection.

(1) ftp://ftp.dti.ad.jp/pub/lang/CPAN/
(2) ftp://ftp.jaist.ac.jp/pub/lang/perl/CPAN/
(3) ftp://ftp.kddilabs.jp/CPAN/
(4) ftp://ftp.nara.wide.ad.jp/pub/CPAN/
(5) ftp://ftp.ring.gr.jp/pub/lang/perl/CPAN/
(6) ftp://ftp.u-aizu.ac.jp/pub/CPAN
(7) ftp://ftp.yz.yamagata-u.ac.jp/pub/lang/cpan/
(8) http://ftp.cpan.jp/
Select as many URLs as you like,
put them on one line, separated by blanks [] 5(1〜8の任意の数字)Enter  

Enter another URL or RETURN to quit: []Enter
New set of picks:
 ftp://ftp.ring.gr.jp/pub/lang/perl/CPAN/


WAIT support is available as a Plugin. You need the CPAN::WAIT module
to actually use it. But we need to know your favorite WAIT server. If
you don't know a WAIT server near you, just press ENTER.

Your favorite WAIT server?
  [wait://ls6-www.informatik.uni-dortmund.de:1404]Enter


commit: wrote /usr/lib/perl5/5.8.0/CPAN/Config.pm

cpan shell -- CPAN exploration and modules installation (v1.61)
ReadLine support available (try 'install Bundle::CPAN')

cpan>

"cpan>" が表示されたら接続完了です。

引き続き次のようにタイプして Jcode.pm のインストールを行ってください。

通信環境などによっては数分以上かかる場合がありますので、気長に待ちましょう。

cpan> install JcodeEnter

      .
      .
  しばらく色々メッセージが表示されます。
      .
      .


Installing /usr/share/man/man3/Jcode::Unicode::Constants.3pm
Installing /usr/share/man/man3/Jcode.3pm
Installing /usr/share/man/man3/Jcode::Unicode::NoXS.3pm
Writing /usr/lib/perl5/site_perl/5.8.0/i386-linux-thread-multi/auto/Jcode/.packlist
Appending installation info to /usr/lib/perl5/5.8.0/i386-linux-thread-multi/perllocal.pod
 /usr/bin/make install -- OK

cpan> quitEnter  ←cpanからログオフします
[root@web1 ~]#

以上で Jcode.pm のインストールは完了しました。

このページの先頭へ↑

UTF-8→EUCの変換スクリプトの作成

インストールした Jcode.pm を用いて、

「任意の テキスト ファイルの内容から UTF-8 の文字列を EUC に変換して出力する。」

という Perl シェル スクリプト を作成します。

このシェルスクリプトの内容についての説明は、このコンテンツでは割愛します。
Perlのスクリプトについては非常に多くの解説書がありますので、興味のある方は勉強してみてください。

といっても、以下のようにスクリプトはたったの10行です。

#!/usr/bin/perl
use Jcode;
open (IN ,$ARGV[0]);
while (<IN>){
      $_ =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
      Jcode::convert(\$_,euc);
      print $_;
      }
close (IN);
exit;

この内容のテキストファイルを 構築中のLinuxサーバー 上の適当な場所に実行形式で保存すれば良いのですが、タイプするのが面倒という方は、以下のリンク

を開いてコピー&ペーストするか、 ダウンロード して名前を変更し、 FTPクライアント などから サーバー アップロード してください。

このスクリプトは汎用性がありますから、 パス が通っているディレクトリ 「パスが通っている」とは に置いておくのが望ましいでしょう。

ファイル名の末尾が ".pl" になっているのは、これがPerlのスクリプトファイルであることを表すための「作法」のようなものだと思ってください。

ここではユーザーが作成した実行プログラムの格納場所として準備されている "/usr/local/bin" 以下に "u_e_conv.pl" というファイル名で保存するものとします。

ファイルを保存したら、かならず実行属性を与えてください 実行属性のパーミッションについて

[root@web1 ~]# cd /usr/local/binEnter cdコマンドについて
[root@web1 bin]# nano u_e_conv.plEnter nanoエディタについて

      .
      .
  適当な方法で"u_e_conv.pl"を作成して保存します。
      .
      .


[root@web1 bin]# chmod 755 u_e_conv.plEnter chmodコマンドについて  ←実行属性を与えます。
[root@web1 bin]# ls -l u_e_conv.plEnter lsコマンドについて
-rwxr-xr-x  1 root   root     190 6月 18 01:40 u_e_conv.pl
[root@web1 bin]#

作成が終わったら、スクリプトが正しく動作するかどうかをテストしてみましょう。

以下のようにタイプして、UTF-8の文字列"%E6%A1%9C"のテストファイルを作成し、 "u_e_conv.pl" を実行します。

[root@web1 bin]# echo %E6%A1%9C > test.txt Enter echoコマンドについて
[root@web1 bin]# ./u_e_conv.pl test.txtEnter カレントディレクトリの実行ファイルについて

[root@web1 bin]#

このように 「桜」 と出力されればOKです。

もしうまくいかないときは、スクリプトの内容のどこかに誤りがあるかもしれませんのでチェックしてください。

このページの先頭へ↑

Webalizer実行用シェルスクリプトの作成

Webalizer デフォルト "/var/www/usage/" 以下にいくつかの HTML ファイルを出力します。

要はこれらのファイルの中に含まれる UTF-8 の部分を EUC に置き換えれば良いということになります。

そこで、

この お便利サーバー.com のアクセス解析結果を公開中ですのでご覧ください。
メインコンテンツのアクセス解析結果 お便利サーバー.com
お便利サーバー.comへの検索ロボットのアクセス状況 検索ロボット

1.通常どおりのWebalizerのアクセス解析処理を実行する。

2.得られた任意の.htmlファイルに対して "/usr/local/bin/u_e_conv.pl" を用いて同名の.tempという文字コード変換済みファイルを作成し、オリジナルの.htmlファイルと置き換える。

3. カレント ディレクトリ内の.htmlがなくなるまで2.の処理を繰り返す。

という シェル スクリプト を作成します。

このシェルスクリプトでは、 文字列操作は Perl のシェルスクリプトである "/usr/local/bin/u_e_conv.pl" に任せてしまいますから、実際に行うのはファイル操作に過ぎません。従ってここではファイル操作に長けた bash を用いてシェルスクリプトを作成します。

汎用性を高めるため、このシェルスクリプトはカレントディレクトリを移動して実行するように作られています。
従って記述する コマンド はすべて 絶対パス 表記になっています。
コマンドのパスは which コマンドで調べることができます。

内容は以下のとおりです。

#!/bin/bash
cd /var/www/usage
/usr/bin/webalizer -c /etc/webalizer.conf > /dev/null
for name in *.html
do
 /usr/local/bin/u_e_conv.pl $name > $name.temp
 /bin/mv -f $name.temp $name
done

この内容のテキストファイルを 構築中のLinuxサーバー 上の適当な場所に実行形式で保存すれば良いのですが、タイプするのが面倒という方は、以下のリンク

を開いてコピー&ペーストするか、 ダウンロード して FTPクライアント などから サーバー アップロード してください。

ファイル名の末尾が ".bash" になっているのは、これがbashのスクリプトファイルであることを表すための「作法」のようなものだと思ってください。

ここでは "u_e_conv.pl" と同じく、ユーザーが作成した実行プログラムの格納場所として準備されている "/usr/local/bin" 以下に "webalizer_def.bash" というファイル名で保存するものとします。

以下、このシェルスクリプトの内容について説明します。

1行目は使用するシェルの指定です。

2行目は cd コマンド によるカレントディレクトリの移動です。

そして3行目でWebalizerを実行しますが、 "-c" 「後に記述したファイルを設定ファイルとして指定する」 というオプションです Webalizerの-cオプションについて

Webalizerはデフォルトでは "/etc/webalizer.conf" を参照しますから、この設定は一見余計なもののように思えます。

実はWebalizerは最優先で "/etc/webalizer.conf" を参照する訳ではなく、 、実行時のカレントディレクトリに同名のファイルが存在する場合にはこれを優先して参照するようになっています。

つまりこのオプションは、Webalizerが設定ファイルを間違えないようにするためのものと考えてください。

また、その後ろの "> /dev/null" 「ヌルデバイスにリダイレクト出力 出力のリダイレクトについて という意味で、 エラー出力を破棄する という動作になります。

Webalizerは解析するログデータが大きすぎるケースなどで、比較的頻繁に「大勢に影響のないエラー」を出しますから、こういう処理を行っておくほうが煩わしくありません。

どうしてもエラー出力を保存しておきたい場合には、この部分を、

/usr/bin/webalizer -c /etc/webalizer.conf > error.msg

と設定しておけば常に最新のエラーメッセージだけが "/var/www/usage/error.msg" に記録されることになります。累積的に記録しておきたいときは

/usr/bin/webalizer -c /etc/webalizer.conf >> error.msg

とすると良いでしょう。

一般的な他のプログラミング言語にも同じようなforループ構文はありますが、これらが「特定回数のループ」を行うためのものであるのに対し、bashなどのシェルスクリプトで用いるforループは、「条件に一致するすべてのファイルの処理が終わるまで」という処理を担います。
シェルスクリプトが「ファイル操作に特化している」というのは、こういう部分を指します。

4行目以降はbashでシェルスクリプトを作成するときに利用されるループ構文で、

for [識別子] in [ファイルリスト]
do
 $[識別子]を用いた処理1
 $[識別子]を用いた処理2
    .
    .
done

のように記述し、[ファイルリスト]の条件に一致するファイルすべてに対し、特定の[ファイルリスト]名を[識別子]として do〜done の処理を実行します。

冒頭と説明は重複しますが、 "/var/www/usage/" 中のすべての "xxxx.html" に対して、

1. "/usr/local/bin/u_e_conv.pl" で文字コード変換したファイル "xxxx.html.temp" をオリジナルと同じディレクトリに作成する。

2. "xxxx.html.temp" "xxxx.html" に改名してオリジナルに上書きする。

という処理を行うというわけです。

ファイルを作成したら、これにも忘れずに実行属性を与えてください。

[root@web1 ~]# cd /usr/local/binEnter cdコマンドについて
[root@web1 bin]# nano webalizer_def.bashEnter nanoエディタについて

      .
      .
  適当な方法で"webalizer_def.bash"を作成して保存します。
      .
      .


[root@web1 bin]# chmod 755 webalizer_def.bashEnter chmodコマンドについて  ←実行属性を与えます。
[root@web1 bin]# ls -l webalizer_def.bashEnter lsコマンドについて
-rwxr-xr-x  1 root   root     183 6月 18 01:49 webalizer_def.bash
[root@web1 bin]#

以上で "Total Search Strings" の文字化けを修正するシェルスクリプトの準備が終わりました。

このページの先頭へ↑

シェルスクリプトの動作確認と自動実行の登録

では早速 シェル スクリプト "webalizer_def.bash" を実行してみましょう。

方法は root アカウント からシェル プロンプト "webalizer_def.bash" を実行するだけです。

[root@web1 ~]# webalizer_def.bashEnter
[root@web1 ~]#

処理が終わったら、同じように Webブラウザ でアクセス解析結果の "Total Search Strings" を表示させてみてください。

以下のように文字化けは 比較的 きちんと解消されているはずです。

ただしご覧のとおり一部怪しい部分も残っています。

これは主に複数の検索語を組み合わせて検索が行われた場合に、 UTF-8 に変換された部分とそうでない部分との境界が曖昧になってしまうために起こる現象だと思われますが、今回説明した方法ではこれが限度ですので我慢するより他はないでしょう。

さて、ここでもう一つ忘れてはいけない作業があります。自動実行登録のやり直しです。

デフォルト Webalizer は、 crond によって一日一回実行されるようになっています。

具体的には、実行ファイル "webalizer" を呼び出すシェルスクリプトが "/etc/cron.daily/" 以下に "00webalizer" として保存されており、 "/etc/crontab" 中の "run-parts" によって実行されるようになっています /etc/crontab中のrun-partsの利用について

もちろんこの "00webalizer" が実行されてしまうとまた文字化けを起こしたアクセス解析結果が出力されてしまいますので、これを "webalizer_def.bash" と入れ替えてしまいましょう。

[root@web1 ~]# cp -p /usr/local/bin/webalizer_def.bash /etc/cr
on.daily/
Enter cpコマンドについて
[root@web1 ~]# mv /etc/cron.daily/00webalizer /usr/local/bin/ mvコマンドについて
[root@web1 ~]#

これで常に "Total Search Strings" はほぼ正しく変換された状態で閲覧できるようになりました。

なお、Webalizerのプログラムの実行スケジュールについては、 Webalizerの実行スケジュールについて に詳しく解説していますのでご覧ください。

このサイトは既に更新を終了していますが、今のところ店じまいの予定はありません。 リンクフリー ですので、趣味や勉強のためでしたら、引用、転用、コピー、朗読、その他OKです。このサイトへのリンクについては こちら をご覧ください。
Powered by Apache
”Linux”は、Linus Torvalds 氏の各国における登録商標です。”Red Hat”及びRed Hatのロゴおよび Red Hat をベースとしたすべての商標とロゴは、各国におけるRed Hat, Inc. 社の商標または登録商標です。その他のプログラム名、システム名、製品名などは各メーカー、ベンダの各国における登録商標又は商標です。
www.centos.org - The Community ENTerprise Operating System