nDiki : アクセスログ

2000年11月5日 (日)

本サイトの Referer 統計復活

以前のサーバでは Apache で combined 形式のアクセスログをとっていて、Referer (リンク元)の統計をとっていたんだけれども、今のサーバでは Referer log が提供されていない (common 形式の提供)。

なもんで、しばらく Referer のない淋しい統計生活だったのであった。 で、今日 SSI でめでたく復活。 とりあえずちょちょっと作って実験中。 ログの出力を Apache の combined 形式と同じ形式にしたので、analog がそのまま使える(統計スクリプトの手間も省けるというもんだ)。 もっとも、combined に必要なフィールドの全ての情報が SSI では取得できない(ような)のでそこら辺は適当(適切)に埋めておいてある。

ついでに cookie による統計も実験してみようかなと思ったがサーバでは mod_usertrack が disable だった。 自前で cookie を焼くとなると、全ページを隠れCGI処理しなきゃならないので面倒だ(昔別のサーバ上でやってたけど)。 IMG でお茶を濁す方法もあるけど、なんなので cookie は見送り。

スポンサード リンク
[ 11月5日全て ]

2001年9月19日 (水)

[ www.naney.org ] 12:30 98019KB

気が付いたら、ずいぶん埋まってた。 容量 100MBだから、整理しなくては。

SSI によるアクセスログ

26MBも食ってた。 きちんと rotate するようにしなければ、あかんな。

[ 9月19日全て ]

2003年11月27日 (木)

SpeedyCGI環境変数

アクセスログSSI が使用しているモジュールで REQUEST_URIHTTP_REFERER、 HTTP_USER_AGENT 環境変数がうまく取れていなない事があるのを発見。

ログをみると取れている時と、取れていない時がある。 何だろう。 でよくよく調べてみたら、SSI では問題なくて同じモジュールを Wiki で使っている時に失敗している模様。

よくわからないが、SpeedyCGI 関連の問題かもと思い main スクリプト上での呼び出し位置を修正したら直った。 呼び出し順に依存するのかなぁ。

あっ、そういえばモジュールのバグ混入(同環境変数を取得後のエスケープ処理で誤って空にしてしまうバグ)とその修正を今し方したのだが、SpeedyCGI がそのバグのある時点のモジュールをロードして動き続けていただけかも。 で、main スクリプトを修正したら SpeedyCGI がそれを検知して Wiki を re-execute したため今度は修正後のモジュールがロードされたため正しい挙動になったと(main スクリプトの修正内容は関係なく、touch された事自体が問題を解決した)。

多分。

[ 11月27日全て ]

2003年12月16日 (火)

[ www.naney.org ] CGI プログラムによるサーバ過負荷

ホスティングサービス会社からメール。 12月16日0:00-0:20にかけて、naney.org に設置しているCGI プログラムが原因でサーバが過負荷になり動作不安定な状態になったため、実行権限を落としたとのこと。

あちゃ。

メールでは naney.org に設定しているハイパー日記システムのうち一方(この日記でない方)が原因との報告だったが、アクセスログをみるとそちへの最終アクセスは 12/15 18:25:19 でどうも違う感じ。 逆にこちらの hns の方に、61.116.156.147 から 23:42:32 - 00:17:37 の間に少なくとも523回のアクセスがあり、どうやらこちらが過負荷の原因になってしまったようだ。

ここ最近1日に1度から数度、普通のISP経由で連続アクセスがある。 UAはIEをなのっているが、ロボットのようでもある。 なかなか弾きにくい相手である。

できれば連続アクセスだけ拒否するようにしたいのだが、そう簡単でもない。

hnsSpeedyCGI では動くようなコードでもなさそうだし。

とりあえず index.cgi を書き換えて サーバの load average が高くなっている状態では 503 Unavailable を即座に返すように修正。

 BEGIN {
   my $average = `uptime`;
   $average =~ /(\d+(?:\.\d+)?),?\s+(\d+(?:\.\d+)?),?\s+(\d+(?:\.\d+)?)/;
   if ($1 > 50) {
     print "Status: 503 Unavailable\r\n\r\n";
     print "Server is busy, please retry later.";
     exit 0;
   }
 }

を追加。load average が 50 (値は調整)を越えたら 503 になるようにしておいた。

ということで、この日記が 503 だったらきっとサーバがイッパイイッパイということです。

[ 12月16日全て ]

2004年1月17日 (土)

[ WiKicker ] 「最近のアクセスログ」処理思案

今のところ WiKicker 自体にはアクセスログ機能はなく、Apache のそれに頼っている(NaneyOrgWiki ではサーバ側で combined log を提供していないので別途自前で、似非 combined log を吐かせている)。

1日毎程度のアクセス統計チェックはこれでまぁある程度済むのだが、それとは別に瞬間的なアクセス状況を知りたい時がままある。 特にサーバの負荷が上がりつつある時は

  • 特定のホストから連続的なアクセスがないか?(ロボットなど)
  • 特定のページのリクエストが一時的に増えているのでは?(ドラマ放映終了直後など)
  • 特定の訪問者がリロードしまくってないか?(チャット等と勘違いして)

などをチェックしたい。 ロボットのアクセスがひどい場合は早急にはじく必要があるし。 しかし、生アクセスログの目視チェック(+grep etc)では限界がある(wiki のURIはページ名がエスケープされているからパッと見どのページかわからないし)。

ということで、直近のログを簡単にチェックできるような機能を検討。 まずはログをどこに取るか。 複数のCGI プログラムのプロセスから、ガシガシ書ける必要有り。

  • 普通のファイル
  • daemon
  • mmap
  • 共有メモリ

あたりか。 直近の数百アクセスだけあれば良く、逆にそれ以上のログはばんばん破棄したいのだが何が一番いい実装かなぁ。

シンプルに普通のファイルに append するのが一番楽だが、ログが増えると tail を取るのが遅くなるだろうし、ログを切り詰めるのも面倒。 PerlTie::File を使うとファイルの各行を配列要素に見立てて push、 unshift、splice ができるのだが、やはり切り詰めに時間がかかりすぎる。

使えそうなモジュールがないかいろいろCPAN検索して、とりあえずどんどんビルドしてみる(サーバの Perl5.005_03 なので、目的にあっても使えないかもしれないし)

[ 1月17日全て ]

2004年1月18日 (日)

過去の今ごろ

過去の1月18日より。

[ WiKicker ] IPC共有メモリを用いた直近のアクセスログ管理

昨日から本格的に検討していたアクセスログ管理であるが、今回は IPC::ShareLite モジュールを使って、IPC共有メモリに置くことにした。

  • 共有メモリなのでファイルに書くより圧倒的に速い。
  • (ipc key を変更した時など)削除し忘れてメモリに残るおそれがあるので注意。
  • IPC::ShareLitePerl 5.005_03 でも動く。
  • FreeBSDを使っているサーバで共有メモリが使えた(共有メモリを使うPostgreSQL が使えるようになっている事からも心配なし)。1024 * 512 bytes 取っても問題なし。
  • Storable を使ってシリアライズ。
  • この共有メモリを扱うモジュールファイル名を__FILE__で取得し、その更新ファイルをマジックナンバーとして、共有メモリに一緒に書いておく。読んだ時に一致しなければ破棄するようにする(今後しばらく、ちょくちょく形式を変更すると思うので)。

ちゃちゃっと実装して、やっつけであるが直近のログを見れるようにした(RecentLog )。 順次表示する情報の追加や、表示数の調整を行う予定。 それから、各ページでのロギング処理が高負荷時に重荷にならないか要チェック。

[ 1月18日全て ]

2004年1月23日 (金)

[ WiKicker ] 憧れのサイドバー

Wiki はまぁ(ユーザからの視点において)シンプルな方が良いと思うのだが、やっぱサイドバーは出せてもいいかな。先日実装したIPC共有メモリを用いた直近のアクセスログ管理を使ってトップランキングも常にチェックできるようにしたいし。

tDiary テーマでサイドバー

レイアウトは tDiary のテーマにまかせる。 現在の blue-feather はサイドバー対応していないようなので、Nana 氏の flower に変更。 Wiki用に若干幅、配色等を修正。

で、WiKicker のフッタファイルに <div class="sidebar">...</div> を作ってそこに Google検索フォーム等を移動。

Access Top 30

IPC共有メモリに置いてあるアクセスログを使って直近300アクセスによるランキングをサイドバーに表示できるようにする。

アクセスログは刻々と更新されるのでトップランキングもできるだけ更新表示させたいのだが、一方各WikiPageはレスポンス向上・負荷軽減のためできるだけ 304 を返したい。

なのでページ中の更新表示させたいトップランキングの部分を、JavaScriptファイルとして別ファイルに生成しておくことにした(いわゆる JavaScript Include)。 HTML出力自体に変更がなくて304を返しても、アクセスログの変更に合わせてJavaScriptファイルだけ更新しておけばクライアント側で表示を更新してくれる。

JavaScript はできるだけ避ける方針できているが、アクセスランキングは付加的情報なのでJavaScript off によって表示されなくてもそれほど問題ないと判断。 document.write だけだから互換性の問題もほとんどないだろうし。

JavaScriptファイルの更新は、RecentLogへアクセスがあった時についでに生成するという形で行うようにしてみた。 一応 cron で1時間毎に

 wget --quiet -O - http://www.naney.org/wiki/RecentLog.html > /dev/null

して、最低でも1時間に1回は更新されるようにしておく。

[ 1月23日全て ]

2004年3月1日 (月)

[ WiKicker ] WiKickerLog::Log4perl を採用

他のプロジェクトでも使用していて「WiKicker でも使いたいのだけれど、これ以上依存するモジュールを増やすのものぁ」というものの一つであった Log::Log4perl をやはり採用する事に。

Perl 5.005_03 でもギリギリOKのようである。

Debugログおよび、アクセスログ等もすべてこの上にのせていくつもり。

[ 3月1日全て ]

2004年5月21日 (金)

AWStats 6.0

www.naney.orgアクセスログをローカルにもってきて統計解析をするのに、今回は analog ではなく AWStats を使うことに。

以前 www.naney.org に入れてみた時より、随分使いやすくなった感じ。

セットアップ

Debian パッケージを入れた後、awstats.naney.org というバーチャルドメインをローカルのApacheに用意(/var/www/awstats.naney.org)。

 Alias /icon/ "/usr/share/awstats/icon/"

も設定に追加しておく。

ファイルレイアウト:

 /var/www/awstats.naney.org/
  |
  +-- .htaccess
  |
  +-- awstats.conf  <-- 作成
  |
  +-- awstats.pl    <-- コピーしてきて一部修正
  |
  +-- cache         <-- DNSキャッシュ用 (まだ未使用)
  |
  +-- data          <-- データを保存
  |
  +-- plugins       <-- プラグイン
       |
       +-- wikicker.pm <-- /wiki/(.*).html を $1 で表示するプラグイン(自作)

awstats.pl はパッケージのものをコピー。DecodeEncodedString の中で Jcode.pm を使って文字列を UTF-8 に変換するように修正。

ローカル用なのであまり気にせず DocumentRoot の下にもりっとファイルを置いておく。

awstats.conf はこんな感じ。

 LogFile="/path/to/downloaded-log/access.log"
 LogType=W
 LogFormat=1
 LogSeparator=" "
 DNSLookup=2
 DirData="./data"
 SiteDomain="www.naney.org"
 HostAliases="localhost"
 DNSStaticCacheFile="cache/dnscache.txt"
 DNSLastUpdateCacheFile="cache/dnscachelastupdate.txt"
 URLWithQuery=1
 URLReferrerWithQuery=1
 LevelForWormsDetection=2
 ShowWormsStats=1
 LoadPlugin="wikicker"
 ValidHTTPCodes="200 304 -"

ValidHTTPCodes の '-' というのは、本来不要。自前のSSIで似非 Combined Log を生成する際に '-' を出力する事があるので追加。

日本語もきちんと出るしいい感じ。 指定した月ではなく、指定した日のログを見れるといいのだが設定すればできるようにならないかな。

analog と違ってプラグインが使えるのが良い。 Perlスクリプトだから、その気になれば簡単に awstats.pl 自体を変更する事もできるし。

今回は ShowInfoURL 用プラグインを書いて、/wiki 以下のURLの際は unescape して PageName を表示するようにしてみた。

その他いろいろ遊べそう。

[ 5月21日全て ]

2004年11月19日 (金)

mixi に登録

ちょっと落ちついたので、2日ほど前に招待されていたmixiに登録してみる。 そういえばorkutは(予想通り)最近ほったらかし。

チェックしてみると mixi日記に関して外部のものを(RSS)を通して使えるようなので、ちょっと興味が出てきた。

mixi のシステムから送られてくるメールは、行末に ^M がつくのでちょっと嫌。

で登録。

RSS を設定

nDiki (DiKicker) はまだ RSS を生成しないので、かわりに NaneyOrgWiki (WiKicker) の RSS を指定してみる。 フォームに入力して、送信。

 Internal Server Error

そうですか。die を捕捉してませんか。 こちらのサイトのアクセスログを見るとRSSは取得していっているので、解析以降でこけているらしい。

いろいろチェックしてみると一つは日付表示の問題らしい。 mixi の要求する dc:date 要素はあるのだが、WiKicker で生成している YYYY-MM-DDThh:mm:ssZ (W3CDTFの一つ)では駄目らしい。

でどうやら YYYY-MM-DDThh:mm:ss+09:00 でないと駄目らしい (YYYY-MM-DDThh:mm:ss+00:00 でも駄目)。 まあこれもW3CDTFの形式ではあるけれど、もうちょっと許容してくれてもいいのになと思う。 いや駄目でもいいけど、 Internal Server Error はよろしくないんじゃないか。

とにかく RSS は設定できた。 がうまく表示されない。

がくり。

追記

mixi の dc:date について誤認。 いろいろ試してみたところタイムゾーン指定は Z でもOKだった。

(2004年11月21日追記)

[ Naney と mixi ]

[ 11月19日全て ]

About Me

Naney Naney (なにい)です。株式会社ミクシィで SNS 事業の部長をしています。

nDiki1999年1月に始めたコンピュータ日誌を前身とする NaneyWeb 日記(兼パーソナルナレッジベース)です。ちょっとしたノートは nNote にあります。

※内容は個人的見解であり所属組織とは関係ありません。

月別インデックス
Process Time: 0.05846s / load averages: 0.52, 0.43, 0.43
nDiki by WATANABE Yoshimasa (Naney)
Powered by DiKicker