もろず blog

もろちゃんがITに関しての様々なトピックを解説します

結局のところ node.js をサーバーにインストールするにはどうやればいいのか?


f:id:chanmoro999:20150727225349p:plain

以前、nvm を利用して node.js をセットアップする記事を書きました

moro-archive.hatenablog.com

ですが、nvm はあくまで開発用の環境をセットアップするためのものなのでサーバー上に node.js をインストールするのには向いてません


公式サイトには具体的なインストール方法は書かれておらず、ビルド済みバイナリが配布されています

Index of /download/

これをダウンロードしてきて /usr/bin とか /usr/sbin に配置すればそれでインストール完了なんですが、習慣的にどうやられているのかを知りたいですよね


できれば何らかのパッケージマネージャーを利用する方法がいいはずですが yum のリポジトリで提供されているバージョンはかなり古くその時点の最新版が配信されていないようでした
そこで Production を意識した環境を構築する際に、どうやればお手軽かついい感じに node.js をインストールできるかを調べました


この記事では
1. おそらく1番妥当な方法
2. n コマンドの使い方
3. nvm と n の違い
4. まとめ
について説明します


1. おそらく1番妥当な方法

ググってみると、node.js をサーバーにインストールするには以下の3パターンの方法がよく利用されている方法っぽいことが分かりました

  1. ソースからコンパルする
  2. ビルド済みバイナリをダウンロードしてきて任意のディレクトリに配置
  3. n コマンドを利用してインストール


ソースからコンパイル以外の方法であればやっていることは実質同じなのであまり差はないんですが、n コマンドを利用したインストールが一番簡単そうだったので恐らく現時点ではこれが1番妥当な方法です

この方法は Carbon Five という開発会社のブログ記事に書かれていました

blog.carbonfive.com


n コマンドを利用した node.js のインストール方法は以下です

yum install nodejs npm --enablerepo=epel
npm install -g n
n stable

n コマンドは nvm と似たような node.js のバージョン管理を行ってくれるコマンドです

GitHub - tj/n: Node version management

nvm はサーバーの構築に向いてないと言いましたが、n コマンドは方式が異なっているのでサーバーへのインストールでも問題なく利用できるんです
これについては後の方で説明します


ちなみに、最近個人的にハマりつつある ansible で n コマンドを利用した node.js のインストールを書くとこうなります
github.com


記事の先頭に戻る

2. n コマンドの使い方

n コマンドの利用方法をざっと説明します
node.js をインストールするために使うだけなのでバージョンの一覧表示とバージョンの切り替えが使えれば十分です

利用できるバージョンの一覧表示
$ n ls

    0.8.6
    0.8.7
〜 省略 〜
    0.12.6
 ο 0.12.7 

有効になっているバージョン番号の左にοが表示されます

最新安定版をインストール
$ n stable

install : node-v0.12.7
       mkdir : /usr/local/n/versions/node/0.12.7
       fetch : https://nodejs.org/dist/v0.12.7/node-v0.12.7-linux-x64.tar.gz
   installed : v0.12.7

公式サイトから対応するバージョンのバイナリをダウンロードしてきて配置されます

指定したバージョンへの切り替え
$ n 0.10.40

     install : node-v0.10.40
       mkdir : /usr/local/n/versions/node/0.10.40
       fetch : https://nodejs.org/dist/v0.10.40/node-v0.10.40-linux-x64.tar.gz
   installed : v0.10.40

既にバイナリがダウンロード済みであればバージョンの切り替えのみ実施されます



記事の先頭に戻る

3. nvm と n の違い

nvm の仕組み

nvm の仕組みを調べてみたところ、node コマンドの向き先が有効にしたい node.js のバージョンに向くように環境変数を書き換える仕組みになっていました
nvm のコマンドや、ダウンロードしてきた node.js のバイナリは全て実行したユーザーのホームディレクトリに置かれます

f:id:chanmoro999:20150727214658p:plain

node.js のインストールやバージョンの切り替えを行っても、影響があるのは実行ユーザーの領域のみなので そのサーバー内のグローバルな領域には影響がないということが特徴です
ですが、node.js へのパスは実行ユーザーの環境変数にがっつり依存してますし、デーモンとして動かすには使いづらそうな印象を受けます

$ which node
/Users/chanmoro/.nvm/versions/node/v0.12.2/bin/node

nvm install 実行すると node.js の公式サイトから該当バージョンのバイナリをダウンロードしてきて、PATH の内容が書き換えられます

$ echo $PATH
/Users/chanmoro/.nvm/versions/node/v0.12.2/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

$ nvm install 0.12
######################################################################## 100.0%
Now using node v0.12.7

$ echo $PATH
/Users/chanmoro/.nvm/versions/node/v0.12.7/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

$ which node
/Users/chanmoro/.nvm/versions/node/v0.12.7/bin/node

nvm use でバージョンを切り替えた場合でも install と同様に PATH の内容が書き換えられます


n コマンドの仕組み

n コマンドは nvm と同様に node.js の公式サイトからビルド済みのバイナリをダウンロードしてきます
そして、有効にするバージョンのバイナリを /usr/local/bin にコピーする仕組みになっています
なので、n コマンドの場合はそのサーバー内のグローバルな領域(/usr/local/binとか)にモジュールが配置されます

f:id:chanmoro999:20150727214725p:plain

手動でのインストール方法とほぼ同じことをやっており、ホームディレクトリ配下にバイナリを置くのでもなく、特定ユーザーのみに有効な環境変数を利用するわけでもないので、かなりいい感じですね

$ which node
/usr/local/bin/node

$ node --version
v0.12.7

$ n 0.10

     install : node-v0.10.40
       mkdir : /usr/local/n/versions/node/0.10.40
       fetch : https://nodejs.org/dist/v0.10.40/node-v0.10.40-linux-x64.tar.gz
   installed : v0.10.40

$ node --version
v0.10.40

$ which node
/usr/local/bin/node 


nvm はユーザーのみに影響のある領域だけで実現しているのに対し、n はサーバー内のグローバルな領域を使っているという点が大きくことなります
このことからも nvm はあくまで開発用のツールであることが分かると思います

なので、サーバーをセットアップするという点では nvm より n の方がより妥当ということにはなります
Production 環境に node.js のバージョン管理が必要かは別として

※バイナリ落としてきて置くだけなのに大げさじゃね、という感じはありますが・・・



記事の先頭に戻る

4. まとめ

先ほど紹介した Carbon Five のブログ記事では、node.js を利用する場合のサーバー構成や node.js アプリのデプロイ方法など、かなり実践的な内容が書かれているので参考になると思います

node.js はちょっと前にケンカしてフォークした io.js が生まれたりしてました
その後コアメンバーが一部抜けたりあったようですが、今は仲直りしたそうで今後 node.js に統合するとかでなかなか大変そうな状況っぽいです

javascript 特有の機構がいろいろとあるので node.js がガンとかの話もあるみたいですが、使いどころを間違えなければ僕としては WebAPI やライトなアプリケーションをつくるのに node.js はいい感じだと思っているので今後も頑張っていって欲しいと思ってます


今回はそんな node.js についての記事でした


記事の先頭に戻る