[Index]

アクセスカウンタの設置(SSI + CGI)


悪い癖

さて、Apache + PostgreSQL + PHP3と役者が揃いましたが、とりあえず良いコンテンツが思いつきません。 どうも、システムの枠組みをつくると、中身の作成には意欲が湧かないのが私の悪い癖のようです。(ダッテあとは力技だもん...)

そこで、ユーザページにカウンタでも付けてみます。ここでは、SSIとCGIを使った簡単なグラフィックカウンタでいきます。

プロバイダのサーバでは自由が利かない場合がありますが、自分が管理するマシンなので、SSIもCGIもやりたい放題がいいですね。

初心者の場合には、アクセスカウンタというと、どっかでサービスしてるのを借りるものという程度で、あまり深く考えたことはないでしょうが、カウンタを自力で設置するには、少々スキルとある程度広範な知識が要求されますのでそのつもりで...

準備

まず、0から9の画像をgif形式かjpeg形式で用意します。 Unixな方もWinな方も、gimpを使いましょう!

画像の用意ができたら、ディレクトリの整備をします。~/public_html/cgi-bin/counter というディレクトリを作成し、そこに先ほどの画像を移動します。ここでは、ファイル名をそれぞれ、0.gif 1.gif ... 9.gifとします。 さらに、カウンタ値を格納するファイルを次のように作成します。

$ cd ~/public_html/cgi-bin/counter
$ vi cnt
...
ファイルの中身は0を入力し保存
...
$ chmod o+w cnt

また、ロックファイル作成用ディレクトリを公開ディレクトリ以外の場所に作成し、apacheが書き込みできるようにパーミッションを設定します。

$ mkdir ~/tmp
$ chmod o+w ~/tmp

スクリプトの用意

さて、これからは、知的作業です。~/public_html/cgi-bin/counterに次のような内容のシェルスクリプトをcnt.shというファイル名で用意します。

もちろん、スクリプトが呼び出す各コマンドは、whichとかwhereisとかを使用してマシンの環境に合わせます。

#! /bin/sh

COUNT=/home/yoshio/public_html/cgi-bin/counter/cnt
LOCK=/home/yoshio/tmp/lock

/bin/ln -s $COUNT $LOCK && (\
  NUM=`/bin/cat $COUNT`;\
  echo $NUM + 1 | /usr/bin/bc > $COUNT;\
  /bin/cat $COUNT | /home/yoshio/public_html/cgi-bin/counter/ntoi;\
/bin/rm $LOCK)
コマンドの使い方については、manページを参照してください。

スクリプトを作成したら、Apacheが実行できるようにパーミッションを設定します。

$ chmod o+x cnt.sh
このスクリプトは、htmlファイルからSSIとして呼び出され、ロックファイルを作成し、カウンタ値をインクリメントして保存し、その値をCGIに引渡して、ロックファイルを解除するものです。

CGIの作成

グラフィックを取り出すCGIは、C言語プログラムで実装することにします。 ~/public_html/cgi-bin/counter/にntoi.cという名前で次のようなCのソースファイルを作成します。
include <stdio.h>

void main()
{
  char s[16];
  int c,i,j;
  for(i=0; i<=5; i++) s[i] = '0';

  while((c=getchar()) != EOF)
    s[i++] = c;
    i -= 7;
    for(j=0; j<=5; j++) {
      c=s[i+j];
      printf("<img SRC=\"/~hogehoge/cgi-bin/counter/%c.gif\" ALT=\"%c\">",c,c);
    }
}
hogehogeはユーザ名に置き換えてくださいね。また、カウンタ用画像をJpegで用意した場合には、printf関数呼び出しの中の文字列gifをjpgなどと置き換えてください。

ソースを保存したら、コンパイルして実行ファイルを作成します。

$ gcc -o ntoi ntoi.c
gccは使っているシステムによりc86とかccとかの場合があります。

Apacheの設定

あとはサーバの設定だけです。httpd.confにおいてUserDirと指定しているディレクトリの制御部分で次の宣言をします。
Options ExecCGI Includes
また、ハンドラを次のように設定します。
AddHandler cgi-script .cgi
AddType text/x-server-parsed-html .html
ここでの設定は、あくまでイントラネット用を前提としてます。インターネットに接続するサーバの場合には、セキュリティ面を考慮したやりかたに変えたほうが良いでしょう。

htmlの作成

あとは、htmlファイルからカウンタ用スクリプトを呼び出すだけです。SSI呼び出しは、次のように記述します。
<!--#exec cmd="./cgi-bin/counter/cnt.sh"-->
うまく動かない場合には次の点をチェックします。
[TOP]