いろいろと後回しにしていた「理解すべき項目」たちをやっつけていくために、また玄箱Proを標準ファーム・フラッシュブートに戻し、日経Linuxの2007.6月号の特集3「玄箱PROを堪能する/Part2 高速Webサーバー「lighttpd」を動作させる」を試してみました。
米田さんの記事です。
概略として
・標準ファーム・フラッシュブートのままで導入
・シリアルコンソールは必要なし
・lighttpdをHDDに展開し、/にシンボリック・リンクを作成
・ソースファイル一式をアーカイブしたファイル「lighttpd_src.tar.gz」が本誌付録にあり、それを使用
という内容です。
誌面を見ながら順番通りに導入しますので、失敗はありません。誰でもできます。
ひとまず導入の流れを理解するために、まずはこの誌面通りにやってみます。
今回の自分ポイントは
・chrootの理解・ソースからビルドする方法などです。
1.玄箱PROをネットに接続する/etc/netinfoでIPアドレスなどをスタティックに設定します。
私はルータで玄箱Proに固定IPを払い出しているのでこの項目は飛ばしました。
2.開発環境を導入する玄箱Pro付属CD-ROMから開発環境を導入します。
要するに製品仕様書30P「Appendix B:開発環境の構築方法」をほぼそのまま実行します。
まずは背面のリセットボタンを長押ししてHDDのフォーマットからです。
フォーマットされたHDDは/mnt/disk1でマウントされますので、そこにCD-ROMの開発環境である
hddrootfs.tar.gzをコピーします。
さらに、開発環境の導入先として/mnt/disk1/develディレクトリを用意し、ここに先ほどの開発環境を展開します。
~ # mkdir /mnt/disk1/devel
~ # tar xvzf /mnt/disk1/hddrootfs.tar.gz -C /mnt/disk1/devel
この後ログで8490行、ひたすら待ちます。
この時点で、/mnt/disk1/devel以下に開発環境が整い、chrootすることで/以下と同じように構築することができる、ということですよね・・。
3.ソースのビルドとインストールCGIスクリプト「Perl」、FastCGIのライブラリ「fcgi」およびlighttpd本体をソースからインストールします。FastCGIを利用するために「ExtUtils-Embed」および「FCGI」というPerlのモジュールも必要です。これら必要なソース・ファイル一式をアーカイブしたファイル(lighttpd_src.tar.gz)を本誌付録メディアに収録しておきました。先ほどと同じく、玄箱PROの/mnt/disk1にコピーした後、展開します。
とのことなので、その通りにします。
/mnt/disk1 # ls
devel hddrootfs.tar.gz lighttpd_src.tar.gz
/mnt/disk1 # tar xvzf /mnt/disk1/lighttpd_src.tar.gz -C /mnt/disk1/devel/usr/
約6500行のログが生成されます。
ここからがchrootの出番なんですが、
/optにlighttpdなど一式をインストールする設定で進めます。
と本誌にも説明があるように、/mnt/disk1/develが仮想的に/になり、ビルドされるソース一式にも「/optに自分たちは構築されるんだ」と認識させるように振舞う感じでしょうか。
/mnt/disk1 # chroot /mnt/disk1/devel
先ほど展開した開発環境は/usr/srcにありますので、Perlのインストールを/usr/src以下で行います。
/ # cd /usr/src/perl-5.8.8/
/usr/src/perl-5.8.8 # ./configure.gnu -Dprefix=/opt
/usr/src/perl-5.8.8 # make
/usr/src/perl-5.8.8 # make test
/usr/src/perl-5.8.8 # make install
今は詳しく触れませんが、この./configureについている様々なオプションの意味もよくわかっていません。
.gnuとかDprefixのDとか。
全然調べてもいないので、また後で調べます。とにかく今は書かれている通りに進めます。
次にFastCGIモジュールをインストールします。
/usr/src/perl-5.8.8 # cd /usr/src/FCGI-0.67
/usr/src/FCGI-0.67 # /opt/bin/perl Makefile.PL
/usr/src/FCGI-0.67 # make
/usr/src/FCGI-0.67 # make install
続いてFastCGIのディスパッチャで使用するPerlモジュールEmbed::PresistentとFastCGIのインストールです。
/usr/src/FCGI-0.67 # cd /usr/src/ExtUtils-Embed-1.14
/usr/src/ExtUtils-Embed-1.14 # /opt/bin/perl Makefile.PL
/usr/src/ExtUtils-Embed-1.14 # make install
/usr/src/ExtUtils-Embed-1.14 # cd /usr/src/fcgi-2.4.0
/usr/src/fcgi-2.4.0 # ./configure --prefix=/opt
/usr/src/fcgi-2.4.0 # make
/usr/src/fcgi-2.4.0 # make install
そしてlighttpd本体をインストールし、chroot環境を抜けます。
/usr/src/fcgi-2.4.0 # cd /usr/src/lighttpd-1.4.13
/usr/src/lighttpd-1.4.13 # ./configure --prefix=/opt
/usr/src/lighttpd-1.4.13 # make
/usr/src/lighttpd-1.4.13 # make install
/usr/src/lighttpd-1.4.13 # exit
これでひとまず必要なものを一式詰め込んだ状態です。
4.lighttpdの設定仮想/optに展開したものを実際の/optに配置します。
本誌では玄箱Proの少ないフラッシュメモリに配置することをあまり推奨せず、/mnt/disk1/devel/optのシンボリック・リンクを/に作成する方法を一番に挙げています。
事実上HDD上でlighttpdは動作しているわけですね。
/mnt/disk1 # ln -s /mnt/disk1/devel/opt /
5.設定ファイルを作成する設定ファイル「lighttpd.conf」も付録にありましたので、これをサクっと/opt/etc以下に置きます。
ここではデフォルトで公開用ディレクトリは/mnt/disk1/htdocsになっているようです。
確かにこれなら容量に余裕があり、尚且つ更新作業時などでも簡単に共有フォルダへWindowsからでもアクセスできかなり便利ですよね。
では、その/mnt/disk1/htdocsを作成します。
/mnt/disk1 # mkdir /mnt/disk1/htdocs
/mnt/disk1 # chmod 777 /mnt/id disk1/htdocs
ここで、本誌に以下の解説があります。
FastCGIの設定には、CGIのスクリプトごとに設定する方法と、すべてのCGIをFastCGIとして動作させる方法があります。前者の方がパフォーマンスは高くなりますが、後者の方が、Apache HTTP Serverのmod_perlに近い汎用性が得られるというメリットがあります。今回は後者を試すことにします。
そして、この「後者」の場合、perlで記述されたCGIを呼び出すディスパッチャが必要になるそうです。
それが/opt/bin/dispatch.fcgiとして以下の内容。
#!/opt/bin/perl
use strict;
use CGI::Fast;
use Embed::Persistent;
{
my $p = Embed::Persistent->new();
while (new CGI::Fast) {
my $filename = $ENV{SCRIPT_FILENAME};
my $package = $p->valid_package_name($filename);
my $mtime;
if ($p->cached($filename, $package, \$mtime)) {
eval {$package->handler;};
} else {
$p->eval_file($ENV{SCRIPT_FILENAME});
}
}
}
そして所有者と所有グループをlighttpdの実行ユーザーapache、同グループであるapacheに変え、実行権限を付けておきます。
/mnt/disk1/devel/opt/bin # chmod +x /opt/bin/dispatch.fcgi
/mnt/disk1/devel/opt/bin # chown apache:apache /opt/bin/dispatch.fcgi
導入自体はこれで完了です。
その後、Busyboxのhttpdを止め、lighttpdを起動させます。
あとはchmodでa+xをつけたテスト.cgiファイルで実験して動作確認です。
/mnt/disk1/devel/opt/bin # /etc/init.d/httpd.sh stop
/mnt/disk1/devel/opt/bin # /opt/sbin/lighttpd -f /opt/etc/lighttpd.conf
自動起動の設定は/etc/init.d/httpd.shを以下のように書き換えます。
#!/bin/sh
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/opt/bin:/opt/sbin:
HTTPD=/opt/sbin/lighttpd
CONF=/opt/etc/lighttpd.conf
PIDFILE=/var/run/lighttpd.pid
HTTPD_START(){
if [ -f $CONF ] ; then
$HTTPD -f $CONF
fi
}
HTTPD_STOP(){
kill `cat $PIDFILE`
}
HTTPD_RESTART(){
HTTPD_STOP
sleep 1
HTTPD_START
}
case $1 in
start)
HTTPD_START
;;
stop)
HTTPD_STOP
;;
restart)
HTTPD_RESTART
;;
*)
;;
esac
6.スワップ領域を作っておこうFastCGIを利用する場合、perlのプロセスが常駐するため、メモリ不足を解消する必要があります。
HDD上に容量256MBのスワップ・ファイル(swapfile)を作成し、mkswap、swaponコマンドを使います。
~ # dd if=/dev/zero of=/mnt/disk1/swapfile bs=1024 count=262144
~ # mkswap /mnt/disk1/swapfile
~ # chown root:root /mnt/disk1/swapfile
~ # chmod 600 /mnt/disk1/swapfile
~ # swapon /mnt/disk1/swapfile
/etc/init.d/rcSファイルの末尾にswaponコマンドを追加すればスワップ・ファイルが起動時に有効になります。
以上が私が日経Linuxの特集を見ながら実行した作業です。
順調にlighttpdは動作しました。
今回の作業で疑問に思ったことを挙げておいて、次回までになんとか解決するようにします。
そして次回は付録のデータを一切使わずに同じ内容を再現してみようかと思います。