2007-11-06 お、サーバの設定終わった?
必要な物は全部入れた……ハズ!
→残念、apacheのログ取得周りと、webalizer入れてない!あとruby
◆ [日記][FreeBSD] fstabの書き方間違えた(汗
/usr/home/ituki/htdocs /cgiroot/ituki nullfs rw 0 0
な(笑)
dumpかけたりchkdskかけてどうするよ(笑)
そりゃ止まるさ(笑)
◆ [日記][FreeBSD] 時々sendmailを必要とするプログラムがsendmailの前に立ち上がって固まる件
どうやらlocalhost:25にコネクションを張りに行って固まる模様(笑)
しばらく放っておくとタイムアウトしてくれるっぽいので、放置。
◆ [情報] 同人CD販売は? カラオケのコーラスは?――初音ミク「許諾の限界」を探る
メモっとく。
◆ [情報] 【amazonの分割配送の送料変更が想像より極悪な件】→一括発送と分割発送
わしは一括発送しか使ってないので(古い本とか取り寄せるのに便利)あんまり関係ないけど、関係する人は多数いそうなので一応書いておく。
なかなかに激しい条件の様で…(苦笑
◆ [ネタ] ニコニコ動画(RC2)‐キミと出逢ってから (VOCALOID KAITO short ver)に動画をつけてみた
ちょwwwwおまwwwww
◆ [日記] なんかtwa0がエラー吐いたΣ
twa0: ERROR: (0x05: 0x210B): Request timed out!: request = 0xc7050040
twa0: INFO: (0x16: 0x1108): Resetting controller...:
twa0: INFO: (0x04: 0x0001): Controller reset occurred: resets=1
twa0: INFO: (0x16: 0x1107): Controller reset done!:
何事。
再起動したら出なくなったので、まぁ良しとしよう(良いのかそんなので?)
◆ [日記][FreeBSD] apacheのログをmultilogで取りつつ、webalizerを入れる
まず、基本方針として、
・Apacheのログはfifo(mkfifoで作れるパイプ)に吐き出す
・fifoからログを読み込んで、標準出力に吐く
・標準出力をmultilogに噛ませて、実ログを吐き出す
・webalizer解析用のログは別途吐かせて、multilogからwebalizerを呼び出す
という方法を取ります。
この方法の利点:突如凄いhttpのアクセスを喰らってもログ領域が溢れない。あと、webalizerが勝手に解析してくれる。
まずこの辺からrdfifoを落としてきてgcc -o rdfifo rdfifo.c、cp rdfifo /usr/local/bin/rdfifo、chmod 755 /usr/local/bin/rdfifoとしてインストール。
別に/bin/catでも対応できるんだけど、mkfifoで作ったfifoパイプはしょっちゅうEOFを投げてきて、そのたびに/bin/cat起動し直しなので、ひたすらfifoを読み続けるプログラムを使うのさー。
とりあえず、一旦動いてるapacheを止める。
apachectl stopで止まったのを確認。
cd /var/logとして、rm httpd-suexec.log;mkfifo httpd-suexec.log
んで、httpd_log、httpd_logrというやる気無い名前のユーザ名&グループを作ってchown www:httpd_logr httpd-suexec.log; chmod 640 httpd-suexec.log。
これでhttpd-suexec.logはwwwユーザが読み書き、httpd_logrユーザが読み込み可能になる。chown root:httpd_logr httpd-suexec.log; chmod 640 httpd-suexec.log。
これでhttpd-suexec.logはrootユーザが読み書き、httpd_logrユーザが読み込み可能になる。よく考えたらapacheはwwwじゃなくてrootでログファイルをオープンするんでした。
んでもって、/var/log/httpdに移動して、error.logに対して同じ操作をする。まとめてやるとこんな感じ
rm error.log; mkfifo error.log ; chown root:httpd_logr error.log ;chmod 640 error.log
これでエラーログに対しても同じ事が出来る様になった。
ついでなのでディレクトリを作る
mkdir /var/log/httpd/suexec /var/log/httpd/error /var/log/httpd/access /var/log/httpd/access/analyze /var/log/httpd/access/main /var/log/httpd/access/server; chown httpd_log:httpd_log /var/log/httpd/suexec /var/log/httpd/error /var/log/httpd/access/analyze /var/log/httpd/access/main /var/log/httpd/access/server; chmod 700 /var/log/httpd/suexec /var/log/httpd/error /var/log/httpd/access/analyze /var/log/httpd/access/main /var/log/httpd/access/server
としておく。
んでもって、/var/log/httpd/accessで、mkfifo analyze.log main.log server.log、chown root:httpd_logr analyze.log main.log server.log、chmod 640 analyze.log main.log server.logとしてとりあえずファイルとディレクトリを作りまくる。
あと、一応念のため(今回は使わないけど)/var/log/httpdでmkfifo ssl.log; chown root:httpd_logr ssl.log; chmod 640 ssl.logとしておく。あと、mkdir ssl;chmod 700 ssl;chown httpd_log:httpd_log sslな。
書き忘れていたけど、もしssl使うなら、/usr/local/etc/apache2/ssl.confをErrorLog /var/log/httpd/ssl.log、TransferLog /var/log/httpd/access.log、CustomLog /var/log/httpd/ssl.log "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
な。この辺は趣味だが。
あと、logrotateとかnewsyslogとかにhttpdログローテート命令書いてる場合は、全部コメントアウトな。multilog使うので不要になるから。
んで、次は順にreadしてwriteする設定をちまちまとやっていく。
基本的には/usr/serviceにhttpd-ほげほげってディレクトリをつくって、その中のrunファイルに
#!/bin/sh
exec 2>&1
exec /usr/local/bin/setuidgid httpd_logr /usr/local/bin/rdfifo \
/var/log/さっき作ったfifoファイル
と書き、log/runファイルに
#!/bin/sh
exec /usr/local/bin/setuidgid httpd_log /usr/local/bin/multilog t s1024000 n64 \
/var/log/httpd/さっき作ったログ格納先
って感じでガシガシ書いていけばよい。斜体になってる部分でログ量を制御(上の設定だと、1Mのファイルが64個な)できるので、そこは適切に。
runとlog/runファイルをchmod 700 run log/runとしておいて、/serviceからln -s ../usr/service/httpd-ほげほげ で読み込み&multilog起動。
さっき作ったファイル全部にmultilogが起動していないと、apacheが起動中にログが吐けなくて止まるので要注意ね(笑)
あとはひたすらさっき作ったfifoの分だけ増殖させる。
一個マスターをつくっておいて、ちなちま書き換えるのが良いかもよ(笑)
analyzeだけはあとで追加設定があるので、/serviceからリンク張るのは後回し。
それ以外はがががががーっとリンクを張ってしまいましょう。
ちなみにワシはこんな状態
httpd-log-access-main
httpd-log-access-server
httpd-log-error
httpd-log-ssl
httpd-log-suexec
ちなみに、httpd-log-access-mainだけはログが巨大化するので、 log/runのmultilogのオプションをs10240000 n200としています。
ちなみにvirtual serverを何も起動していない状態なら、ここまで出来た段階でapachectl startで動き始めるはずです。
念のため、/var/log/httpdの中のerror/current当たりをcatしてみましょう。多分、ログが吐かれているはず。
というわけで、次はwebalizerの設定。
インストールはやる気無く/usr/ports/www/webalizerでmake installしましょう(笑)なんかgdを入れようとしてるのでiconvだけサポートにしておく。なんかlibjpeg、libpng、freetype2、pkg_configなどなど勝手にportsの依存関係を辿って入れてくれますが、とりあえずエラー無く終わり。
rehashしてwhich webalizerで/usr/local/bin/webalizerとなっている事を確認。
どっか適当なディレクトリにこんな感じでconfigファイルを作ります。
ROOT="/適当なディレクトリ"
んでもって、適当なユーザ(webalizerとでも名付けておこう)をつくって、chown webalizer:webalizer /var/log/httpd/access/analyze。
$ROOTにbinとtmpとworkとconfというディレクトリをwebalizer権限で作る。
んで
$ROOT/bin/multilog.analyze.sh (multilogからログがいっぱいになった次の瞬間に呼び出されるスクリプト)
#!/bin/sh
. /適当なパスのconfigファイル
/usr/bin/tee $ROOT/tmp/access_log
exec $ROOT/bin/analyze.sh
teeで$ROOT/tmp/access_logと標準出力に入力を吐いて、$ROOT/bin/analyze.shで実際のwebalizerを呼び出します。
$ROOT/bin/analyze.sh
#!/bin/sh
. /適当なパスのconfigファイル
umask 027
$ROOT/bin/analyze.one.sh 設定ファイルのプレフィックス "解析対象のURL"
$ROOT/bin/analyze.one.sh all
exit 0
解析対象のURLは""で囲って複数指定可能です。
$ROOT/bin/analyze.one.sh (webalizer1個分の処理)
#!/bin/sh
. 適当なパスのconfigファイル
umask 027
cd $ROOT/tmp
cat $ROOT/tmp/access_log | perl $ROOT/bin/aplogsp.pl $@ > $ROOT/tmp/$1.access_log
cd $ROOT/work/$1
/bin/date > last.time
exec 2> error_log.txt
exec > output_log.txt
/usr/local/bin/webalizer -c $ROOT/conf/$1.conf
exit 0
$ROOT/bin/aplogsp.pl (関連するURLだけ抜き出すスクリプト)
#!/usr/bin/perl
$ARGV[0] = "";
foreach $u(@ARGV){
$url = $u;
$url =~ s/\./\\./g;
if($url eq ""){ next;}
push(@url,$url);
}
if($#url < 0){
while($l=<STDIN>){
print $l;
}
}
while($l=<STDIN>){
@t = split(/"/,$l);
foreach $url(@url){
if($t[1] =~ /^[A-Za-z0-9]+ $url/){ print $l;last;}
}
}
んでもって、
$ROOT/conf/設定ファイルのプレフィックス.confというファイルが実際にwebalizerに喰わせる設定ファイルなので、/usr/local/etc/webalizer.conf-distを$ROOT/conf/設定ファイルのプレフィックス.confにコピってきて、設定する。
とりあえず、設定の必須ポイント
・LogFileを$ROOT/tmp/設定ファイルのプレフィックス.access_logに変更
・OutputDirをhttpでアクセスさせるローカルのパスに変更
・IncrementalNameを$ROOT/work/設定ファイルのプレフィックス/currentに変更
あとは趣味で変更。わしはTopReferrers 100000、AllReferrers yesとしている(笑)
あとはhttpでアクセス制限したり、位かな。
あー、binの中のスクリプトに実行権限付けるのを忘れずに(笑)
んで、だいぶと戻ってきてmultilogの設定をこんな感じに書き換えます。
/usr/service/httpd-log-access-analyze/log/run
#!/bin/sh
exec /usr/local/bin/setuidgid webalizer /usr/local/bin/multilog s102400 n4 \
!'適当なパスの/bin/multilog.analyze.sh' \
/var/log/httpd/access/analyze
これで、ログがいっぱいになった時(≒100K毎)にwebalizer権限でmultilog.analyze.shが実行され、/var/log/httpd/access/analyzeにログが吐かれるようになります。
ここで、multilogの引数にtを付けると、確実にエラーになるので注意(笑)
ここまで設定した後、/serviceからln -s ../usr/service/httpd-log-access-analyze .として起動。
あとはapacheの設定。
ログを取りたい設定で、
/usr/local/etc/apache2/virtual/servers/の中のhttp.ほげほげ.confで
<VirtualHost *>
ServerAdmin webmaster@proj.jp
DocumentRoot /サーバ上のパス/htdocs
ServerName サーバ名
CustomLog /var/log/httpd/access/main.log conbinedfile
CustomLog /var/log/httpd/access/analyze.log analyzed
SuexecUserGroup cgi実行ユーザ cgi実行グループ
</VirtualHost>
として、CustomLog /var/log/httpd/access/analyze.log analyzedという行を追加します。analyzedとconbinedfileに関しては、昨日書いたhttpd.confの設定を参照ね。
あとは勝手にログがたまったらwebalizerを呼んで実行、解析、バックアップしてくれる……ハズです(笑)
まだ試してないけどね(明日試すよ!)