Desplegando una aplicación Node.js en hosting compartido de cPanel con Passenger
Una guía paso a paso para ejecutar una aplicación Express en hosting compartido de cPanel con Application Manager y Passenger, que incluye reinicios, variables de entorno y soluciones para errores 503.
Muchos hosts compartidos de cPanel pueden ejecutar bien una aplicación Express o un servidor API, siempre y cuando la cuenta cuente con soporte para Node.js junto con Phusion Passenger detrás del Administrador de aplicaciones de cPanel. No es necesario configurar Nginx, un proxy inverso Apache ni PM2 por cuenta propia; Passenger inicia la aplicación y dirige las solicitudes hacia ella. Esta guía abarca el despliegue completo, desde verificar que la función esté habilitada hasta diagnosticar un error 503, y finaliza con una lista de verificación previa al lanzamiento.
Requisitos de su cuenta de hosting
Asegúrese de que la cuenta ofrezca lo siguiente antes de subir cualquier cosa:
- Soporte para Node.js
- Administrador de aplicaciones de cPanel
- Passenger
- Acceso a la terminal o SSH
- npm
- Un dominio o subdominio desde el cual servir la aplicación
- Acceso a una base de datos, si la aplicación lo requiere
Si falta Application Manager, pídale a su proveedor que active Node.js y Passenger. Los proveedores que utilizan CloudLinux pueden denominar la herramienta de manera diferente.
Paso 1: Confirmar que Node.js está disponible
En cPanel, abra Software y luego Application Manager (algunas versiones muestran las opciones de Node.js bajo administración del sitio web en su lugar). Si se abre, la cuenta está lista.
Paso 2: Subir la aplicación
Suba el proyecto mediante el Gestor de archivos o Git a una carpeta en su directorio personal, por ejemplo:
/home/username/my-node-app
Un layout típico de proyecto se ve así:
my-node-app/
├── package.json
├── package-lock.json
├── app.js
├── src/
└── ...
Mantenga el código fuente fuera de public_html, ya que los navegadores pueden solicitar directamente cualquier archivo que se encuentre allí.
Paso 3: Preparar package.json e instalar dependencias
El proyecto necesita un package.json válido que declare sus dependencias y una secuencia de inicio. Un ejemplo mínimo con Express:
{
"name": "my-node-app",
"version": "1.0.0",
"scripts": {
"start": "node app.js"
},
"dependencies": {
"express": "^5.1.0"
}
}
Luego abra la Terminal de cPanel, vaya a la carpeta del proyecto e instale:
cd ~/my-node-app
npm install
Esto instala las dependencias declaradas en el servidor. Con un archivo de bloqueo guardado, npm ci --omit=dev es una alternativa más ligera y reproducible.
Paso 4: Escribir el archivo de inicio
Passenger necesita un punto de entrada que pueda ejecutar, como por ejemplo:
app.js
En una aplicación Express, ese archivo comienza cargando Express:
const express = require('express');
y luego crea la aplicación, define una ruta y comienza a escuchar. El código a continuación está condensado en unas pocas líneas, pero es un JavaScript válido porque cada declaración termina con un punto y coma.
const app = express();const PORT = process.env.PORT || 3000;app.get('/', (req, res) => {
res.send('Node.js application is working!');
});app.listen(PORT, '0.0.0.0', () => {
console.log(`Application running on port ${PORT}`);
});
Por qué el puerto debe provenir de process.env.PORT
No codifique de forma fija un puerto público. Passenger decide cómo llegan las solicitudes a su proceso, por lo que debe leer el puerto del entorno y mantener una opción de respaldo local:
const PORT = process.env.PORT || 3000;
El mismo código se ejecuta entonces localmente en el puerto 3000 y con Passenger sin cambios.
Paso 5: Registrar la aplicación en cPanel
En Application Manager, haga clic en Create Application o Register Application. Asigne un nombre a la aplicación, como my-node-app, elija el dominio (por ejemplo example.com) y / como URL base, establezca la carpeta raíz en la carpeta del proyecto y el archivo de inicio en app.js, elija una versión estable de Node.js que soporten sus dependencias, y seleccione el entorno Production. Luego haga clic en Create o Deploy. La ruta de la solicitud resultante se verá así:
https://example.com
↓
Apache
↓
Passenger
↓
Node.js App
↓
app.js
Apache recibe la solicitud, y Passenger la reenvía al proceso de Node.js iniciado desde su archivo de inicio.
Paso 6: Establecer variables de entorno
Defina las variables de entorno en la configuración de la aplicación en lugar de en el código. Por ejemplo:
APP_ENV=production
DB_HOST=localhost
DB_DATABASE=mydb
DB_USERNAME=myuser
DB_PASSWORD=your_password
Su código los lee a través de process.env:
process.env.DB_HOST
process.env.DB_DATABASE
process.env.DB_USERNAME
Mantenga los datos confidenciales únicamente en el lado del servidor: nunca en JavaScript del frontend ni en un archivo accesible públicamente como un .env en public_html.
Paso 7: Reinicie después de cada cambio
Passenger mantiene la aplicación cargada, por lo que los cambios solo se aplican después de un reinicio desde Application Manager. Donde se admite la convención de archivo de reinicio, también funciona la terminal:
mkdir -p ~/my-node-app/tmp
touch ~/my-node-app/tmp/restart.txt
Passenger monitorea la marca de tiempo de tmp/restart.txt y reinicia la aplicación en la siguiente solicitud después de que cambie, lo cual es adecuado para scripts de despliegue.
Resolución de problemas de 503 Servicio no disponible
El error que más probablemente encontrará es este:
503 Service Unavailable
Un 503 rara vez significa que el servidor está caído; generalmente Passenger no pudo iniciar o acceder a su aplicación. Pruebe ejecutarla usted mismo primero:
cd ~/my-node-app
node app.js
Si falla, arregle eso primero. Si arranca, revise los problemas más comunes.
Archivo de inicio incorrecto
El Administrador de Aplicaciones debe apuntar al archivo que realmente existe y que inicia el servidor:
app.js
Dependencias faltantes
Si node_modules está ausente o incompleto, instálelo nuevamente:
npm install
Versión incompatible de Node.js
Verifique qué versión está utilizando la terminal y cuáles son los requisitos de sus dependencias:
node -v
Luego elija una versión compatible en la configuración de la aplicación.
Porto codificado de forma fija
Asegúrese de que el servidor escuche en:
process.env.PORT
en lugar de un puerto público fijo.
Variables de entorno faltantes
Confirme que las credenciales, claves API, el modo de la aplicación y otros valores necesarios estén configurados; una variable no definida que provoque un fallo en el inicio también genera un 503.
Registros
Los registros del Passenger o de la aplicación cPanel suelen mostrar el error exacto al iniciar.
Alojamiento compartido versus VPS
Los dos entornos difieren principalmente en quién controla el servidor. En el alojamiento compartido con cPanel, la estructura es más o menos así:
cPanel
│
├── Apache
├── Passenger
└── Node.js
│
└── Your Application
El proveedor de hosting y Passenger gestionan el servidor web y los procesos. En un VPS, uno tiene control total sobre cada capa:
VPS
│
├── Nginx/Apache
├── Node.js
├── PM2
├── Firewall
├── SSL
└── Application
Un VPS ofrece mucho más control y generalmente es más adecuado para aplicaciones que requieren muchos recursos o están altamente personalizadas; consulte un marco práctico para llevar aplicaciones Node.js a producción. El alojamiento compartido sacrifica ese control en favor de la simplicidad.
Estructura de directorios ordenada
Una implementación limpia con cPanel mantiene la aplicación y la raíz web pública una al lado de la otra:
/home/username/
│
├── my-node-app/
│ ├── app.js
│ ├── package.json
│ ├── package-lock.json
│ ├── node_modules/
│ ├── src/
│ └── tmp/
│ └── restart.txt
│
└── public_html/
Las solicitudes llegan a my-node-app a través de Apache y Passenger, y public_html permanece libre de código del servidor.
Lista de verificación final
Antes de considerar que el despliegue está completo, confirme que:
- Node.js está habilitado para la cuenta
- El Application Manager está disponible
- Se ha seleccionado una versión compatible de Node.js
- Los archivos del proyecto se han subido fuera de
public_html - Está presente
package.json npm installse completó sin errores- La configuración del archivo de inicio es correcta
- El servidor escucha en
process.env.PORT - Las variables de entorno están configuradas
- El entorno está establecido en Producción
- La aplicación se ha reiniciado desde el último cambio
- El dominio se carga en un navegador
Conclusión
En el hosting compartido de cPanel, Application Manager con Passenger es la opción fiable que permite ejecutar aplicaciones y APIs de Express sin acceso root. Deje que Passenger controle el puerto, reinicie después de cada cambio y, cuando algo falle, ejecute la aplicación manualmente y lea los registros antes de modificar la configuración.