Wednesday, September 9, 2015

Install node.js on a cPanel based shared hosting account

See how to install node.js on a cPanel account alongside your JVM and appserver.
Node.js is event-driven, asynchronous I/O server-side JavaScript environment based on V8 engine.
For Centos 6 version scroll to the bottom.
On request you will be assigned a dedicted port or ports to use with node.js by your hosting provider.  If you already have a dedicated IP you will be able to request any port number not already bound for this IP to use with node.js sockets. On a shared server you are required to install node.js and dependencies in your home directory. The procedure will be similar in case of a VPS where you are not restricted to a home directory but running node.js as an uprivileged user is still highly recommended.
Step 1. Install python 2.6 or 2.7 in your home directory
On a shared server you may need to request compiler access enabled from support. node.js will require bz2 python module so make sure bzip2-devel (or similar for your distro) is available. Request it from support if missing. They will need to run yum install bzip2-devel as root. Another development libraries may be installed system-wide too (e.g. sqlite-devel) if required. Without bz2 module you will see “ImportError: No module named bz2” when installing node.js.
[~]# rpm -qa | grep bzip2-devel 
[~]# which python
/usr/bin/python
[~]# python -V
Python 2.4.3
[~]# wget http://www.python.org/ftp/python/2.6.7/Python-2.6.7.tgz
[~]# tar xzf Python-2.6.7.tgz 
[~]# cd Python-2.6.7
[~]# ./configure --prefix=$HOME --with-threads --enable-shared
[~]# make 
[~]# make install
At the end of ‘make’ you may see information about what development headers were missing and module build skipped for. For example:
Failed to find the necessary bits to build these modules:
_tkinter           bsddb185           dl
imageop            sunaudiodevTo find the necessary bits, look in setup.py in detect_modules() for the module's name.
Python is still served from /usr/bin so we need to modify $PATH in .bashrc by inserting
# User specific aliases and functions
export PATH=~/bin:$PATH
Run the below code to have new $PATH setting in effect and test python:
[~]# source .bashrc
[~]# which python
/home/nodetest/bin/python
[~]# python -V
python: error while loading shared libraries: libpython2.6.so.1.0: cannot open shared object file: No such file or directory
Python 2.6 cannot find the libs in home directory so let’s modify $LD_LIBRARY_PATH by adding another line into .bashrc and importing it into current environment:
# User specific aliases and functions
export PATH=~/bin:$PATH
export LD_LIBRARY_PATH=~/lib:$LD_LIBRARY_PATH

[~]# source ~/.bashrc
[~]# python -V
Python 2.6.7
Step 2. Install node.js in your home directory
[~]# wget http://nodejs.org/dist/v0.8.2/node-v0.8.2.tar.gz
[~]# tar xzf node-v0.8.2.tar.gz 
[~]# cd node-v0.8.2
[~]# ./configure --prefix=$HOME
[~]# make 
[~]# make install
Optionally, install setuptools to make python module management easier later.
[~]# wget 'http://pypi.python.org/packages/2.6/s/setuptools/setuptools-0.6c11-py2.6.egg#md5=bfa92100bd772d5a213eedd356d64086'
[~]# sh setuptools-0.6c11-py2.6.egg
Here is an example of a simple TCP server which listens on port 12345 (port number assigned by support and open in firewall, shared or dedicated IP) and echoes whatever you send it:
[~]# cat > socket_server.js<<EOF
var net = require('net');
var server = net.createServer(function (socket) {
    socket.write('Echo server\r\n');
    socket.pipe(socket);
 });
server.listen(12345, '10.10.10.10');
console.log('Server running at http://10.10.10.10:12345/');
EOF

[~]# node socket_server.js 
Server running at http://10.10.10.10:14243/
Then you may test it from another host:
anotherhost:~$ telnet 10.10.10.10 12345
Trying 10.10.10.10...
Connected to 10.10.10.10.
Escape character is '^]'.
Echo server
abcd
abcd
Connection closed by foreign host.
Static memory usage as reported by top for the socket_server.js and chat-server.js
VIRT RES  SHR  S %CPU %MEM TIME+   CODE SWAP DATA COMMAND
581m 8620 4868 S 0.0  0.0  0:00.04 8564 572m 555m node example.js
579m 12m  5984 S 0.0  0.0  0:00.04 8564 566m 551m node chat-server.js
NodeJS on Centos 6 tutorial
For Centos 6 based hosts the procedure is much simplier as Python 2.6.6+ is already available system-wide. We can also skip compilation and use binary nodejs instead:
wget http://nodejs.org/dist/v0.10.31/node-v0.10.31-linux-x64.tar.gz
tar xzf node-v0.10.31-linux-x64.tar.gz
mv node-v0.10.31-linux-x64 node
./node/bin/node socket_server.js
- See more at: http://www.jvmhost.com/articles/install-node-js-cpanel-shared-account#sthash.2imtejE2.dpuf