Updated: August 9, 2026

By Matic BončinaFounder
✓Proofread & verified
Check your plan first. The Noxity plan comparison lists Node.js under BONFIRE, BLAZE, and INFERMO. SPARK includes Git and FLAME adds SSH, but neither one lists the runtimes, so Setup Node.js App won’t appear in cPanel on those plans. See the plan comparison ↗.
Available versions
Thirteen interpreters are enabled on our shared servers, from Node 6 through Node 24:
The dropdown opens on 10.24.1, which reached end of life in 2021. Change it before you create anything: pick 24 unless a dependency pins you lower.
Set up an app
1
Open Setup Node.js App
From cPanel home, scroll to Software and click Setup Node.js App.
2
Click Create application
On an empty account the Web applications tab reads “No applications found”, with a Create application button beside it.
3
Fill in the form
- Node.js version: pick from the dropdown. It opens on 10.24.1, so change it.
- Application mode: Development or Production. cPanel describes it as “Adds value for NODE_ENV variable” and it starts on Development.
- Application root: directory under your home, e.g.
myapp. Required. Created if it doesn’t exist. - Application URL: domain dropdown plus optional path. Use
/for the root or/apifor a sub-path. - Application startup file: the file that exports your handler. The field starts empty, so fill it in yourself.
- Environment variables: add them one at a time with Add variable.
4
Save
Click Create. Passenger starts the app in the background.The Selector scaffolds the application root for you: a
public/ directory, a tmp/ directory holding restart.txt, and a working starter app.js. Replace app.js with your own code when you deploy.Manage an app
The management page opens after creation and is reachable from the app list.
There’s no separate Edit button. The management page is the form: change a field in place, then click Save.
The Environment variables editor sits below the buttons, so you can add or change config after the app exists. Restart for new values to take effect.
Passenger owns the port
Passenger starts your process and forwards each request to it. In Node it hooks the firsthttp.Server that calls listen() and moves it onto a Unix socket, so the port number you pass is ignored.
That means the ordinary shape works unchanged:
app.js
app.listen(3000) in place is fine, and it’s what most Node projects already do. Exporting the server instead also works if your project is written that way:
app.js
app.js
listen().
Older guides tell you to delete the
listen() call before deploying behind Passenger. You don’t need to. Reverse port binding has handled this for years, and the port argument is discarded.Reference: where things live
Touching the restart trigger reloads the app on the next request rather than instantly. The activate script is what Run NPM Install sources before running
npm install. From SSH:
Common issues
App returns 503 on every request
App returns 503 on every request
The process isn’t running. Usually it crashed on boot: a missing dependency, a syntax error, or a startup file naming a path that doesn’t exist. Check Application startup file points at a real file, click Run NPM Install, then Restart.Don’t go deleting
app.listen() on the strength of an old tutorial. Passenger ignores the port you pass, so that line is not what’s breaking it.Cannot find module 'X' after deploying
Cannot find module 'X' after deploying
package.json is in the application root, but node_modules was built on a different machine or against a different Node version. Click Run NPM Install so it installs against the per-app env.Boot times out
Boot times out
Passenger gives an app 90 seconds to start, then kills the process and logs an error. A large dataset loaded on boot, or a synchronous DNS lookup, is usually what pushes past it.Move that work out of the startup path, or open a ticket if your app genuinely needs longer.
WebSockets close after a few seconds
WebSockets close after a few seconds
Every open socket holds an entry process for as long as it lives. Entry processes cap how many requests you can serve at once: 100 on BONFIRE, 150 on BLAZE, 210 on INFERMO. A WebSocket-heavy app runs into that ceiling long before it runs out of memory.Budget your concurrent socket count against your plan’s number, and move to a higher tier if you need more headroom.
`npm install` runs out of memory
`npm install` runs out of memory
Memory is 6 GB on BONFIRE, 8 GB on BLAZE, and 12 GB on INFERMO, shared with everything else on the account. A large dependency tree, Next.js or Strapi say, can still spike past what’s free during install.Run the install over SSH with
--prefer-offline --no-audit, or build on a dev machine and rsync node_modules and code over.Recipes
Deploy Next.js
Server-rendered Next.js with a custom server.
Deploy Express
REST API behind Passenger.
Need a hand?
Open a ticket
Best for anything that needs an account check or a config change on our end.
Live chat
Faster for quick questions during business hours.

