2015年03月20日

Raspberry Piで【node.js】を使ってみる

【今日のゴール】
RaspberryPiにnode.jsをインストールして、node.jsを動かします。

web-accelerators-nodejs.jpg

【手順】
  • 「node.js」のインストール
  • もっと簡単に「node.js」のインストール
  • 「npm」のインストール
  • 「Socket.IO」のインストール
  • Hello World!!してみる
  • Expressを使ってHello World!!してみる
  • デーモン化してみる
node.jsのインストール

aptからインストールすると、バージョンが古い(v0.6.19)のでソースからインストールします。
2015年3月現在の最新評価版はv0.11.15ですので、このバージョンをインストールします。

最新のバージョンはWikipediaで確認するのが手っ取り早いです。

node.jsのディストリビューションの一覧は下記から確認できます。
https://nodejs.org/dist/

まずはNode.jsのビルドに必要なパッケージをaptでインストール
$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get install build-essential 
$ sudo apt-get install libssl-dev
$ sudo apt-get install libv8-3.8.9.20 libv8-dbg libv8-dev
pacoがインストールされていない場合はインストールします。
$ sudo apt-get install paco

node.jsをインストールしていきますが、ここで以下の問題が。
Error Compiling Armv6 (Raspberry Pi B+) #9163

そのままコンパイルしようとするとGoogle V8 JavaScript Engineのsnapshot.ccのコンパイルでエラーが発生してしまいます。 ですので、configureにオプションで「--without-snapshot」を付けてsnapshotを対象外にしてインストールすることにします。

node.jsのソースを取得し、ビルド、コンパイル、インストールします。
makeに数分かかります。ソースのバージョンは適宜変更してください。
$ cd /tmp
$ sudo wget https://nodejs.org/dist/v0.11.15/node-v0.11.15.tar.gz
$ sudo tar zxvf node-v0.11.15.tar.gz
$ cd node-v0.11.15
$ sudo ./configure --without-snapshot
$ sudo make
$ sudo paco -lD "make install"

下記コマンドを打ってバージョンが表示されれば、無事インストールされています。
$ node -v
もっと簡単に「node.js」のインストール

実は下記の「node-arm」というのを使って簡単にインストールできます。
http://node-arm.herokuapp.com/

node-armと言うのは、「An easy way to install node.js on the Raspberry Pi」(RaspberryPiに簡単にnode.jsをインストールする)とホームページに説明が書いてある通り、簡単にnode.jsをインストールできちゃいます。

$ sudo wget http://node-arm.herokuapp.com/node_latest_armhf.deb # ディストリビューションの取得
$ sudo dpkg -i node_latest_armhf.deb  # インストール

$ node -v  # インストールの確認

「npm」のインストール

Node.jsのパッケージを管理する「npm(node package manager)」をインストールします。
(インストールに数分かかります)
$ cd /tmp
$ sudo wget http://npmjs.org/install.sh
$ sudo ./install.sh
インストールが成功すれば、下記コマンドでバージョンが表示されます。
$ npm -v
とりあえずsocket.ioをインストールしてみます。(インストールに数分かかります)
[-g]オプションをつけると、グローバルにインストールされます。付けないと、カレントディレクトリにインストールされます。
$ sudo npm install -g socket.io

# インストール後の確認
$ sudo npm list -g
他にも、いろんなパッケージがあるので、必要に応じてインストールしてみてください。

Hello World!!してみる

適当なディレクトリで、「helloworld.js」というファイルを作り、以下のように編集します。
$ cd ~ 
$ sudo vi helloworld.js
var http = require('http');
var server = http.createServer(
function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.write('Hello World!!\n');
    res.end();
}
).listen(3000);
保存したら、nodeコマンドで先ほどの「helloworld.js」を指定します。
$ node helloworld.js 
WEBブラウザを開き、以下のアドレスを入力すると、ブラウザに「Hello World!!」と表示されます!

 ● RaspberryPiのブラウザからアクセスする場合「http://127.0.0.1:3000/」
 ● リモートでアクセス「http://RaspberryPiのIPアドレス:3000/」

Expressを使ってHello World!!してみる

せっかくなので Express というフレームワークを使ってみます。

まずはnpmでExpressをインストールします。 Expressをインストールしたら、「helloworld_exp.js」というファイルを作り、編集していきます。
$ sudo npm install -g express

$ cd ~ 
$ sudo vi helloworld_exp.js
require.main.paths.push('/usr/local/lib/node_modules');
var express = require('express');
var app = express();

app.get('/', function (req, res) {
    res.send('Hello, World Express!!');
});

app.listen(3000);
保存したら、nodeコマンドで実行しブラウザからアクセスすると「Hello, World Express!!」と表示されます。
$ node helloworld_exp.js
 ● RaspberryPiのブラウザからアクセスする場合「http://127.0.0.1:3000/」
 ● リモートでアクセス「http://RaspberryPiのIPアドレス:3000/」

デーモン化してみる

前項で作った、「helloworld.js」をSupervisorを使ってデーモン化してみます。

まずはこちらのエントリーを参照し、Supervisorをインストールしてください。
Raspberry Piに【Supervisor】をインストールして、motionをデーモン化してみた

Supervisorのhelloworld.js 用の設定ファイルを作成します。
$ sudo vi /etc/supervisor/conf.d/node_helloworld.conf
/etc/supervisor/conf.d/node_helloworld.conf
[program:helloworld]
command=/usr/local/bin/node /home/pi/helloworld.js 
numprocs=1
redirect_stderr=true
stdout_logfile=/var/log/helloworld.log
user=pi

# 設定、再読込
$ sudo supervisorctl reread
helloworld: available

# helloworldプロセスを追加→起動
$ sudo supervisorctl add helloworld
helloworld: added process group

# 起動確認
$ sudo supervisorctl status
helloworld                       RUNNING    pid 26200, uptime 0:00:11

プロセスが起動したら、ブラウザからアクセスします。無事に「Hello World!!」と表示されればOKです。

 ● RaspberryPiのブラウザからアクセスする場合「http://127.0.0.1:3000/」
 ● リモートでアクセス「http://RaspberryPiのIPアドレス:3000/」


※ ちなみに、今回はSupervisorを使いましたが、node.jsのデーモン化は、「forever」や「pm2」を使うのが一般的なようですのでこちらも試してみてください。


タグ:Raspberry Pi


posted by Raspberry Pi at 09:39 | Raspberry Pi | このブログの読者になる | 更新情報をチェックする