ポケビでCGI

概要

バイトでCGIをやる事になったので、 モバでCGI環境を構築する。 CakeさんがmhttpdをCGI対応にしてくれたので、 これを用いる。Cakeさんに感謝(^^)
目的は、CGIのデバッグ。最終的な物ではなくて、軽い動作確認程度のつもり。 でも、これで動けば今の所他のでもたいてい問題無いけど。
実際にやった事としては、CGI対応のサーバーを入れるだけ。 そんなに高機能な事は出来なくてもいいから軽い奴、 と考えて、mhttpdを採用する。

mhttpdについて

利点はだいたい想像できるでしょうが、
  1. 軽い
  2. ソースが簡単(デバッグメッセージを流したり、デバッグに便利)
1についてはそのまんま。とにかく軽いです。mhttpd走らせたまま、 裏でnemacsでコード変更なんてへっちゃらっす。起動も一瞬(まあ普通そうか)。 最高です。
2については、やはり簡単なプログラムというのはいいです。 サーバーのバグとかがあっても、mhttpdの方は完全に理解できるので、 mhttpd側の問題は簡単に発見出来るので、問題の切り分けが簡単です。
ただし、現在の所CGIの仕様がapache等と異なる場合があります。 特にディレクトリのパス関係は少し特殊です。 という訳でCGIが悪いのかmhttpdが悪い(というか仕様の違い)のかを判断出来ない人 が使うにはまだ厳しいかな?
ただ、そういう環境でプログラムを続ける事により、 ディレクトリやプログラムのフルパスをちゃんと最初にグローバル変数にするくせがついたりしてよいです(Perlの場合)。htmlの方のパスをかえるのはだるいですが。

インストールと設定

とりあえず、必要なのはmhttpdのバイナリと、ブラウザだけです。 でも、バイトがPerlなので、自分もPerlを入れました。 という訳でPerlを前提に話を進めます。
用意した物
  1. mhttpdのバイナリ(Cakeさんのページから)
  2. Perlのミニパッケージ(たつろうさんの所から)
  3. w3m,NetFront等
Perl、w3m等は、rootになってpkg_addで一発です。
mhttpdのバイナリについては、パッケージなんてないですが、 バイナリ置くだけなので問題ないでしょ?
mhttpdは、そのままで使ってもいいんですが、 デバッグ用にいじります。sock_putsの所で、 流れてきたデータをstderrに流します。writeと同じ結果をdmsgの方にも流します。 ちょっと、手元のソースはいろいろいじってしまっているので、 何行目を直したのかは覚えてませんが、簡単に変更できるでしょう。
普通に解凍(またはmake)して、/usr/local/sbin/にでも置いて下さい。
mhttpdは、ルートで
% mhttpd 80
として、別のコンソールで普通のユーザーでログインして、 例えばw3mなら
$ w3m http://localhost/フッシュメモリ内の絶対パス
とかやる訳です。 ここまでで、だいたい終わりですが、パスが長いのはちょっとつらいので、 適当にシンボリックリンクをはります。
ln -s /home/kazuma/public_html /kazuma
ln -s /home/kazuma/cgi-bin /cgi-bin
まあ、こんな感じです。セキュリティホールとかは、このさい気にしない。 それで、requireに関する挙動が、 mhttpdを実行した時のカレントディレクトリしか見にいってない気がするので、 問題を一応解決する為(本当は解決じゃないけど)に、 cgi-binに移動した後にmhttpdを起動するようにshでラップします。
#!/bin/sh
cd /cgi-bin ;/usr/local/sbin/mhttpd 80
とかいうのをhttpdとかいう名前で保存して、ひごろはこっちを使います。 こうすれば、requireは、/cgi-binというディレクトリを探してくれるので、 シンボリックリンクとかをcgi-binにベタベタはる事で、 一応のデバッグ環境が出来る訳です。もっといい方法もあると思いますので、 もしあったら教えてください。

CGIの実行

それではいよいよ実行です。まずは、cgi-binの属性を変更します。
%chmod 777 /home/kazuma/cgi-bin
%chmod 777 /cgi-bin
UNIXのベテランなら恐くてこんな事は出来ないかもしれませんが、 パーソナルユースなモバなら余裕です(そうなの?)。 次に、hello.cgiとかいうファイルを、以下のような内容で作ります。
#!/usr/bin/perl

print "Content-Type: text/plain\r\n\r\n";
print "hello!";

次に、
$ chmod a+x hello.cgi
して、
$ w3m http://localhost/cgi-bin/hello.cgi
としてみてください。これでちゃんと表示されたましたね? ここから先は普通のCGIの知識になるので、他に譲ります。 とりあえず、下のページが入門にはいいです。
PerlとCGIの解説のページ