今更聞けないラズパイでnode.js

ラズパイ熱が冷めないうちに、どんどんやってしまおう。
前回、FM音源とかradikoとかで捗ったラズパイ2を、web経由でもうちょっといろいろ触れるようにしてみよう、ということで今更ですがnode.jsです。

node.jsというのは何かをきっかけにサーバサイドでjavascriptを実行できるようにしたもの。httpなんかと連携してスクリプトを実行できるいろいろな実装があるけど、それのjavascript版です。raspberry piで構築する上で参考になったのはRaspberry PiとNode.jsで作る独立稼働モバイルサーバとか、Raspberry Piにnodejsをインストールとか、ググればいろいろ出てきますが、世代がちょっと違うだけでなんか手順が微妙に違いますね。なので、いろんなタイミングでの情報があるのはいいことです。ということでこちらの記事は2015/07/12時点での情報です。

nodebrewを入れてnode.jsの管理をしつつ、expressをwebフレームワークに構えてサクサクやっちゃおうというのが往年のスタイルみたいなので、なぞりつつやってみます。

nodebrewを入れるのは以下のコマンド。こちらはサクッといきました。

$ curl -L git.io/nodebrew | perl - setup

そして.bashrcにパスを追加しておき、再ログインするとか、sourceで読み込み直しておくとかします。

export PATH=$HOME/.nodebrew/current/bin:$PATH

nodebrewが使えるようになったら、とりあえず使えるnode.jsのバージョンを見てみよう。上記の記事で書かれてたバージョンよりは明らかに新しいものがたくさん出てきました…

$ nodebrew ls-remote

v0.12.7が最新そうだったのでinstall-binaryで入れてみるが怒られたため、installでいれます。セルフビルドしながらなので結構時間がかかります。

$ nodebrew install-binary v0.12.7
Error: Linux armv7l is not supported. at /home/pi/.nodebrew/current/bin/nodebrew line 696.
$ nodebrew install v0.12.7

いやはや長かった… 1時間以上はかかったんでなかろうか。次はwebフレームワーク。npmというのがnode.jsのパッケージ管理ツールみたいですね。それを使ってインストールします。-gを付けて入れるのがいいらしいけど、よくわからんのでなぞってやってみます。最近のはexpress-generatorもいれないといけないみたい。

$ npm install -g express
$ npm install -g express-generator

インストールできたらサンプルアプリを動かしてみよう。以下の流れでwebアプリを配置してサーバ実行できるみたい。railsとかgrailsの感じかねぇ。

$ cd work
$ express -e sample
$ cd sample
$ npm install
$ DEBUG=sample ./bin/www

これで、ローカルからは:3000にアクセスすればページがみれるようになる。それぞれのコマンド実行の細かい意味は良くわかってないけど、動いた。ま、中身は時間をかけて作り込んでみないと良くわからないので、側だけはどんどん整えてしまおう。いったんctrl+cで止めて、外からアクセスできるように設定してみよう。俺はVPSでwebサーバを立てている(ココとか)ので、そいつを中継してラズパイまで行けるようにしてみたい。まずは、外向けのサーバを動かしているところに、ラズパイからポートフォワードしておく。ここでは外向けサーバの8080番にアクセスすればラズパイの3000番に飛ばされるようにする設定。

$ ssh -R 8080:[ラズパイのローカルIP]:3000 [外向けサーバ]

ラズパイでは、先ほどのようにexpressでサーバを起動しておいて、外向けサーバの8080番にスマホなどからアクセスすればそのまま行けそうな気がするんだけど、ファイアウォールとか設定しても外向けサーバの更に外からは行けない。外向けサーバ自信からは8080にアクセスすれば行けるので、何かそういうことなのだろう。ポートフォワードしたポートに直接外からアクセスする時の注意点を誰か教えてほしい。

とりあえずポート番号も隠蔽できるし、apache2のプロキシで行ってみよう。proxy、proxy_http、proxy_connectのあたりを有効にせねばならないので、その辺が無かったらいれる。うちのはmod-proxy-htmlが無さそうだったので入れてみた。

$ sudo apt-get install libapache2-mod-proxy-html

以下、外向けサーバでの設定。/etc/apache2/mod-available/proxy.conf のコメントアウトされているところを有効にする。

<Proxy *>
        AddDefaultCharset off
        Order deny,allow
        Deny from all
        #Allow from .example.com
</Proxy>

それから、/etc/apache2/site-available/default の 内に追加。/home_serverにアクセスしたらラズパイに飛ばす。このあたりは環境によって違うだろうし随時変える必要はある。

    ProxyPass /home_server http://localhost:8023/
    <Location /home_server>
        ProxyPassReverse http://localhost:8080/
        ProxyPassReverseCookieDomain localhost www.loopsketch.com
        ProxyPassReverseCookiePath / /
        Order allow,deny
        Allow from all
    </Location>

最後にモジュールの有効化と、apache2の再起動を行うと、[外向けサーバ]/home_serverでexpressのサンプルが表示されるようになる。

$ sudo a2enmod proxy
$ sudo a2enmod proxy_http
$ sudo a2enmod proxy_connect

$ sudo /etc/init.d/apache2 restart

これで、web経由で家の外からでもラズパイに何かやらせるという世界リモコン的使い方ができる。

コメント

タイトルとURLをコピーしました