Apache のログ管理は大半のディストリから RPM やらでインスコすると「logrotate」で
世代管理しつつローテーションされる。
個人的にはこの方法でローテーションされるのは嫌なので Apache 付属の「rotatelogs」を用いる。
http で始まるアドレスの Web サイトはデータノーマル垂れ流し通信。
https だと送受信共に SSL 通信を用いた暗号化経路を通ってデータが来る。
その為、データを中継するネットワーク間やらなんやらからデータを保護する
目的で多用されている。例えば通販とかの個人情報入力フォームとかね。
こいつをうちのサーバーでも出来るようにしていたんだけど証明書に初めて
知った物があったので再度作成してあげた。 続きを読む »
先日いれたアクセラレーターである eAccelerator は導入すれば全てが旨く
キャッシングされて速度向上に繋がる物でも無いということです。
実際、動作不能になった PHP スクリプトがあったのでその対応方法を
書いておこうかなと。
WordPress を導入してからサーバーのチューニングじみた事ばかり
している気がしないでもないが、今回は体感できるチューニングってことで、
PHP のアクセラレーターである eAccelerator を導入した。
で、メモメモ。(長い YO)
まぁ SetEnvIf ディレクティブを用いて「Order Allow,Deny」とかしちゃって
Apache の設定に手を加えるわけですが、ややこしい。
今日なって盲点を見つけたので Fix してみた。
12:05 もう一箇所追記してみた。
Apache のログは垂れ流したところで分かるのは見てるところだけ。
過去を辿って何千行ものログを見たくは無い。
良く CGI とかで使用されているアクセス解析を使う手もあるのだが、折角自由の効く
自宅サーバーなのだからこれはやるしかないというか、入れ忘れていたのでインスコ。
アクセス解析にも色々ソフトはある。
大御所の analog から今回いれた Webalizer や AWstats 。
最後に書いた AWstats は UI 等良くできているのだが、その分負荷が高い。
うちのサーバーではアクセスするだけで数秒待たされたりとかした経緯も過去にあり。
analog はテキストベースでシンプル過ぎる。
Webalizer なら GD ライブラリつかってグラフ化もしてくれたりするけど、出力は Static
となるので閲覧には負荷は無い。
そんなもんで今回はこいつをチョイス。
さて、アクセス解析をかけるターゲットは Apache のログだ。
ログの保存形式が簡単に logrotate で回していれば簡単な設定で済むのだが、
うちのサーバーでは日付毎に管理させている。
例えば今日のログなら "xxxx_access_log.20060627" ってな感じだ。
実際のログの吐き出し設定は以下の通り。
CustomLog "| /usr/local/apache2/bin/rotatelogs /usr/local/apache2/logs/www_access_log.%Y%m%d 86400 +540" combined
このままでは直にログファイル名を渡すことが出来ない。
解析対象が前日のログとなるから…。
そんなもんで簡単なシェルを書いてやる。
一時的に前日のログファイル名をソフトリンクを用いてユニークで固定な名前にする。
んでもって解析が終わったら削除するという手法をとってみた。
解析するドメインは引数として与えてやる。エラーチェックも忘れちゃいかん。
自分で使うだけなので汎用ではないが、参考になればこれ幸い。
webalizer.sh
#!/bin/sh
# Webalizer for an apache logfile of date format.
# To analyze log filename set.
# Argument is sub-domain name.
USER=$1
ORG_LOG=/var/log/httpd/${USER}_access_log.`date –date '1 day ago' +%Y%m%d`
NEW_LOG=/var/log/httpd/${USER}_access_log
# Exist check
if [ ! -d /home/${USER} ]; then
echo 'no such a domain.'
exit 1
fi
# make a temporary logfile
/bin/ln -s ${ORG_LOG} ${NEW_LOG}
# run webalizer
/usr/local/bin/webalizer -c /etc/webalizer_${USER}.conf ${NEW_LOG}
# unlink a temporary logfile
/bin/rm -f ${NEW_LOG}
流れとしては
前日のログファイル -> xxxxx_access_log と固定化 -> webalizer に解析させるという感じ。
無論、webalizer の設定ファイルは解析するドメイン毎に用意してやる。
今回は自分の管轄としている 3 つのドメインを解析とした。
メインとなる www ドメイン。ブログ用となる bucci ドメイン。ゲーム用の abyss ドメイン
の 3 つ。
それぞれの設定を "/etc/webalizer_{www,bucci,abyss}.conf" と 3 つに分け、各種設定を行う。
www ドメインだけはいろいろあるだけに設定は細かく変更済み。
他は汎用的にいけるよう、使う設定箇所だけにして設定内容を見やすくしてあげた。
ひとまず設定を終えて、テストで昨日分のログを出力させることに成功。
あとは過去 1 ヶ月分のログファイルを順次読み込ませて今月分全て解析させる。
それが終わったら root の crontab にぶち込んで終わり。
1 ヶ月分のログファイルを 1 こずつやっとったら手が疲れるので 1 行野郎で済ます。
# for i in `ls /var/log/httpd/www_access_log.200606* | grep -v "27$"`; do webalizer -c /etc/webalizer_www.conf $i; done
当日分までやってしまうと何かと面倒なので 27 日分は解析させない。
これで 30~120 秒待てば解析は完了。
ログファイル名と設定ファイル名を書き換えて 3 ドメイン分繰り返すだけで OK 。
最後に cron へ登録させるのだが、1 ドメイン 1 行なんてやっとれんし、メンテナンス
大変になるからさらにシェルを書く。
webalizer_all.sh
#!/bin/sh
# Analyze All Domains at Webalizer
#
domains='www bucci abyss'
for i in ${domains};
do
/path/to/webalizer.sh $i
done
これであとは解析対象が増えても domains 変数にドメイン名を追加して行ってやれば
らくちんになるのであります。
このシェルを毎日 00:05 に走らせるようにする。
# crontab -e
で以下のように追記編集して :wq して終わり。
5 0 * * * /root/bin/webalizer_all.sh > /dev/null
エラーは吐かせておかないとイクナイので "> /dev/null" とした。
完全に軌道に乗ってしまえば "> /dev/null 2>&1" なんてして全て捨てても良いかなと。
あとは cron でセットした時間にエラーメールがすっとんで来ないことを祈る(笑
このサーバーはいままで全て “http” プロトコルのみでの通信を提供していたんだけど、
かなーりめんどくさい OpenSSL をつかった “https” での暗号化通信に対応させました。
全てのサブドメインに付けるのではなくて、1 つの https 専用サブドメインを作成し、
このサーバーを利用いただいているユーザーのパスワードやらなんやら変更するときに
使用するソフト設置時に使う予定。まぁこのソフトってのは Usermin だったりするんだけど。
Webmin でサーバー管理が楽になるとかなんたら良く目にするけど、このへんはこだわりで
全部 CUI によるオペでやるつもりなのでパス。
後考えられる用途は Webmail とかくらいかな。
もちっと勉強すれば MTA で START TLS とかにも応用が利くのでやっておいて
よかったかなと。
ということで、やっと Web サーバー構築時につけたオプションが生きてきた。
Apache + OpenSSL + PHP + MySQL + Perl が今の Web サーバー稼働構成かな。
