Ads 468x60px

Pages

2011年12月16日 星期五

node.js & npm 安裝注意事項 (用 forever 執行 node.js)


node.js 及 npm 的安裝都需要編譯的環境,也跟使用者的環境變數有很大的關係;以下分別逐一說明編譯、安裝、執行的注意事項,主要分成二大步驟

1. 在 server1 上編譯及安裝
2. Deploy 到 server2 上,安裝及執行

準備編譯環境
Before install nodeJS, please ensure your environment prepared these tools, below:
python - version 2.6 or higher.
GCC - c++ complier
Git

python update
yum install python26;
mv /usr/local/bin/python /usr/local/bin/python.bak;
ln -s /usr/bin/python2.6 /usr/local/bin/python;
編譯 node.js (v0.4.12 為例),並安裝到 ~/node.out
kevin@server1 {~}$ git clone --depth 1 git://github.com/joyent/node.git node
kevin@server1 {~}$ mkdir node.js
kevin@server1 {~}$ cd node
kevin@server1 {~/node}$ git checkout v0.4.12
kevin@server1 {~/node}$ ./configure --prefix=~/node.out
kevin@server1 {~/node}$ make -j2 # -j sets the number of jobs to run
kevin@server1 {~/node}$ make install
執行完成後,在你的 ~/node.out 會有以下目錄
kevin@server1 { ~/node.out  }$ ls
bin  include  lib  share
nodeJS installation is finished, we can input some test code for making sure nodeJS is ready.
kevin@server1 { ~/node.out/bin  }$ ./node --version
#result : v 0.4.12
編譯及安裝 NPM 到 ~/npm.out
Before install npm, please ensure your environment variable(path) is ready.
kevin@server1 { ~ }$ export PATH=$PATH:/usr/local/bin
kevin@server1 { ~ }$ env | grep PATH
PATH=/bin:/usr/bin:/usr/local/bin
Now npm package wrote a shell script for quick install, we download this and
kevin@server1 { ~ }$ mkdir npm.out
kevin@server1 { ~ }$ export npm_config_prefix=~/npm.out
kevin@server1 { ~ }$ curl http://npmjs.org/install.sh | sh
注意:如果沒有 "export npm_config_prefix=~/npm.out", 預設會安裝到 /usr/local 下,這樣會有檔案權限的問題,所以我們需要設定這個環境變數

After shell script executed, run npm test
kevin@server1 { ~ }$ cd npm.out/bin
kevin@server1 { ~/npm.out/bin }$ ./npm --version
#result: 1.0.105
安裝 npm modules,這個步驟跟你所在的目錄有很大的關係,預設會裝在目前目錄下的 npm_modules ,這不是我們要的,所以請照以下步驟
kevin@server1 { ~ }$ cd npm.out/lib
kevin@server1 { ~/npm.out/lib }$ npm install forever -d # 目前預設會裝 0.7.5,會遇到問題
...
npm info addNamed [ 'timespan', '2.0.x' ]
npm info addNamed [ 'watch', '0.4.x' ]
npm info addNamed [ 'utile', '0.0.x' ]
npm info addNamed [ 'winston', '0.5.x' ]
npm ERR! error installing forever@0.7.5 Error: ETIMEDOUT, Connection timed out
npm ERR! error installing forever@0.7.5     at Socket._onConnect (net.js:576:18)
npm ERR! error installing forever@0.7.5     at IOWatcher.onWritable [as callback] (net.js:165:12)
npm info unbuild /home/kevin_luo/npm/lib/node_modules/forever
npm info preuninstall forever@0.7.5
npm info uninstall forever@0.7.5
npm info postuninstall forever@0.7.5
npm ERR! Error: ETIMEDOUT, Connection timed out
npm ERR!     at Socket._onConnect (net.js:576:18)
npm ERR!     at IOWatcher.onWritable [as callback] (net.js:165:12)
...
我的解決的方法是先裝 0.6.5 ,再裝 0.7.5
kevin@server1 { ~/npm.out/lib }$ npm install forever@0.6.5 -d
kevin@server1 { ~/npm.out/lib }$ npm install forever -d # (0.7.5)
這樣裝完之後, forever  的 bin 檔沒有正確的建立,請執行以下步驟
kevin@server1 { ~/npm.out/lib }$ cd ../bin
kevin@server1 { ~/npm.out/bin }$ ln -sf ../lib/npm_modules/forever/bin/forever ./
kevin@server1 { ~/npm.out/bin }$ ln -sf ../lib/npm_modules/forever/bin/foreverd ./
安裝 socket.io,需要升級你的 tar 版本(這是什麼怪規定呢!!)
kevin@server1 {~}$ rpm -e --no-deps tar
kevin@server1 {~}$ wget ftp://ftp.gnu.org/gnu/tar/tar-1.26.tar.gz
kevin@server1 {~}$ tar zxvf tar-1.26.tar.gz
kevin@server1 {~}$ cd tar-1.26
kevin@server1 {~/tar-1.26}$ export FORCE_UNSAFE_CONFIGURE=1
kevin@server1 {~/tar-1.26}$ ./configure
kevin@server1 {~/tar-1.26}$ make
kevin@server1 {~/tar-1.26}$ make install
kevin@server1 {~/}$ cd npm.out/lib
kevin@server1 {~/npm.out/lib}$ npm install  socket.io@0.8.5 -d

└─┬ socket.io@0.8.5
  ├── policyfile@0.0.4
  ├── redis@0.6.6
  └─┬ socket.io-client@0.8.5
    ├── uglify-js@1.0.6
    ├── websocket-client@1.0.0
    └── xmlhttprequest@1.2.2
安裝 npm mysql, daemon modules
kevin@server1 {~/npm.out/lib}$ npm install mysql
kevin@server1 {~/npm.out/lib}$ npm install daemon
以上動作皆發生在 server1 上,接下到要 deploy server2 上,並執行
kevin@server1 {~} $ tar cvfz node.out.tgz node.out
kevin@server1 {~} $ tar cvfx npm.out.tgz npm.out
kevin@server1 {~} $ scp node.out.tgz server2:
kevin@server1 {~} $ scp npm.out.tgz server2:
接著來到 server2,並將 node 及 npm 安裝到 /usr/local
kevin@server2 {~} $ tar xvfz node.out.tgz
kevin@server1 {~} $ tar xvfz npm.out.tgz
kevin@server1 {~} $ cd node.out
kevin@server1 {~/node.out } $ sudo cp -r * /usr/local
kevin@server1 {~/node.out } $ cd ~npm.out
kevin@server1 {~/npm.out } $ sudo cp -r * /usr/local
這樣整個安裝算是完成了,接著執行 node.js (假設 node.js 放在 /var/www/node/node.js),我們會使用 apache 這個 user 來執行 node.js 以確保安全。
kevin@server1 {~} $ sudo -u apache -H PATH=/usr/local/bin NODE_PATH=/usr/local/bin/node:/usr/local/lib/node_modules forever start /var/www/node/node.js

info:   Forever processes running
data:       uid  command script                                      forever pid   logfile                    uptime       
data:   [0] 1YH_ node    /home/m/share/htdocs/miiicasa/comet/node.js 21088   26038 /var/www/.forever/1YH_.log 0:0:38:6.956 
kevin@server1 {~} $ sudo -u apache -H PATH=/usr/local/bin NODE_PATH=/usr/local/bin/node:/usr/local/lib/node_modules forever list

info:   Forever processes running
data:       uid  command script                                      forever pid   logfile                    uptime       
data:   [0] 1YH_ node    /home/m/share/htdocs/miiicasa/comet/node.js 21088   26038 /var/www/.forever/1YH_.log 0:0:38:6.956 
這邊最主要的問題,就是 forever 執行者(apache)的環境問題,通常我們用自己的 id (kevin) 在執行時,都會預先設定 PATH, NODE_PATH 的環境變數在我們的 .profile or .bashrc 上,不過用 sudo 執行時,這些變數,有時候沒有設定,有時候是錯的,所以我們在 sudo 的參數上做一些設定,說明如下:
  • -H : 使用 sudo 後 user 的 home directory, eg: apache 的使用者 HOME=/var/www, 而 forever 執行時,會根據 HOME 的值,在底下建立 $HOME/.forever 的目錄,來存放執行時期的設定
  • PATH=/usr/local/bin : 指定執行檔的搜尋路徑,主要是 forever, 及 env
  • NODE_PATH=/usr/local/bin/node:/usr/local/lib/node_modules : 指定 forever 要到那裡找 npm 的 modules ,由於我們只把 npm_modules 安裝到 /usr/local/lib 下,所以需要這個設定
這樣就大功告成了。

按"X"......搞了很多次,才終於瞭解

0 意見:

張貼留言