Windows で lighttpd を使う

CGI をローカルでテストする為の環境を整えたいと思います。
サーバーソフトウェアには lighttpd (別名 lighty)を使ってみます。もちろん Apache でも良かったのですが、お手軽で速いという噂の lighttpd を試してみたいと思っていたので。(^_^)
lighttpd は各種プラットフォームで動作します。Windows 向けのバイナリは、Kevin Worthington さんのサイトにて配布されています。本来は Cygwin という Windows 用の UNIX ライクな環境の導入が必要でしたが、こちらのサイトで配布されているパッケージを使う場合は、必要ありません。

インストール

今回は lighttpd 1.4.11 をダウンロード・インストールしました。ダウンロードしたインストーラを起動し、「Next」ボタンを押していくだけでインストール完了です。インストール先は「C:\lighttpd」で固定のようです。とても簡単。(^_^)
インストール完了時に「lighttpd を起動しますか?」と聞かれたので、起動してみました。試しにブラウザから http://localhost/ を開くと、「lighttpd Test Page」が表示されます。インストールは上手く出来たみたいですね。また、lighttpd の開始・停止はスタートメニューから簡単に出来ます。

設定

次に、設定ファイルを編集して lighttpd を設定します。設定ファイルは通常「C:\lighttpd\etc\lighttpd.conf」となります。
以下はあくまで palmo 自身が行なった設定ですので、参考になさる場合はお使いの環境に合わせて設定内容を変えてください。また、行番号は「lighttpd.conf v1.7」でのものです。


まずは読み込むモジュール。「server.modules」です。

## modules to load
# at least mod_access and mod_accesslog should be loaded
# all other module should only be loaded if really neccesary

和訳すると「最低でも mod_access と mod_accesslog は読み込まれるべきですが、その他の全てのモジュールは本当に必要な時だけ読み込まれるべきです」でしょうか。mod_rewrite や mod_auth など、モジュールの名前が Apache と同じなので、馴染みやすいですね。
CGI を有効にするには mod_cgi モジュールを読み込む必要があります。lighttpd.conf の server.modules の中から 29 行目の

#                               "mod_cgi",

という行を、先頭の # を消して有効にします。

                                "mod_cgi",

これで mod_cgi モジュールが有効になるはずです。


さらにその下 40 行目には、「server.document-root」があります。ここで指定したフォルダに http://localhost/ からアクセスできるようになります(ドキュメントルートとなる)。デフォルトでは「C:/lighttpd/htdocs」となっていますが、自由に変更しても良さそうです。「D:\home\palmo\htdocs」に設定してみました。バックスラッシュ(円マーク)は、スラッシュにした方が良さそうですね。

server.document-root        = "D:/home/palmo/htdocs/"


46 行目の「index-file.names」は、リクエストされた URL が「/」で終わっていた時にデフォルトで読み込むファイルですね。恐らくリストの最初にあるファイル名が優先されると思われます。一応、「index.cgi」を先頭に加えておきます。

index-file.names            = ( "index.cgi", "index.php", "index.html",
                                "index.htm", "default.htm" )

これで、例えば http://localhost/ を開いた時に http://localhost/index.cgi があれば自動的に開かれるようになりました。


133 行目の「static-file.exclude-extensions」は、説明によると「静的ファイルとして処理しない拡張子」です。最初から ".pl" や ".fcgi" (Fast-CGI 用の拡張子)が登録されていますが、ここにも一応 ".cgi" を登録しておきます。(もしかしたら必要ないかも)

static-file.exclude-extensions = ( ".php", ".pl", ".fcgi", ".cgi" )


標準では lighttpd はポート 80 で動きますが、他のサーバーソフトウェアなどが既にポート 80 を利用している場合は、競合してしまいます。その場合は 138 行目の「server.port」を有効にして、好きなポート番号にすれば良いですね。(^_^)
例として、ポートを 81 に変えた場合は http://localhost:81/lighttpd サーバーにアクセスできるようになります。


219 行目からが CGI モジュールの設定です。といっても設定はとても簡単。拡張子と実行プログラムの対応関係を設定するだけです。

#cgi.assign                 = ( ".pl"  => "/usr/bin/perl",
#                               ".cgi" => "/usr/bin/perl" )

まず、先頭の # を消して有効にします。次に "/usr/bin/perl" を perl.exe へのパスに書き換えればいいみたいです。Apache とは違い Shebang 行から自動的に読み込んでくれるわけではないようですね。
僕の場合 Perl は「C:\Perl」へインストールしたので perl.exe のパスは「C:\Perl\bin\perl.exe」となっています。詳しくは後述しますが、Apache を使っていたら CGI プログラムをアップロードする前に Shebang 行を書き換える必要があったので、lighttpd のこの機構はとても助かります。
perl.exe へのパスのバックスラッシュをスラッシュに書き換えて、こうなりました。

cgi.assign                 = ( ".pl"  => "C:/Perl/bin/perl.exe",
                               ".cgi" => "C:/Perl/bin/perl.exe" )

これで拡張子 .pl や .cgi のファイルは perl.exe で実行されるようになるはずです。


次は簡単なセキュリティの設定をします。インターネットにつながっているコンピュータ上でサーバーを立てる場合、外部から接続できるので注意が必要です。自分のグローバルIPアドレスがわかる場合は http://IPアドレス/ をブラウザで開くと確認できます。
僕の場合、lighttpd はローカルでのテスト専用のサーバーとして使うので、外部からアクセスできないようにしたいと思います。(といってもファイアーウォールで弾けるとは思いますが、念の為)
といっても、デフォルトの設定ファイルではそれらしき設定が見つからなかったので、マニュアル(C:\lighttpd\doc\configuration.txt)を読んでみました。どうやら Perl のような条件式を使って設定が書けるようです。これはわかりやすいですね。(^_^)
ローカルから見る場合 $HTTP["remoteip"] に "127.0.0.1" が入っています。mod_access モジュールのと組み合わせて、こんな感じになりました。

$HTTP["remoteip"] != "127.0.0.1" {
  url.access-deny = ("")
}

これを lighttpd.conf の末尾に追加しておきます。
url.access-deny は、指定した文字列を末尾に持つファイルへのアクセスを禁止できます。空文字を指定したので、全てのファイルへのアクセスを禁止しています。

  url.access-deny = (".inc", ".log")

のようにすれば、拡張子が「.inc」か「.log」のファイルへのアクセスが禁止になります。シンプルですね。


これで大体の設定ができました。シンプルな設定ファイルなので、設定がとてもわかりやすいです。個人で使うのにうってつけですね。lighttpd は大規模サイトの運用にも耐えるそうなので、設定ファイルの書き方を覚えておけば今後の役に立ちそうです。
設定ファイルを保存したら lighttpd を再起動すれば反映されます。

試してみる

設定したドキュメントルート(僕の場合は D:/home/palmo/htdocs/)に適当な index.html を置いて、http://localhost/ を表示してみると、ちゃんと確認できました。(更新が必要かもしれません)


今度はいよいよ CGI が動くか確認します。簡単な CGI スクリプトを書いてみました。

#!/usr/local/bin/perl

print "Content-Type: text/html\n\n";
print "Hello, world!\n";

1行目は「Shebang行」(シーバン行)と呼ばれるもので、これについては別のエントリで詳しく説明したいと思います。
1つめの print 文は、訪問者のリクエストに対する返事(レスポンス)のヘッダーに出力する「Content-Type」です。これは何かと言うと、このプログラムが今から「何を」出力するかを知らせています。CGI プログラムは色々なものを「出力」する事ができるので、何を出力するのか教えなくてはいけないのです。
CGI プログラムには、実行結果としてブラウザに表示する HTML 文(text/html)を出力するプログラムが多いですが、例えばアクセスカウンターのプログラムなどは「画像」を出力しますし、「PDF」を出力したり「エクセルの表計算ファイル」などを出力する事だってできます。とても便利な機構ですね。(^_^)
ヘッダーの終わりを表すには「\n\n」と、改行を2つ出力するだけです。
その次の print 行は、実際の出力を行なっています。この辺りはお馴染みですね。
このスクリプトを hello.cgi としてドキュメントルートに保存して、http://localhost/hello.cgi を開くと、以下のように表示されました。

Hello, world!

ちゃんと動きましたね。(^_^)


というわけで、lighttpd をインストールし、CGI の実行環境が整いました。どんどん CGI を勉強したいと思います!