Run node.js on cpanel hosting server
Asked Answered
B

6

35

It is a simple node.js code.

var http = require('http');
http.createServer(function(req, res) {
    res.writeHead(200, { 'Content-Type' : 'text/plain'});
    res.end('Hello World!');
}).listen(8080);

I uploaded it on cpanel hosting server and installed node.js and run it. If a server is normal server I can check script result by accessing 'http://{serverip}:8080'. But on cpanel is hosting domain and sub domain and every domain is matched by every sites. Even http://{serverip} is not valid url. How can I access my node.js result? Kindly teach me. Thanks. bingbing.

Bronchiectasis answered 19/5, 2017 at 21:10 Comment(1)
What happens when you access server-ip:8080 in your browser?Chancroid
W
33

cPanel typically runs Apache or another web server that is shared among all the cPanel/unix accounts. The web server listens on port 80. Depending on the domain name in the requested URL, the web server uses "Virtual Hosting" to figure out which cPanel/unix account should process the request, i.e. in which home directory to find the files to serve and scripts to run. If the URL only contains an IP address, cPanel has to default to one of cPanel accounts.

Ordinarily, without root access, a job run by a cPanel account cannot listen on port 80. Indeed, the available ports might be quite restrictive. If 8080 doesn't work, you might try 60000. To access a running node.js server, you'll need to have the port number it's listening on. Since that is the only job listening on that port on that server, you should be able to point your browser to the domain name of any of the cPanel accounts or even the IP address of the server, adding the port number to the URL. But, it's typical to use the domain name for the cPanel account running the node.js job, e.g. http://cPanelDomainName.com:60000/ .

Of course port 80 is the default for web services, and relatively few users are familiar with optional port numbers in URLs. To make things easier for users, you can use Apache to "reverse proxy" requests on port 80 to the port that the node.js process is listening on. This can be done using Apache's RewriteRule directive in a configuration or .htaccess file. This reverse proxying of requests arguably has other benefits as well, e.g. Apache may be a more secure, reliable and manageable front-end for facing the public Internet.

Unfortunately, this setup for node.js is not endorsed by all web hosting companies. One hosting company that supports it, even on its inexpensive shared hosting offerings, is A2Hosting.com. They also have a clearly written description of the setup process in their Knowledge Base.

Finally, it's worth noting that the developers of cPanel are working on built-in node.js support. "If all of the stars align we might see this land as soon as version 68," i.e. perhaps early 2018.

References

Apache Virtual Hosting - http://httpd.apache.org/docs/2.4/vhosts/

Apache RewriteRule Directive - http://httpd.apache.org/docs/2.4/mod/mod_rewrite.html

A2Hosting.com Knowledge Base Article on Configuring Node.js - https://www.a2hosting.com/kb/installable-applications/manual-installations/installing-node-js-on-managed-hosting-accounts

cPanel Feature Request Thread for node.js Support - https://features.cpanel.net/topic/nodejs-hosting

Related StackOverflow Questions

How to host a Node.Js application in shared hosting

Why node.js can't run on shared hosting?

Winterkill answered 31/7, 2017 at 1:59 Comment(5)
Is there nodejs support for cpanel in 2019?Rhonarhonchus
Doesn't look like it, see features.cpanel.net/topic/nodejs-hosting as mentioned in the answer, it's ongoing.Brownson
Actually just noticed this on there "expected to start hitting production tiers in Q2 of 2019"Brownson
cPanel now supports node.jsMalayalam
Now we can install node.js apps on cPanel documentation.cpanel.net/display/80Docs/…Antacid
T
54

Install/Setup NodeJS with CPanel

1. Log in to your account using SSH (if it is not enabled for your account, contact the support team).

2. Download Node.js

wget https://nodejs.org/dist/latest/node-v10.0.0-linux-arm64.tar.xz

3. Extract the Node.js files

tar xvf node-v10.0.0-linux-arm64.tar.xz

4.Now rename the folder to "nodejs". To do this, type the following command

mv node-v10.0.0-linux nodejs

5. Now to install the node and npm binaries, type the following commands:

mkdir ~/bin <br> cp nodejs/bin/node ~/bin
cd ~/bin
ln -s
../nodejs/lib/node_modules/npm/bin/npm-cli.js npm

6. Node.js and npm are installed on your account. To verify this, type the following commands

node --version npm --version

The ~/bin directory is in your path by default, which means you can run node and npm from any directory in your account.

7. Start Node.js Application

nohup node my_app.js &

8. Stop the Application

pkill node

9. Integrating a Node.js application with the web server(optional)

Depending on the type of Node.js application you are running, you may want to be able to access it using a web browser. To do this, you need to select an unused port for the Node.js application to listen on, and then define server rewrite rules that redirect visitors to the application.

In a text editor, add the following lines to the .htaccess file in the/home/username/public_html directory, where username represents your account username:

RewriteEngine On
RewriteRule ^$ http://127.0.0.1:XXXXX/ [P,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ http://127.0.0.1:XXXXX/$1 [P,L]

In both RewriteRule lines, replace XXXXX with the port on which your Node.js application listens. To run a Node.js application on a managed server, you must select an unused port, and the port number must be between 49152 and 65535(inclusive). Save the changes to the .htaccess file, and then exit the text editor. Visitors to your website are redirected to the Node.js application listening on the specified port.

If your application fails to start, the port you chose may already be in use. Check the application log for error codes like EADDRINUSE that indicate the port is in use. If it is, select a different port number, update your application’s configuration and the .htaccess file, and then try again.

Thompson answered 23/11, 2018 at 15:28 Comment(10)
How to ensure the nodejs instance is relaunched after a server restart?Rhonarhonchus
To run the script and make sure it's up see #51205548Circumfluous
When I run ~/bin/npm --version I receive an error: internal/modules/cjs/loader.js:584 throw err; ^ Error: Cannot find module '../lib/utils/unsupported.js'Execution
I had to use export PATH=/opt/cpanel/ea-nodejs10/bin/:$PATH before node and npm worked.Intend
on step 6. node --version, gives me error, cannot execute binary fileMazurka
you dont have enough permission to execute the fileThompson
your htaccess is awesome! 😃Quotidian
can you please help. It returns err when i try to execute node node ./index.js bash: /home/khblpkn3ru9o/bin/node: cannot execute binary fileRotund
Best answer yet.Pharmaceutical
this fucking worksTelesthesia
W
33

cPanel typically runs Apache or another web server that is shared among all the cPanel/unix accounts. The web server listens on port 80. Depending on the domain name in the requested URL, the web server uses "Virtual Hosting" to figure out which cPanel/unix account should process the request, i.e. in which home directory to find the files to serve and scripts to run. If the URL only contains an IP address, cPanel has to default to one of cPanel accounts.

Ordinarily, without root access, a job run by a cPanel account cannot listen on port 80. Indeed, the available ports might be quite restrictive. If 8080 doesn't work, you might try 60000. To access a running node.js server, you'll need to have the port number it's listening on. Since that is the only job listening on that port on that server, you should be able to point your browser to the domain name of any of the cPanel accounts or even the IP address of the server, adding the port number to the URL. But, it's typical to use the domain name for the cPanel account running the node.js job, e.g. http://cPanelDomainName.com:60000/ .

Of course port 80 is the default for web services, and relatively few users are familiar with optional port numbers in URLs. To make things easier for users, you can use Apache to "reverse proxy" requests on port 80 to the port that the node.js process is listening on. This can be done using Apache's RewriteRule directive in a configuration or .htaccess file. This reverse proxying of requests arguably has other benefits as well, e.g. Apache may be a more secure, reliable and manageable front-end for facing the public Internet.

Unfortunately, this setup for node.js is not endorsed by all web hosting companies. One hosting company that supports it, even on its inexpensive shared hosting offerings, is A2Hosting.com. They also have a clearly written description of the setup process in their Knowledge Base.

Finally, it's worth noting that the developers of cPanel are working on built-in node.js support. "If all of the stars align we might see this land as soon as version 68," i.e. perhaps early 2018.

References

Apache Virtual Hosting - http://httpd.apache.org/docs/2.4/vhosts/

Apache RewriteRule Directive - http://httpd.apache.org/docs/2.4/mod/mod_rewrite.html

A2Hosting.com Knowledge Base Article on Configuring Node.js - https://www.a2hosting.com/kb/installable-applications/manual-installations/installing-node-js-on-managed-hosting-accounts

cPanel Feature Request Thread for node.js Support - https://features.cpanel.net/topic/nodejs-hosting

Related StackOverflow Questions

How to host a Node.Js application in shared hosting

Why node.js can't run on shared hosting?

Winterkill answered 31/7, 2017 at 1:59 Comment(5)
Is there nodejs support for cpanel in 2019?Rhonarhonchus
Doesn't look like it, see features.cpanel.net/topic/nodejs-hosting as mentioned in the answer, it's ongoing.Brownson
Actually just noticed this on there "expected to start hitting production tiers in Q2 of 2019"Brownson
cPanel now supports node.jsMalayalam
Now we can install node.js apps on cPanel documentation.cpanel.net/display/80Docs/…Antacid
L
10

Yes it's possible, but it has few dependencies which may or may not be supported by either your cpanel hosting provider or the plan you opt in for.

Below steps that I'm mentioning is just for a demo purpose. If you are a student or just want to play with it you can try it out. I'm not a security expert so from security point of view how good it is I really don't know.


So with that being said let's see how I configured it. I have hostinger cpanel hosting subscription and following are the steps:

Enable SSH ACCESS

ssh access in hostinger cpanel

enter image description here

Connect to shared machine via ssh

enter image description here

enter image description here

Check your linux distro and download & setup node js

In my case following are the commands for that:

Downloading node & extracting it using curl
curl https://nodejs.org/dist/v12.18.3/node-v12.18.3-linux-x64.tar.gz |tar xz

enter image description here enter image description here

This will download & extract node & create a directory. You can confirm that using ls command as shown in the image below.

enter image description here

At this point you can check the versions as shown below

enter image description here

as you can see for the node command it's okay but for the npm command we have modify it as follows

./node-v12.18.3-linux-x64/bin/node ./node-v12.18.3-linux-x64/lib/node_modules/npm/bin/npm-cli.js --version

enter image description here

Further we can create alias to make life little easier

check the below images for that:

enter image description here

enter image description here

I tried using bashrc/bash_profile but somehow it didn't work .

And that's all node server running on a shared cpanel machine.


Now I wanted to have an express js based rest api support in this case. The problem with that is it will be locally hosted on the port I'll give. Check the below example:

var express=require('express')

var app=express()

app.get('/', function (req, res) {
    res.send('hosting node js base express api using php & shared hosting a great way to start yjtools')
  })

console.log("listening yjtools node server on port 49876...")
app.listen(49876)

The problem here is even though it will execute I'll not be able to access it over the network. This is because we only get fixed predefined ports (like 80,21,3306 etc.) which are allowed/open on the shared cpanel machine. Due to this the express app I hosted will only available locally on 49876 port.

Let's see what do we have:

  • An express js based app hosted locally on cpanel machine.
  • Php based hosted Apache server available over http/https.

So we can make use of php with redirect rule set and curl to bridge the gap. Following are the changes I did to make it work:

In .htaccess file add a redirect rule, say domain/api is what I want my rest api path to be.

RewriteRule api/(.*)$ api/api.php?request=$1 [QSA,NC,L]

In the api/api.php file (this is the path I choose you can choose any path)

  <?php
echo "Hello ".$_REQUEST['username'];


echo '<hr>';

$curl = curl_init('http://127.0.0.1:49976/');
curl_setopt($curl, CURLOPT_HEADER, 1);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
//Get the full response
$resp = curl_exec($curl);
if($resp === false) {
    //If couldn't connect, try increasing usleep
    echo 'Error: ' . curl_error($curl);
} else {
    //Split response headers and body
    list($head, $body) = explode("\r\n\r\n", $resp, 2);
    $headarr = explode("\n", $head);
    //Print headers
    foreach($headarr as $headval) {
        header($headval);
    }
    //Print body
    echo $body;
}
//Close connection
curl_close($curl);
?>

And on the ssh prompt just run the app.js file

node api/app.js

Below are the images for this working in action:

enter image description here

enter image description here

Here is the similar thing which I referred for my program, so we can also make this node call via php itself.


Now I have express based rest api support , angular app hosted and mysql for database everything on cpanel.

Lafond answered 6/9, 2020 at 22:24 Comment(0)
C
5

You can use any domain pointed to that cPanel server and instead of accessing http://server-ip:8080 try accessing http://domain.tld:8080. By default cPanel does not bind on port 8080. Be sure to check if there is any firewall on the server. If it is, then allow incoming connections on tcp port 8080. Depending on your WHM server configuration, it should also work with http://server-ip:8080

Chancroid answered 22/5, 2017 at 9:25 Comment(2)
Thanks Bogdan. So where is ports option in WHM server configuration? I really can't look it in my WHM server options. If you know tell me your example navigation of path please.Bronchiectasis
cPanel has a default firewall (iptables). You can do an iptables -nL to see al the current rules. You can also do an systemctl stop firewalld to completely stop the firewall. If you use CSF for example, the configuration file is /etc/csf/csf.conf. You have the TCP_PORTS = "20,21,80,etc". You can just add 8080 there and do a csf -ra to restart the CSF firewall (if you have CSF installed)Chancroid
V
4

cPanel Version 80 has nodejs 10.x support: https://documentation.cpanel.net/display/80Docs/80+Release+Notes#id-80ReleaseNotes-InstallanduseNode.jsapplications

Install and use Node.js applications

You can now install and use Node.js applications on your server. To use Node.js, install the ea-nodejs10 module in the Additional Packages section of WHM's EasyApache 4 interface (WHM >> Home >> Software >> EasyApache 4).

You can register Node.js applications in cPanel's Application Manager interface (cPanel >> Home >> Software >> Application Manager). For more information, read our Guide to Node.js Installations documentation.

For Application Manager to be enabled: https://documentation.cpanel.net/display/80Docs/Application+Manager

Your hosting provider must enable the Application Manager feature in WHM's Feature Manager interface (WHM >> Home >> Packages >> Feature Manager).

Your hosting provider must install the following Apache modules:

The ea-ruby24-mod_passengermodule. Note: This module disables Apache's mod_userdir module.

The ea-apache24-mod_env module. Note: This module allows you to add environment variables when you register your application. For more information about environment variables, read the Environment Variables section below.

The ea-nodejs10 module if you want to register a Node.js™ application.

You can see how application manager looks like in this Youtube video: https://www.youtube.com/watch?v=ATxMYzLbRco

Villenage answered 10/6, 2019 at 8:56 Comment(3)
What if I want to choose the version of node with nvm for example? I have an app that requires node v8.9.3 ...Rhonarhonchus
@Rhonarhonchus I know it's not a solution but I'd urge your dev to move that app to 10.x, as nodejs 8.x will end having official support on January 2020 nodejs.org/en/about/releasesVillenage
too bad I have no control on that :\Rhonarhonchus
O
0

anyone who wants to know how to deploy node js app to Cpanel this is a good source for him, this explains thoroughly how to deploy node js app to Cpanel please check this

Osset answered 9/1, 2021 at 14:54 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.