<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[てくにかるむ]]></title><description><![CDATA[「エラーをなくすことは非常に有益で時には新しい真実や事実を作り上げるよりも勝る」
ー チャールズ・ダーウィン]]></description><link>http://multix.jp/</link><generator>Ghost 0.6</generator><lastBuildDate>Tue, 12 May 2026 21:54:50 GMT</lastBuildDate><atom:link href="http://multix.jp/tag/node-js/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[Node.jsのサービス実行]]></title><description><![CDATA[<p>このブログはNode.jsでGhost BlogをCentOSやWindows上で動かしているが、開発環境はともかく本番用やステージング用はサーバ起動時に一緒にデーモン起動していて欲しい。ところがコレには色々と考えるべきところがあるのだ。</p>

<ul class="index"></ul>

<hr>

<h4 id="">デーモンプロセス化を助けるツール</h4>

<p>Node.jsのデーモン化実装にはいくつかあるが、以下が代表的なものだろう。</p>

<ul>
<li>supervisor</li>
<li>forever</li>
<li>pm2 </li>
</ul>

<p>いずれも<code>npm install -g</code>で導入できる。おまけにLinuxでもWindowsでもそれなりに動く。それぞれに特徴がありセールスポイントがあり使い勝手も異なるが、一番リッチなのがpm2で、一番シンプルなのがforeverだろうか。</p>

<p>だがこれらはどういうワケか<strong>suid/sugidをサポートしてない</strong>のである。いやNode.js自体にはPOSIX準拠の<code>process.setuid</code>と<code>process.setgid</code>が一応実装されているのだがそれをこれらで使っているのを見たことがない<sup id="fnref:1"><a href="http://multix.jp/daemon-nodejs/#fn:1" rel="footnote">1</a></sup>。なので上記のこれらを普通にroot権限で起動するとそのままroot権限プロセスで動き続けることになり、実行権限を落として運用したい場合は別の工夫が必要になる。</p>

<hr>

<h4 id="">手っ取り早くデーモンにしてしまう</h4>

<p>WindowsにはWindowsの事情があるから置いておくとして、まずCentOS6ではどうするか。6のinitプロセスにはupstartとsysvinitの2種類<sup id="fnref:2"><a href="http://multix.jp/daemon-nodejs/#fn:2" rel="footnote">2</a></sup>が使われており、特段の事情がなければ使い慣れた後者に従うのが普通だろう。とりあえずroot権限でGhost（に限らずNode.jsで実装した各種サービス）を手っ取り早く動かしてしまうには以下のようにする。なおここではforeverを使用する。また一連の作業はすべてrootユーザで行う。</p>

<p>まずyumでredhat-lsb-coreを導入する。</p>]]></description><link>http://multix.jp/daemon-nodejs/</link><guid isPermaLink="false">2207ab43-c467-411c-b83f-c73635252b8f</guid><category><![CDATA[Linux]]></category><category><![CDATA[Node.js]]></category><category><![CDATA[Ghost Blog]]></category><dc:creator><![CDATA[朝日薫]]></dc:creator><pubDate>Thu, 07 May 2015 08:17:54 GMT</pubDate><content:encoded><![CDATA[<p>このブログはNode.jsでGhost BlogをCentOSやWindows上で動かしているが、開発環境はともかく本番用やステージング用はサーバ起動時に一緒にデーモン起動していて欲しい。ところがコレには色々と考えるべきところがあるのだ。</p>

<ul class="index"></ul>

<hr>

<h4 id="">デーモンプロセス化を助けるツール</h4>

<p>Node.jsのデーモン化実装にはいくつかあるが、以下が代表的なものだろう。</p>

<ul>
<li>supervisor</li>
<li>forever</li>
<li>pm2 </li>
</ul>

<p>いずれも<code>npm install -g</code>で導入できる。おまけにLinuxでもWindowsでもそれなりに動く。それぞれに特徴がありセールスポイントがあり使い勝手も異なるが、一番リッチなのがpm2で、一番シンプルなのがforeverだろうか。</p>

<p>だがこれらはどういうワケか<strong>suid/sugidをサポートしてない</strong>のである。いやNode.js自体にはPOSIX準拠の<code>process.setuid</code>と<code>process.setgid</code>が一応実装されているのだがそれをこれらで使っているのを見たことがない<sup id="fnref:1"><a href="http://multix.jp/daemon-nodejs/#fn:1" rel="footnote">1</a></sup>。なので上記のこれらを普通にroot権限で起動するとそのままroot権限プロセスで動き続けることになり、実行権限を落として運用したい場合は別の工夫が必要になる。</p>

<hr>

<h4 id="">手っ取り早くデーモンにしてしまう</h4>

<p>WindowsにはWindowsの事情があるから置いておくとして、まずCentOS6ではどうするか。6のinitプロセスにはupstartとsysvinitの2種類<sup id="fnref:2"><a href="http://multix.jp/daemon-nodejs/#fn:2" rel="footnote">2</a></sup>が使われており、特段の事情がなければ使い慣れた後者に従うのが普通だろう。とりあえずroot権限でGhost（に限らずNode.jsで実装した各種サービス）を手っ取り早く動かしてしまうには以下のようにする。なおここではforeverを使用する。また一連の作業はすべてrootユーザで行う。</p>

<p>まずyumでredhat-lsb-coreを導入する。そしてforeverとinitd-foreverをnpmで導入する。</p>

<pre><code class="language-brush:plain">$ sudo -s
# yum install redhat-lsb-core
# npm install forever -g
# npm install initd-forever -g

# initd-forever --help

  Usage: initd-forever [options]

  Options:

    -h, --help             output usage information
    -V, --version          output the version number
    -a, --app [path]       Path to node.js main file
    -c, --command [value]  Command to execute on main file
    -e, --env [value]      Export NODE_ENV with value
    -l, --logfile [path]   Logs the daemon output to LOGFILE
    -n, --name [value]     Application name
    -p, --pidfile [path]   The pid file
    -m, --monit [value]    Generate the monit script file with the listen port number
    -f, --forever [value]  The location of forever
</code></pre>

<p>次いでGhostディレクトリに移動してinitd-foreverでinitdスクリプトを生成する。最低限出力ファイル名＝サービス名を決定する<strong>-n</strong>指定は必要だ。</p>

<pre><code class="language-brush:plain"># cd ~user/ghost
# initd-forever -n ghost 
Script daemon file saved to ghost  
</code></pre>

<p>出来上がったファイルに実行権限を付与して<code>/etc/init.d</code>へ移動し、chkconfigで使用可能にしてserviceで起動する。</p>

<pre><code class="language-brush:plain"># chmod +x ghost
# mv ghost /etc/init.d
# chkconfig ghost --add
# chkconfig ghost on
# chkconfig ghost --list
ghost              0:off   1:off   2:on    3:on    4:on    5:on    6:off  
# service ghost start
</code></pre>

<p>initd-foreverが生成したファイルは次のようなものだ。通常の用途ではまず修正するところはないだろう。</p>

<pre><code class="language-brush:bash gutter:true title:/etc/init.d/ghost">#!/bin/bash
### BEGIN INIT INFO
# Provides:          /home/user/ghost/core/index
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: forever running /home/user/ghost/core/index
# Description:       /home/user/ghost/core/index
### END INIT INFO
#
# initd a node app
# Based on a script posted by https://gist.github.com/jinze at https://gist.github.com/3748766
#

# Source function library.
. /lib/lsb/init-functions

pidFile="/var/run/ghost.pid"  
logFile="/var/run/ghost.log"

command="node"  
nodeApp="/home/user/ghost/core/index"  
foreverApp="forever"

start() {  
    echo "Starting $nodeApp"

    # Notice that we change the PATH because on reboot
    # the PATH does not include the path to node.
    # Launching forever with a full path
    # does not work unless we set the PATH.
    PATH=/usr/local/bin:$PATH
    export NODE_ENV=production
    #PORT=80
    $foreverApp start --pidFile $pidFile -l $logFile -a -d -c "$command" $nodeApp
    RETVAL=$?
}

restart() {  
    echo -n "Restarting $nodeApp"
    $foreverApp restart $nodeApp
    RETVAL=$?
}

stop() {  
    echo -n "Shutting down $nodeApp"
    $foreverApp stop $nodeApp
    RETVAL=$?
}

status() {  
    echo -n "Status $nodeApp"
    $foreverApp list
    RETVAL=$?
}

case "$1" in  
    start)
        start
        ;;
    stop)
        stop
        ;;
    status)
        status
        ;;
    restart)
        restart
        ;;
    *)
        echo "Usage: $0 {start|stop|status|restart}"
        exit 1
        ;;
esac  
</code></pre>

<hr>

<h4 id="">もう少し本格的に制御してみる</h4>

<p>実行するNode.jsサービスがひとつやふたつでしかもrootオンリーなら上記の作業を必要なだけ繰り返せば良い。だがGhost Blogの場合これはあまりよろしくない。というのも；</p>

<ul>
<li>Ghost は記事に対して Draft と Publish の2モードを持つが Staging モードは持っていない。つまり投稿記事を一般公開前にレンダリングチェックすることができない。このために結局本番用とステージング用とでは個別のサービスインスタンスを立ち上げて使い分けたいという需要がある。</li>
<li>Ghost はマルチユーザ（グループ）対応だが、ユーザ別にテーマを変更できるわけではなく全体でひとつのテーマに固定される。故にテーマやプラグインを開発するユースケースでもユーザ別インスタンスの需要がある。またこの作業は頻繁にインスタンスを再起動する必要が有るため、start/stopを行うのにいちいちrootへsuするのは現実的ではない。</li>
<li>Ghost は自身のローカルディレクトリ内にアップロードされた画像ファイルと、記事DBファイルを格納<sup id="fnref:3"><a href="http://multix.jp/daemon-nodejs/#fn:3" rel="footnote">3</a></sup>している。当然それらのファイル権限がそのままでは実効rootになってしまうから、非rootの開発ユーザがファイルメンテナンスをするうえで都合が悪い。</li>
</ul>

<p>これらの諸々を助けるためにforeverdというinitdファイルを作成した。これは /etc/forver.d ディレクトリに配置した設定ファイルの数だけNode.jsのインスタンスを起動する。</p>

<pre><code class="language-brush:bash gutter:true title:/etc/forever.d/ghost-stg.conf">NODE_DIR=/home/user/ghost  
NODE_ENV=staging  
NODE_APP=index.js  
NODE_USER=user  
OPTS="--silent"  
</code></pre>

<pre><code class="language-brush:bash gutter:true title:/etc/forever.d/ghost-prd.conf">NODE_DIR=/home/user/ghost  
NODE_ENV=production  
NODE_APP=index.js  
NODE_USER=user  
OPTS="--silent"  
</code></pre>

<pre><code class="language-brush:bash gutter:true title:/etc/init.d/foreverd">#!/bin/sh
#
# chkconfig: 2345 88 14
# description: Description of the Service
#
# Below is the source function library, leave it be
. /etc/init.d/functions
 
# result of whereis node_modules
export NODE_PATH=/usr/lib/node_modules  
 
PATH=/sbin:/bin:/usr/sbin:/usr/bin  
 
fordeamon(){  
    for conf in /etc/forever.d/*.conf; do
        name=$(basename $conf .conf)
        if [ -n "$2" ]; then
            if [ "$name" != "$2" ]; then
                continue
            fi
        fi
        source $conf
        : ${NODE_USER:=root}
        : ${NODE_APP:=index.js}
        : ${NODE_DIR:=~}
        if [ $(whoami) != $NODE_USER ]; then
            su -c "$0 $1 $name" $NODE_USER
        else
            echo $"Process id is $name"
            case "$1" in  
                start)
                    NODE_ENV=$NODE_ENV \
                        forever $OPTS \
                        --sourceDir="$NODE_DIR" \
                        --workingDir="$NODE_DIR" \
                        --minUptime=1000 \
                        --spinSleepTime=1000 \
                        --uid=$name \
                        -a \
                        start $NODE_APP
                    ;;
                stop)
                    NODE_ENV=$NODE_ENV \
                        forever stop $name
                    ;;
                restart)
                    NODE_ENV=$NODE_ENV \
                        forever restart $name
                    ;;
                list)
                    NODE_ENV=$NODE_ENV \
                        forever list | grep /$name.log
                    ;;
            esac
        fi
    done
}
 
case "$1" in  
    start)
        echo "Start service forever"
        fordeamon start $2
        ;;
    stop)
        echo "Stop service forever"
        fordeamon stop $2
        ;;
    restart)
        echo "Restart service forever"
        fordeamon restart $2
        ;;
    status)
        fordeamon list $2
        ;;
    list)
        fordeamon list $2
        ;;
    *)
        echo "Usage: $0 {start|stop|restart|status|list} [name]"
        exit 1
        ;;
esac  
</code></pre>

<p>これを実行権限を付与してchkconfigでサービス登録すると、サーバ起動時に /etc/forver.d/*.conf に従ってforeverインスタンスを起動するが、その後は一般ユーザ側で普通に（serviceコマンドを通さずに）foreverコマンドでlist/stop/restart<sup id="fnref:4"><a href="http://multix.jp/daemon-nodejs/#fn:4" rel="footnote">4</a></sup>することができるようになる。またroot側からも<code>service foreverd COMMAND NAME</code>でインスタンス個別にユーザ権限でプロセス操作ができる。</p>

<pre><code class="language-brush:plain title:root側の例"># service foreverd start
# service foreverd restart NAME
# service foreverd stop NAME
</code></pre>

<pre><code class="language-brush:plain title:一般ユーザ側の例">$ forever list
$ forever restart NAME
$ forever stop NAME
$ /etc/init.d/foreverd start NAME
$ forever restartall
</code></pre>

<p>Switch Userは27行目のsuコマンドが行っているが、これは自分自身（/etc/init.d/foreverd）をsuidして再帰的に呼び出すようにした。正攻法ならsudoコマンドでforeverを呼びたくなるところだが、エスケープを含むコマンドラインの組み立てが煩雑になるのを避けたいのと、CnetOS6の/etc/sudoersのデフォルト設定では非TTYでのsudo実行を禁止しており、そのままでは rcプロセス（当然非TTY）で動作しない<sup id="fnref:5"><a href="http://multix.jp/daemon-nodejs/#fn:5" rel="footnote">5</a></sup>という事情による。</p>

<p>なお当然だが well-known port を掴むようなインスタンスはrootユーザで起動しなければ意味が無い。また個々のインスタンスが掴むポート番号を重複しないように調整するのもroot管理者の仕事である。</p>

<hr>

<div class="footnotes"><ol><li class="footnote" id="fn:1"><p>比較的新しい機能なので古いNode.jsに配慮するとまだ機能統合できないということか。ゆえにデーモンプロセスツールではなく個々のアプリケーションの中でやってくれという主張らしい。 <a href="http://multix.jp/daemon-nodejs/#fnref:1" title="return to article">↩</a></p></li>

<li class="footnote" id="fn:2"><p>CentOS7になるとsysvinitが非推奨となってsystemctlが標準となる。6/7両方で修正なく動くようにしたいならupstartで実装するのも手だ。 <a href="http://multix.jp/daemon-nodejs/#fnref:2" title="return to article">↩</a></p></li>

<li class="footnote" id="fn:3"><p>DBについてはPostgresql等外部へ逃すことはできるがアップロード画像ファイルはDBに入らないためどうにもならない。ゆえにsupervisorやpm2のファイル更新監視モードは無限再起動に陥るため使うことができず、かえってそれらを使うメリットがない。本項でforeverを主に扱っているのはこういう事情による。 <a href="http://multix.jp/daemon-nodejs/#fnref:3" title="return to article">↩</a></p></li>

<li class="footnote" id="fn:4"><p>ユーザ側でのstartは、root実行時と同じ起動パラメータを指定するようにしないと当然同じ動作にならない。故にサービス起動時はサンプルの4行目のように /etc/init.d/foreverdを直接実行する。 <a href="http://multix.jp/daemon-nodejs/#fnref:4" title="return to article">↩</a></p></li>

<li class="footnote" id="fn:5"><p>visudoで <em>Defaults requiretty</em> を <em>Defaults:system_user !requiretty</em> に修正すれば非TTYプロセス中でもsudoできるようになる。だが今回の場合はrootが非rootプロセスを起動したいのであり、非rootにはrootプロセスを起動させたくないのだから suのほうが理にかなう。 <a href="http://multix.jp/daemon-nodejs/#fnref:5" title="return to article">↩</a></p></li></ol></div>]]></content:encoded></item><item><title><![CDATA[Node.js環境を作る]]></title><description><![CDATA[<p>プラットフォーム別のNode.js環境構築メモ</p>

<ul class="index"></ul>

<hr>

<h4 id="centos6linux">CentOS6/Linux</h4>

<p>CentOSの場合、nodejsとnpmの各パッケージはEPELレポジトリに収録されている。EPELを使用可能にするには<a href="https://ghost.multix.jp/centos-addon-repos/">こちら</a>を参照のこと。これが済んでいればyumだけで基本環境のインストールが出来る。</p>

<pre><code class="language-brush:plain">sudo yum install nodejs npm  
</code></pre>

<p>ただしこれでOSにインストールされるのはやや古いバージョンである。</p>

<pre><code class="language-brush:plain">$ node -v
v0.10.33  
$ npm -v
1.3.6  
</code></pre>

<p>異なるバージョンのNode.jsが必要な場合はnvmを使用して切り替える。まずnvmコマンドをgitでダウンロードし、添付のスクリプトを実行して導入する。<sup id="fnref:1"><a href="http://multix.jp/install-nodejs/#fn:1" rel="footnote">1</a></sup></p>

<pre><code class="language-brush:plain">$ git clone https://github.com/creationix/nvm.git ~/.nvm
Initialized empty Git repository in ~/.nvm/.git/  
remote: Counting objects:</code></pre>]]></description><link>http://multix.jp/install-nodejs/</link><guid isPermaLink="false">f570ed62-aba5-4a83-81be-788b686230cb</guid><category><![CDATA[Windows]]></category><category><![CDATA[Machintosh]]></category><category><![CDATA[Linux]]></category><category><![CDATA[めもらんだむ]]></category><category><![CDATA[Node.js]]></category><dc:creator><![CDATA[朝日薫]]></dc:creator><pubDate>Thu, 07 May 2015 08:14:34 GMT</pubDate><content:encoded><![CDATA[<p>プラットフォーム別のNode.js環境構築メモ</p>

<ul class="index"></ul>

<hr>

<h4 id="centos6linux">CentOS6/Linux</h4>

<p>CentOSの場合、nodejsとnpmの各パッケージはEPELレポジトリに収録されている。EPELを使用可能にするには<a href="https://ghost.multix.jp/centos-addon-repos/">こちら</a>を参照のこと。これが済んでいればyumだけで基本環境のインストールが出来る。</p>

<pre><code class="language-brush:plain">sudo yum install nodejs npm  
</code></pre>

<p>ただしこれでOSにインストールされるのはやや古いバージョンである。</p>

<pre><code class="language-brush:plain">$ node -v
v0.10.33  
$ npm -v
1.3.6  
</code></pre>

<p>異なるバージョンのNode.jsが必要な場合はnvmを使用して切り替える。まずnvmコマンドをgitでダウンロードし、添付のスクリプトを実行して導入する。<sup id="fnref:1"><a href="http://multix.jp/install-nodejs/#fn:1" rel="footnote">1</a></sup></p>

<pre><code class="language-brush:plain">$ git clone https://github.com/creationix/nvm.git ~/.nvm
Initialized empty Git repository in ~/.nvm/.git/  
remote: Counting objects: 3595, done.  
remote: Compressing objects: 100% (20/20), done.  
remote: Total 3595 (delta 7), reused 0 (delta 0), pack-reused 3574  
Receiving objects: 100% (3595/3595), 765.49 KiB | 304 KiB/s, done.  
Resolving deltas: 100% (2060/2060), done.

$ source ~/.nvm/nvm.sh
</code></pre>

<p>nvmコマンドはエイリアスとしてシェル環境変数に組み込まれるため、新たな端末を開く度にnvm.shを再実行する必要がある。毎回使用するなら<code>~/.bashrc</code>等に追記しておくと良い。</p>

<p>初期状態ではsystemインストールされたNode.jsが使われているので<code>nvm current</code>を実行すると<em>system</em>が返る。</p>

<pre><code class="language-brush:plain">$ nvm current
system

$ which node
/usr/bin/node
</code></pre>

<p>取り敢えず最新のNode.jsを使えるようにするには次のようにするだけで良い</p>

<pre><code class="language-brush:plain">$ nvm install 0
######################################################################## 100.0%
Now using node v0.12.2 (npm v2.7.4)

$ nvm current
v0.12.2

$ node -v
v0.12.2

$ which node
~/.nvm/versions/node/v0.12.2/bin/node
</code></pre>

<p>上記のようにnvmでインストールされるnodeコマンドは、ユーザ環境毎に独立している。環境切替はシェル環境変数に依るので、systemサービスレベルでNode.jsを使用する場合は注意しなければならない。</p>

<p>なおsystemおよびnvmで導入したnodeコマンドと各グローバルnode_modulesパスは次のようになる。これはつまり<code>npm install -g</code>で書き換えられる先がsudo不要になるということでもある。</p>

<pre><code class="language-table">|＼|system|nvm|
|-:|:-|:-|
|node|/usr/bin/node|~/.nvm/versions/node/[VER]/bin/node|
|npm|/usr/bin/npm|~/.nvm/versions/node/[VER]/bin/npm|
|modeules|/usr/lib/node_modules|~/.nvm/versions/node/[VER]/lib/node_modules|
</code></pre>

<hr>

<h4 id="macosx">Mac OSX</h4>

<p>Mac OSXの場合、<a href="http://nodejs.org/">公式サイト</a>からインストーラパッケージをダウンロードしてきて実行するのがもっとも手軽だろう。だがnpmコマンドで各モジュールをインストールする段階でネイティブビルド環境（Xcode）を要求されたりすると途端に面倒なことになり、最終的な手間は以下のどれをとっても結局は大差なくなる。</p>

<ol>
<li><a href="http://nodejs.org/">公式サイト</a>からインストーラを得て導入（/usr/local/bin/node）  </li>
<li><a href="http://nodejs.org/">公式サイト</a>またはGitHubからソースを得て./configure &amp;&amp; make  </li>
<li>Mac Ports環境で port install nodejs（/opt/local/bin/node）</li>
</ol>

<p>1番以外は結局Xcodeがなければ話にならない。なおXcode（それ自体はAppStoreから入手できる）のコマンドライン・デベロッパ・ツールの追加インストールは以下のコマンドをターミナルで実行する。<sup id="fnref:2"><a href="http://multix.jp/install-nodejs/#fn:2" rel="footnote">2</a></sup></p>

<pre><code class="language-brush:plain">$ xcode-select --install
</code></pre>

<p>nvmでのバージョン切替はLinuxと同じなので前項を参照のこと。</p>

<hr>

<h4 id="windows">Windows</h4>

<p>Windowsの場合はだいたい以下のシナリオがある。</p>

<ol>
<li><a href="http://nodejs.org/">公式サイト</a>からインストーラを得て導入  </li>
<li><a href="https://www.visualstudio.com/downloads/download-visual-studio-vs">Visual Studio</a>（Expressの場合はfor Web）に<a href="https://nodejstools.codeplex.com">NTVSアドオン</a>を追加する  </li>
<li>CygwinあるいはMinGW環境でGitHunソースからmakeする  </li>
<li><a href="https://github.com/marcelklehr/nodist">nodist</a>で導入する</li>
</ol>

<p>基本は1番だが、おすすめはWindowsらしい強力なIDEと一体化できる2番を更に追加した環境だ。開発PCでは1+2番、サービスサーバでは1番だけという使い分けが良いだろう。3番は余程の物好きでない限りおすすめしかねる。4番はもはやふるいやり方だがZIP配布なのでレジストリを汚すこともなくコンパクトな環境を作れるが環境変数設定等は全て手動なのでGUIインストーラを使えない場合の代替手段と見たほうが良い。<sup id="fnref:3"><a href="http://multix.jp/install-nodejs/#fn:3" rel="footnote">3</a></sup> <sup id="fnref:4"><a href="http://multix.jp/install-nodejs/#fn:4" rel="footnote">4</a></sup></p>

<p>nvmでのnodeバージョン管理は<a href="https://github.com/hakobera/nvmw">nvmw</a>と<a href="https://github.com/coreybutler/nvm-windows">nvm-windows</a>の2通りの実装がある。 <br>
前者はPython2.7+が更に必要なので、ActivePython等のインストールが要求される。後者ならスタンドアロンインストーラ配布なので手軽だ。</p>

<hr>

<div class="footnotes"><ol><li class="footnote" id="fn:1"><p>git自体はCentOSの場合は標準レポジトリに属しているので、もしなくても<strong>yum install git</strong>で導入できる。 <a href="http://multix.jp/install-nodejs/#fnref:1" title="return to article">↩</a></p></li>

<li class="footnote" id="fn:2"><p>実行するにはかつてはApple Developer Member登録が必須だったが、いまはそんなことはない？ <a href="http://multix.jp/install-nodejs/#fnref:2" title="return to article">↩</a></p></li>

<li class="footnote" id="fn:3"><p>自分の場合最初はnodistで環境構築したため、便宜上追記した。 <a href="http://multix.jp/install-nodejs/#fnref:3" title="return to article">↩</a></p></li>

<li class="footnote" id="fn:4"><p>その後マルチプラットフォーム対応の Visual Studio Codeが公開されたため、環境構築の選択肢は更に増えた。 <a href="http://multix.jp/install-nodejs/#fnref:4" title="return to article">↩</a></p></li></ol></div>]]></content:encoded></item></channel></rss>