Apacheの改造インストール


● Apacheのダウンロードから正規インストール

ログファイルを日毎に分けたいのでcronologをまずインストールする。

tar zxvf cronolog-1.6.1.tar.gz
cd cronolog-1.6.1
./configure
make
su
make install

JAPACHEから配布されているapacheのダウンロードサイトから最新版を ダウンロード
http://japache.infoscience.co.jp/apache/dist/

Configureで apache関連ファイルのインストール先を /usr/local/wwwに指定、参照ログを扱いやすくするため mod_log_refererを 有効にする。

tar zxvf apache_1.3.12.tar.gz
cd apache_1.3.12
./configure --prefix=/usr/local/www --enable-module=log_referer
make
su
make install

設定ファイル /usr/local/www/conf/httpd.conf で以下の設定を変える。

ポート番号は80番の方が好き
Port 80
管理人アドレスを書く
ServerAdmin naoki@cms.phys.s.u-tokyo.ac.jp
WEBサーバー名を書く
ServerName www-cms.phys.s.u-tokyo.ac.jp
UserとGroupは nobodyと nogroup が好き。
User nobody
Group nogroup
個人のホームページの置き場所を /usr/public_html/naoki/index.html のような変わったところに置きたいなら
UserDir /usr/public_html
CGIを許すなら
Options ExecCGI
AddHandler cgi-script .cgi
アクセスログを単純化
LogFormat "%h %t \"%r\"" common
エラーログを日毎にわける
ErrorLog "|/usr/local/sbin/cronolog /usr/local/www/logs/error%m%d.log"
アクセスログを日毎にわける
CustomLog "|/usr/local/sbin/cronolog /usr/local/www/logs/acces%m%d.log" common
参照ログを日毎にわける
RefererLog "|/usr/local/sbin/cronolog /usr/local/www/logs/refer%m%d.log"
自分のサイトからの参照はログに残さない
RefererIgnore www-cms.phys.s.u-tokyo.ac.jp

● Apacheの改造

■ 改造1: ログの時刻を短くする。

ログファイルを日毎に分けるようにしたのでログの中には日付は要りません。 なので時刻の文字列を作成するところを改造します。

ファイル: src/modules/standard/mod_log_config.c
関数: log_request_time()において

   ap_snprintf(tstr, sizeof(tstr), "%02d:%02d:%02d",
                t->tm_hour, t->tm_min, t->tm_sec );

ファイル: src/main/http_log.c
関数: log_error_core()において

if (logf) {
  time_t tt = time(NULL);
  len = strftime( errstr, sizeof(errstr), "%H:%M:%S ", localtime(&tt) );
} else {
  len = 0;
}


■ 改造2: cronologの起動に shを使わないようにする。

ログファイル名が |(パイプ)で始まる場合には、それをコマンドとして 実行するのですが、コマンド引数の解釈を sh に託しているので プロセスが sh の分だけ多く走ってしまいます。そこで引数を自分で 分割して execv関数を使うことで shを使わないようにします。

ファイル: src/main/http_log.c
関数: piped_log_spawn()において

char  str[256];
char* argv[4];
int i=0;

strcpy( str, pl->program );
for( argv[i++]=strtok( str," "); (argv[i++]=strtok(NULL," ")); );
execv( argv[0],  argv );

/*******
execl(SHELL_PATH, SHELL_PATH, "-c", pl->program, NULL);
*******/

関数: error_log_child()において

char  str[256];
char* argv[4];
int i=0;

strcpy( str, cmd );
for( argv[i++]=strtok( str," "); (argv[i++]=strtok(NULL," ")); );
execv( argv[0],  argv );

/*******
execl(SHELL_PATH, SHELL_PATH, "-c", (char *)cmd, NULL);
*******/



■ 改造3: 参照ログのURLエンコードを復号する。

参照ログにはサーチエンジンにGETメソッドで与えられたFORM変数の データが付随していることが多いのですが、そのままではURLエンコード されていたり漢字コードが異なっていたりするので読めません。なので 参照ログを出力するところで、 これを復号して漢字コードを自分が読めるコードに変換するように 改造します。

本書のform.ccにおいて Decode関数の プロトタイプ宣言をとその定義にextern "C" 宣言を付ける。

extern "C" char* Decode( char* src );
extern "C" char* Decode( char* src )
{
  ...
  return src;
}
main関数を除いておく。-c オプションを付けてコンパイル。 出来た form.o を src/module/standard/ に置く。

ファイル:src/module/standard/Makefile
OBJS の項目に form.o 加える。

ファイル:src/module/standard/mod_log_referer.c
冒頭において

#include "http_core.h"
extern char *DecodeURL( char *buffer );
関数: referer_log_transaction()において
const char *referer;
const char *host; /* 追加 */
referer = ap_table_get(orig->headers_in, "Referer");
host    = ap_get_remote_host(orig->connection, orig->per_dir_config, REMOTE_NAME); /* 追加 */
str = ap_pstrcat(orig->pool, DecodeURL(referer), " ",host," ", r->uri, "\n", NULL); /* 変更 */

これで参照ログを調べることで、 サーチエンジンにどのようなキーワードを入れて自分のページに たどり着いたのかがわかります。またどこからリンクが張られているかも わかってきます。


目次

Copyright(C) by Naoki Watanabe. Oct 21st, 1995.
渡辺尚貴 naoki@cms.phys.s.u-tokyo.ac.jp