さくらVPSのdebian(squeeze)にnode.jsをインストール
サーバサイドJavascript 「node.js」
それ自体が何なのかについては、申し訳ありませんが割愛させていただきます。ふとwebsocketを試してみたくなったので入れてみました。実はすでに入れてはあったのですが、適当だったこととかなりバージョンがあがっていたこともあり、きちんとバージョン管理しつつインストールしてみようと思い立ち備忘録を兼ねてざっくり書いてみます。なお、この記事の内容はインストール当時(2011/05/31)のものであり、現在も同じようにできるとは限りませんのでご了承ください。
セットアップ環境
・さくらVPS(512)
・debian(squeeze) 64bit
・node.js 0.4.8
・npm 1.0.6
・nave(結局、下のnvmに乗り換えたので入れてはいません)
・nvm
必要なファイル
・build-essential
・curl
・git(現在はgit-coreじゃなくてOK)
・libssl-dev
かつてgitというパッケージ名で存在していたもの(GNU Interactive Tools)は現在「gnuit」と名前を変更しているそうです。少し前までは、現在いわゆる「git」と呼ばれているバージョン管理システムは少し前まで「git-core」でインストールしていました。どういう経緯があったのかはわかりませんが、今は前者がリネームされ「git」はバージョン管理システムの「git」となっています。
さて、上記パッケージをインストールします。
sudo apt-get update sudo apt-get install build-essential curl git libssl-dev
naveで失敗
node.js本体のバージョン管理ができるnaveというものを入れようとして、なんだか失敗しまして、メモとして残してはおきますが結果的にここは実行しなくてよかったところです。
git clone git://github.com/isaacs/nave.git ~/.nave ~/.nave/nave.sh install latest
ビルド途中のg++のあたりで
make: *** [program] 強制終了 Failed to make 0.4.8 fail
といった感じのエラーが出ました。(実際のエラーをメモり忘れたため、エラー文字列が微妙に違うかもしれません)
その後メモリ(スワップ)が0になって挙動がおかしくなりました。freeコマンドでメモリの様子をしばらく見てると元に戻りました。
この辺を見てみると、現在のnaveだとUbuntu10.04で問題が起きてるらしいと。g++とか書いてあるので上記の例と似たような感じかなと勝手に推測。Ubuntuはdebian系Linuxなんで同じ問題が本家debianで起きてもおかしくなさそうだし(とやはり勝手に推測)。
・http://groups.google.com/group/nodejs/browse_thread/thread/224daf34933d6d6b?tvc=2
・https://github.com/isaacs/nave/issues/10
怖いのでnaveやめて、同じようにnode.jsのバージョンが管理できるnvm にします。
nvmセットアップ
naveのことは忘れて(ホームにできた .nave は捨て去り)、気を取り直してnvmをインストールします。
git clone git://github.com/creationix/nvm.git ~/.nvm source ~/.nvm/nvm.sh
今度は何も問題起こらず一安心。
nvm install latest
ここでエラー。どうやら先に sync が必要?apt-get install の前に apt-get update やっとくみたいなもんですね。
nvm sync
ここでlatestのバージョンがいくつなのか気になったのでインストール前に
nvm ls
これでバージョンのリストを見ます。すると
latest: v0.4.8-rc
となっており、latestがv0.4.8-rcになってました。RCって普通「Release Candidate」つまり、リリース候補版ってことだと思うので、rcなしの方が古いわけないだろうから明示的にバージョン指定して0.4.8を入れることにします。
nvm install v0.4.8
これでインストール完了。使ってみたいバージョンがあればそれも同じようにインストール可能。切り替えは次の「use」でできるようです。というわけでどのバージョンを利用するのかを指定して実行します。
nvm use v0.4.8 →Now using node v0.4.8
nvmの設定はインストール前に行っている source ~/.nvm/nvm.sh で読み込んでいるため、ログアウトしてしまうと消えしまいます。私はbashを使っていますので .profile に以下を加えます。
source ~/.nvm/nvm.sh nvm use "v0.4.8"
CentOSとかのbashだと .bash_profile なんですが、debianは .profile なんですね。バージョン上がったら書き換えなきゃいけないのがめんどいですが、何か他に良い方法があれば教えてください。
さて、2個前のインストール中に気づいたのですが、npmも同時にインストールしてくれたっぽいです。
npm -v →1.0.6
npmセットアップ
npmはnode.js本体にはない、さらに便利な機能や様々なテクノロジーが詰まったモジュールを管理できる素敵なツールです。今回の目的でもあるsocket関係のこともモジュールを入れないとできないので、欠かせないツールです。各種モジュールのインストール方法は簡単です。
npm install socket.io または npm install socket.io -g
のように行います。昔はなかったオプションの「-g」はグローバルインストールにするかどうか、だと思います。 現在のnpmは指定なしでモジュールをインストールしようとするとカレントディレクトリにnode_modulesを作成してその中に個別にインストールされます。どれでも同じバージョンで動く共通のモジュールとして使いたい場合は「-g」オプションをつけます。とりあえず今回は実験目的なので全部グローバルにしちゃいます。
Error: Cannot find module ‘express’
フレームワークのモジュール「express」を使って書いたサンプルプログラムで出たエラーについてもついでに書いておきます。この Error: Cannot find module ‘express’ というエラーは環境変数のNODE_PATHにグローバルのnode_modulesのパスが通っていないため起こるようです。nvmでnode.jsをインストールし、またnpmでグローバルインストールしたモジュールは ~/.nvm/使用中のバージョン/lib/node_modules にあったので再び .profile に以下の設定を加えました。
source ~/.nvm/nvm.sh nvm use "v0.4.8" npm_dir=${NVM_PATH}_modules export NODE_PATH=$NODE_PATH:$npm_dir
おわりに
というわけで、長々と記述してきましたが、だいたいこれでなんとかなると思われます。お疲れ様でした。 実際のコードや便利な使い方については別の記事にまとめられたらと思っています。
(おまけ)npmで入れる鉄板モジュール
・socket.io(今回の目的であるwebsocketを実装するためのもの)
・express(フレームワーク)
・ejs(テンプレートエンジン)
・node-dev(モジュールというかデバッグアプリケーションというか)
上記3つについてはそのままなんですが、最後の node-dev はプログラムで使用するものではなく、起動時に使用するものです。通常node.jsでサーバを起動する時は
node app.js
として起動します。ただこれだと、サーバが起動しっぱなしの状態ではapp.jsの中身を編集しても内容は変更されません。なのでCtrl-Cなどで抜けてから再び実行するわけですが、とても面倒です。それを解消するのが node-dev。上記の様な起動の変わりに以下のように実行します。
node-dev app.js
これで実行しておくと、どうやって監視しているのかわかりませんが、app.jsの中身が変更されたと同時に勝手にサーバが再起動されます。コードをいじりまくる開発段階ではとても役立ちます。
[…] 、別のバージョン管理 nvm を入れてみる さくらVPSのdebian(squeeze)にnode.jsをインストール […]