Fedora 8 上で node.js を RPM からインストールする

おばんです。最近では JavaScript に夢中になっていて、サーバサイドも JavaScript で書きたくなってきた今日この頃みなさまいかがお過ごしでしょうか。

今回はサーバサイドで JavaScript を実行することが出来る node.js (執筆時点で最新版の v0.2.3) を Amazon AWS の Fedora 8 上で RPM を作ってインストールしてみたので記録として残しておきます。未確認ですが他の RedHat 系のディストリビューションでも通用するかと思います。


前もってソースコードのビルドに必要そうなものを入れておく

# yum groupinstall "Development Tools"

コンパイラや基本的なライブラリをまとめてセットアップしてしまいます。


必要なファイルを集める

# cd /usr/src/redhat/SOURCES
# wget http://nodejs.org/dist/node-v0.2.3.tar.gz

公式サイトからソースコードを入手します。

# cd /usr/src/redhat/SPECS
# wget http://gist.github.com/raw/635036/79e971db1dac505201525d9f13218f734b37ff17/nodejs.spec

すでに node.js の spec ファイルを書いている人がいたので、ありがたく利用させていただきました。(いまや spec ファイルも gist で公開されるような時代なのか……。)


RPM の作成・インストール

rpmbuild コマンドを使ってビルドします。

# rpmbuild -bb nodejs.spec
実行中(%prep): /bin/sh -e /var/tmp/rpm-tmp.86351
+ umask 022
+ cd /usr/src/redhat/BUILD
+ LANG=C
+ export LANG
+ unset DISPLAY

... snip ...

/usr/src/redhat/BUILD/node-v0.2.3/wscript:188: error: Could not autodetect OpenSSL support. Make sure OpenSSL development packages are installed. Use configure --without-ssl to disable this message.
エラー: /var/tmp/rpm-tmp.86351 の不正な終了ステータス (%build)

RPM ビルドエラー:
    /var/tmp/rpm-tmp.86351 の不正な終了ステータス (%build)

OpenSSL の devel パッケージがはいっていないのでビルド出来ずエラーしてしまいました。yum でサクっと入れてしまいます。

# yum install openssl-devel

気をとりなおしてもう一度!

# rpmbuild -bb nodejs.spec
実行中(%prep): /bin/sh -e /var/tmp/rpm-tmp.4886
... snip ...

メガバイト級のソースコードなのでビルドに結構時間がかかります。そろそろ終わりそうなところにさしかかってまたエラーしてしまいました。

... snip ...
ファイルの処理中: nodejs-debuginfo-0.2.3-1.fc8
Requires(rpmlib): rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1
伸張ファイルの検査中: /usr/lib/rpm/check-files /var/tmp/nodejs-0.2.3-1.fc8-tV2607
エラー: インストール済み(ただし未伸張)ファイルが見つかりました:
   /usr/lib/node/wafadmin/Build.pyc
   /usr/lib/node/wafadmin/Build.pyo
   /usr/lib/node/wafadmin/Configure.pyc
   /usr/lib/node/wafadmin/Configure.pyo
   /usr/lib/node/wafadmin/Constants.pyc
   /usr/lib/node/wafadmin/Constants.pyo
... snip ...

エラーメッセージを Google で調べてみると spec ファイル内の定義と実際の BUILDS ディレクトリのファイルに差異があると発生するようです。

上記サイトによると以下のオプションをつけて rpmbuild するとエラーしなくなるということがわかりました。(感謝!)

# rpmbuild -bb --define="__check_files %{nil}" nodejs.spec
実行中(%prep): /bin/sh -e /var/tmp/rpm-tmp.26330
... snip ...

またビルドが始まります。前回のビルド時にオブジェクトファイルが生成されているためか程々の時間でビルドが終了しました。

... snip ...
Requires(rpmlib): rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1
書き込み完了: /usr/src/redhat/RPMS/x86_64/nodejs-0.2.3-1.fc8.x86_64.rpm
書き込み完了: /usr/src/redhat/RPMS/x86_64/nodejs-debuginfo-0.2.3-1.fc8.x86_64.rpm
実行中(%clean): /bin/sh -e /var/tmp/rpm-tmp.60752
+ umask 022
+ cd /usr/src/redhat/BUILD
+ cd node-v0.2.3
+ rm -rf /var/tmp/nodejs-0.2.3-1.fc8-Pw6173
+ exit 0

これで /usr/src/redhat/RPMS/ 下に RPM をビルドすることに成功しました。あとはいつものとおり rpm コマンドでインストールすれば OK です。

# cd ../RPMS/x86_64
# rpm -ivh nodejs-0.2.3-1.fc8.x86_64.rpm
準備中...                ########################################### [100%]
   1:nodejs                 ########################################### [100%]

コマンドを叩いてみます。

# node --version
v0.2.3

大丈夫そうですね。


途中躓きながらでしたが無事 RPM からインストール出来ました。手始めに PHP では実装の難しいソケットサーバにチャレンジしてみようかなと思います。それではまた!

ファイル数が無尽蔵に増え続けそうな Linux サーバでは updatedb を無効にしておいたほうが良さげ

何気に Unix 系のネタは初めてです。お手柔らかに!

弊社では社内サーバのストレージを pdumpfs を使ってバックアップ専用のサーバに毎日バックアップを取得しているのですが、バックアップサーバのパフォーマンスが著しく劣化 (iowait が常時 50%) しているので調査してみました。

本当は調査の過程を詳細に書ければよかったのですが、とりあえず当てずっぽうに (top コマンドで updatedb がちらついていたのが気になったので) updatedb の仕業じゃないかなーと思って止めてみたらビンゴ。以下のように改善しました。

CPU 使用率 (年単位)

Week 41 の中盤頃に updatedb を停止したところ一気に負荷が下がりました。

CPU 使用率 (年単位)

年単位で見るといい感じに特徴的なカーブを描いています。

ちなみに updatedb は locate コマンド用にインデックスを作成する処理のようです。locate コマンドは使わないし find コマンドで代用できるのでオフにしても問題ないという判断で今回はオフにしてみました。

updatedb は cron によって起動されているので、cron のスクリプト (弊社の使っている CentOS 5 では /etc/cron.daily/mlocate.cron) をコメントアウトして停止しています。

#!/bin/sh
#nodevs=$(< /proc/filesystems awk '$1 == "nodev" { print $2 }') #renice +19 -p $$ >/dev/null 2>&1
#/usr/bin/updatedb -f "$nodevs"

というわけで今回は、ファイル数が無尽蔵に増え続けるようなサーバでは updatedb を停止したほうがよいかもというお話でした。それではまた!

preload preload preload