What installing Node.js on cPanel actually means
On a cPanel account you do not install Node.js itself. The server administrator installs the runtime, and you create an application that selects one of those versions. Setup Node.js App, sometimes labelled Application Manager, is where that happens.
| Who you are | Where the action is | What you actually do |
|---|---|---|
| Shared hosting customer | cPanel, then Setup Node.js App | Create an app, pick a version, upload code, run NPM Install |
| VPS or dedicated owner | WHM as root, then EasyApache | Install the ea-nodejs packages, then use the same app screen per account |
| CloudLinux reseller | Node.js Selector | Same idea; users pick from the versions the host enabled |
If the icon is missing from your cPanel, the runtime or the selector is not enabled on that server. That is a host-side setting, not something an account can turn on from inside the panel. Email support@webji.services with your domain and the Node version you need and we will check it for you.
Create the application in Setup Node.js App
One application maps to one folder and one domain or subdomain. Creating it is five fields, and each one has a consequence later.
- Open Setup Node.js App and click Create Application.
- Choose the Node.js version. Pick the newest long-term-support release your code runs on, not the newest available.
- Set Application mode to Production. That sets NODE_ENV for you and turns off verbose error output on the live site.
- Set Application root to a folder outside public_html, for example nodeapp. Set Application URL to the domain or subdomain that will serve it.
- Set the startup file to the file that runs your app, such as app.js or server.js, then click Create.
You know the app exists when it appears in the list with a status, a restart button, and an entry point into its virtual environment. Do not upload code yet if you have not read the next section, because a startup file that calls app.listen() will fail no matter how correct the rest is.
The startup file rule that decides whether it works
cPanel serves Node through Phusion Passenger, which owns the web server and the ports. Your app must hand the Express object to Passenger and must not start its own listener. This single difference is why code that runs perfectly on a laptop returns 503 on shared hosting.
- Correct: create the app, define routes, then
module.exports = app;at the end of the file. - Wrong:
app.listen(3000);at the end of the file. Passenger never receives the app and the request fails. - No custom ports: do not bind 3000, 3001, or 8080. Passenger routes through 80 and 443.
- Plain Node without Express: export a request handler function with the signature
(req, res).
Remove the listener, restart the app from the panel, and reload the URL. The page that appears is your app's own output, which is the only confirmation that matters.
Upload the code and install dependencies
Upload the project into the application root with File Manager or SFTP, including package.json. Do not upload node_modules from your laptop; the panel builds them against the server's own Node version.
Back in Setup Node.js App, click the pencil icon for the app and then Run NPM Install. The panel runs the install inside the application's virtual environment and shows the result. When it finishes, click Restart.
If you prefer the command line, the edit screen prints the exact activation command, in the shape source /home/your-. Run that, then npm install or npm ci yourself. Type deactivate to leave the environment.
Environment variables, restarts, and logs
Environment variables are set per application in the same edit screen, so database URLs and API keys stay out of the repository. Add the key and value, save, and restart, because the running process keeps the old values until it is restarted.
Restart after every change to the startup file, a new dependency, or an environment variable. The panel's restart button is the equivalent of a service reload; editing a file alone changes nothing on the live site.
For logs, write with console.log() and read the app's output in the panel's log view, or look under ~/logs and ~/.nodeapp in File Manager. A 500 with no output at all usually means the process crashed before the first log line, so check the startup file syntax with node --check app.js in the virtual environment.
Errors: 503, Cannot GET, and module not found
Three messages cover most first deployments. Match the message, make the change, restart, and reload before guessing at anything else.
| What you see | Cause | Fix |
|---|---|---|
| 503 Service Unavailable | The startup file calls app.listen() or throws on load | Export the app, check syntax with node --check, then restart |
| Cannot GET /path | The app is running but has no route for that path | Add the route, or set the correct Application URL and base path |
| Error: Cannot find module 'express' | Dependencies were never installed in the app environment | Run NPM Install from the panel, or npm ci inside the activated environment |
| 403 on every request | Files are not readable by the app user, or the startup file name is wrong | Set files to 644 and folders to 755, then confirm the startup filename exactly |
| App loads, then stops after a while | Passenger idles the process and a background timer is not supported | Move scheduled work to a cron job that calls a script, not a setInterval |
One more: after changing the Application root or URL, the old path can stay cached in the app entry. Delete and recreate the application rather than editing it twice, which is faster than chasing a stale binding.
What Setup Node.js App will not do
Passenger starts your app on a request and stops it when idle. That model suits APIs, server-rendered sites, and webhooks. It does not suit a resident worker, a websocket server that holds thousands of connections, PM2 clustering, or a build step that needs native compilation and root-level libraries.
When you reach that boundary, the same codebase moves to a VPS server where you run the process manager yourself. On a VPS you install Node with the distribution packages or nvm, keep the app alive with systemd or PM2, and put Nginx in front of it. Nothing in the application changes except the listener you removed for Passenger.
cPanel hosting from WebJi for Node apps
Setup Node.js App is enabled on our Linux cPanel plans, and the L-Developer tier is the one to pick for Node work because it carries more CPU and concurrent entry processes than the entry plans. It is ₹700 per month before 18% GST, with GST invoices issued on every purchase.
The plan details are on the cPanel hosting page, and Node-specific notes sit on Node.js hosting. Email support@webji.services with the Node version, the startup file name, and the exact error; support is 24/7 by email in Hindi and English with an average first reply under 60 minutes.
Frequently Asked Questions
Can I install Node.js on cPanel shared hosting?
Not the runtime itself, but you can run Node applications. Setup Node.js App lets you pick from the versions your host has installed, create an application with its own folder and startup file, and install dependencies from the panel. The runtime is installed server-side by the host.
Why is Setup Node.js App missing from my cPanel?
The feature is enabled per server, and on CloudLinux it appears as Node.js Selector or Application Manager instead. If no Node icon appears in Software, the runtime or the selector is not provisioned for your account, which only the host can change.
Why does my Node app show 503 Service Unavailable on cPanel?
Almost always because the startup file calls app.listen() instead of exporting the app. Passenger owns the web server and expects module.exports = app. A syntax error on load produces the same 503, so run node --check on the startup file and restart.
How do I run npm install on cPanel?
Open Setup Node.js App, click the pencil icon next to the application, and click Run NPM Install. It runs inside the app's virtual environment. For the command line, paste the activation command shown on that screen, then run npm ci or npm install.
Which Node.js versions can I choose in cPanel?
Only the versions your host has installed, typically the current LTS releases such as 18, 20, and 22 through the ea-nodejs packages, or the CloudLinux selector list. If your app needs a version that is not listed, ask the host before rewriting code.
Can I use a custom port or PM2 on cPanel shared hosting?
No. Passenger serves the app on 80 and 443, so binding 3000 or any other port breaks it, and there is no process manager to daemonise. PM2, clustering, and long-lived workers are VPS features.

