2011年1月29日土曜日

UbuntuにCGIプログラムの開発環境を

CGIを使ってPerlプログラミングする際、Ubuntuにウェブサーバーをインストールするのが面倒で、いつもWindowsに移ってコーディングしてましたが、フォントがギザギザで目がチカチカする。
それもあってWindowsに移る前にUbuntuのgeditで茶々っと書いてたりもしてました。しかし面倒だ。
これならUbuntuにウェブサーバーをインストールした方がいい!と思い直し、先程作業が完了しました。

ウェブサーバー・ソフトウェアには「lighttpd」を使いました。
これはWikipediaやYoutubeでも使われている、シンプル・省リソースで高速・ハイパフォーマンスなものです。
インストールと設定はこのソフトウェアに辿りつくまでに試した「boa」や「thttpd」より遥かに簡単で、期待した動作をしてくれました。

とは言うものの、設定はほとんど悪い意味で適当なので参考程度に。初めからそうだとは思いますが。

まず、インストール。
$ sudo apt-get install lighttpd
この時点で "http://localhost/" にアクセスすると、"It works!" が表示されると思います。
この状態になっていれば、lighttpdは正常に動作しています。
別に今はまだアクセスしなくても、動作していなくても構いません。次に、設定を行いましょう。

設定を行う為に、設定ファイルの所有者を変更します。
$ cd /etc/lighttpd/
$ sudo chown [username] lighttpd.conf /conf-available/10-cgi.conf
$ gedit lighttpd.conf /conf-available/10-cgi.conf
[username]をあなたがubuntuで使っているユーザー名(デフォルトでは、画面右上の電源マークの隣に表示されているはずです)に置き換えて実行してください。
全ての設定が終わったら所有者を "root" に戻しておきましょう。

最終行のコマンドでgeditが起動し、2つの設定ファイルの内容が表示されるはずです。
lighttpd.conf は基本的(グローバル)な設定、10-cgi.conf はCGIの利用に関する設定が含まれます。

最初に、lighttpd.confの以下の箇所(server.modulesの値)をコメントアウト。
server.modules              = (
#           "mod_access",
#           "mod_alias",
#           "mod_accesslog",
#           "mod_compress",
#           "mod_rewrite",
#           "mod_redirect",
#           "mod_evhost",
#           "mod_usertrack",
#           "mod_rrdtool",
#           "mod_webdav",
#           "mod_expire",
#           "mod_flv_streaming",
#           "mod_evasive"
)
どれもネットワーク経由でWebサーバーとして公開する人向けのモジュールです。
ローカル用サーバーとして使う場合には、これらは必要ありません(それにしても、圧縮転送が標準で使えるとは・・・)。

次にドキュメントルートです。
指定するドキュメントルートはユーザーレベル(パーミッションの8進表記でいう1桁目)で最低でも読み込みとアクセス (r-x) が許可されていなければなりません。
server.document-root = "/home/www/"
別にこのパス(ルート)でなくても構いませんが、homeディレクトリにサブディレクトリ(この例では"www")やファイルを作成する際は、最初にやったようにchownコマンドで所有者を変更する必要があります。

そしていよいよ、CGIの利用に関する設定です。10-cgi.confを以下のように書き換えて下さい。
既にコメントアウトされている行は削除しなくても構いません。
server.modules  += ( "mod_cgi" )

cgi.assign = (
".pl"  => "/usr/bin/perl",
".php" => "/usr/bin/php-cgi",
".py"  => "/usr/bin/python",
)

cgi.assign += ( ".cgi" => "" )
cgiを有効にするには、先程 値をコメントアウトした "server.modules" に "mod_cgi" を追加する必要があります(これだけではまだCGIを使うことはできません。もう少しお読みください)。

cgi.assignの値の拡張子に関連付けられたパスを空にすると、その拡張子のファイルはネイティブコードを実行できたり、シェバング(スクリプトファイルの先頭行にある #!〜)で指定されたプログラムを実行できたりします。

この場合、".cgi" という拡張子のファイルは上記に該当します。
.cgiはPerl専用の拡張子ではなく、他の言語でも使われることが多いので注意。

後はこの設定を有効にするだけです。
"lighty-enable-mod" というコマンドにモジュール名を渡します。
$ sudo lighty-enable-mod cgi
これで、"/conf-available/10-cgi.conf" が "/conf-enabled/10-cgi.conf" にコピーされ、"mod_cgi" が有効になります。
もし他のモジュールを有効にして正常に動作にしなくなった場合、"conf-enabled" ディレクトリ内の該当ファイルを削除すれば解決することを覚えておいてください(自分は "mod_fastcgi" を有効にしてこれを学んだ)。

最後に、動作テストです。
以下の内容のファイルを "hello.cgi" という名前でドキュメントルートに置いて下さい。
#!/usr/bin/perl

use strict;
use warnings;

print 'Content-Type: text/plain', "\n\n";
print 'Hello World!';
実行権を与えて、ウェブブラウザから "http://localhost/hello.cgi" にアクセスして "Hello World!" が表示されれば設定完了です。
ファイル毎に実行権を与えるのが面倒な場合は、どうせテスト環境ですので
$ sudo chmod -R 777 /home/www/
としてしまいましょう。
こうすると、"/home/www/" とその中の全てのディレクトリやファイルのパーミッションが 777 になり、実行権が与えられます(thttpdではCGIファイル以外に実行権を与えるとエラーになる)。

CGIでPHPを使いたい場合、php-cgiは標準の状態ではインストールされていないので
$ sudo apt-get install php5-cgi
でインストールしましょう。

lighttpdの再起動や停止は
$ sudo service lighttpd
で行えます。

lighttpdでは、設定で条件文が使えたりするので色々弄ってみると面白いかもしれません。
あ、でもバックアップは忘れずに・・・。

お疲れ様でした。自分にも乙。


FTPクライアントは「bareFTP」がオススメです(ソフトウェアセンターから入手できるバージョンは糞重いので最新版を推奨)。。。

徹底比較!Apache vs. lighttpd!

0 件のコメント:

コメントを投稿