Configuración de ambiente de producción para una aplicación en Node.Js
Tags: node, nginx, aws, production
Published: 2019-06-10 04:37:46

---
title: Configuración de ambiente de producción para una aplicación en Node.Js
published: true
description: Un pequeño tutorial para poner tu app de nodejs en produccion
tags: nodejs,nginx,aws,production
cover_image: https://thepracticaldev.s3.amazonaws.com/i/1f1nuxzaeje0fu8twhg4.jpg
---
>Este es un post que originalmente publiqué en <a target="_blank" href="https://medium.com/@thianlopezz/configuraci%C3%B3n-de-ambiente-de-producci%C3%B3n-para-una-aplicaci%C3%B3n-en-node-js-9f867b464ad9">medium</a>.

Esta semana tuve que cambiar de servidor a una pequeña aplicación que tengo, pasé de la nube de Google (App Engine) a la nube de Amazon (EC2) y obviamente tuve que configurar el servidor desde cero, me alejé de esa comodidad que te ofrecen plataformas como App Engine o Heroku y me puse manos a la obra a la configuración. Me topé con ciertas cosas que son muchas veces dificiles de encontrar solución en internet por lo que decidí hacer este tutorial.

Para este tutorial voy a trabar en una instacia Ec2 de Amazon tipo t2.micro, con un sistema operativo Ubuntu Server 16.04 LTS, conseguí esta intancia gratis registrándome en <a target="_blank" href="https://aws.amazon.com/">AWS</a>.

Me conectaré a la instancia de Amazon vía SSH con putty.

![Dentro de Ubuntu Server](https://thepracticaldev.s3.amazonaws.com/i/8n1is88ancv33u55p7sx.png)

## Instalamos Node.JS
Lo primero que haremos es intalar Node.Js desde el package manager del sistema operativo. Para hacerlo vamos a la página oficial de Node.js en la parte de _Installing Node.js via package manager_ y elegimos el sistema operativo con el que estás trabajando. En mi caso yo elijo: _Debian and Ubuntu based Linux distributions_.

Ejecuto los comandos:
```
curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
sudo apt-get install -y nodejs
```
Y adicionalmente para nuestro caso, instalamos ciertos addon que necesita NPM:
```
sudo apt-get install -y build-essential
node -v
```
![](https://thepracticaldev.s3.amazonaws.com/i/4siri8p7fgqtpsrai5t3.png)

## Instalamos Git
Sí, para nuestro caso puntual vamos a instalar Git herramienta con la cual vamos clonar el repositorio de nuestro aplicativo, tambien puedes usar un cliente SFTP para llevar tu código fuente hacia el servidor.

Vamos a usar nuevamente nuestro package manager. ¡Sí! porque no vamos a usar otro tipo de método teniendo esta hermosa herramienta, así que vamos a la documentación oficial de Git y en la parte de instalar en linux copiamos la siguiente línea y la ejecutamos como usuario root:
```
sudo apt-get install git
```
Para comprobar que todo salió bien y ver que versión se instaló ejecutamos:
```
git --version
```
![Instalamos la versión 2.7.4 de Git](https://thepracticaldev.s3.amazonaws.com/i/1973j7uhewmnkddqq64k.png)
## Instalamos PM2
Pm2 es una herramienta para ambientes de producción de aplicaciones de Node.Js, básicamente esta herramienta nos sirve para levantar nuestra aplicación como un servicio demonio en nuestro servidor aparte nos ayuda a que este siempre arriba en caso de que se produzca un error, ejecutamos el siguiente comando como usuario root:
```
sudo npm install pm2 -g
```
>No olvides la opción -g que indica que instalaremos la librería de manera global

## Instalamos nuestra aplicación
Por el momento no necesitamos nada más que nuestro fuente, vamos a clonar nuestro repositorio con Git, te dejo un fuente de ejemplo. Este ejemplo es una simple página web y Api que corre sobre Express.js.
```
mkdir apps
cd apps
git clone https://github.com/thianlopezz/tuto-node-prod.git
```
>Creamos un nuevo directorio sobre la raíz llamado “apps”, entramos en el directorio y clonamos nuestro repositorio
```
cd tuto-node-prod
npm install
```
>Entramos en nuestro fuente y lo instalamos

Automáticamente se va a levantar nuestro servidor con Nodemon en el puerto 5002.
![Servidor escuchando en el pueto 5002](https://thepracticaldev.s3.amazonaws.com/i/gpv6eizahdozksp81xbm.png)

En teoría en este momento ya se puede acceder a nuestro sitio, poniendo la IP o el public DNS de nuestro servidor seguido del puerto.

Para nuestro caso que estamos utilizando una instancia de EC2 de Amazon debemos abrir el puerto 5002 para que sea accedido desde cualquier lugar, en nuestra consola vamos a la parte de seguridad de nuestra instacia, seleccionamos nuestro grupo de seguridad y en la pestaña de inbound damos en editar.
![Consola AWS](https://thepracticaldev.s3.amazonaws.com/i/4eyjo0y43s9yar5a54sg.png)
Se despliega un modal, le damos en Add Rule y configuramos el registro de la siguiente manera:
![Configuramos para que el puerto 5002 pueda ser accedido desde cualquier lugar](https://thepracticaldev.s3.amazonaws.com/i/v5mrm59yjzluc3qgcfk5.png)
Guardamos e ingresamos a nuestra página.
![Página de prueba](https://thepracticaldev.s3.amazonaws.com/i/effk8xxo6zgd1r4lw4td.png)
Pero bien, como dijimos, debemos crear un demonio con PM2 asi que paramos el servidor y ejecutamos el siguiente comando:
```
sudo pm2 start API/server.js --name hola-mundo
```
>Apuntamos a nuestro archivo que tiene la configuración de nuestro servidor Express.Js, la bandera name es para darle nombre a nuestro servicio que quedará corriendo, si no usas esta bandera el nombre del servicio será el mismo que el de tu archivo.

![Servidor arriba con PM2](https://thepracticaldev.s3.amazonaws.com/i/t4tkemlfff2ud3euxqjt.png)
PM2 tiene opciones interesantes puedes ver más en su documentación oficial.

## Instalamos Nginx
Es recomendable instalar un Reverse Proxy, lo haremos con Nginx para que básicamente haga lo siguiente:
![](https://thepracticaldev.s3.amazonaws.com/i/73q3aymzvxmglgwjai9z.png)
Nos va a ayudar para que nuestra aplicación no sea accedida directamente desde el tráfico de internet, sino que pase por Nginx y este se encargue de poner en ruta la petición al puerto que se configure, de esta manera también optimizamos el uso de nuestro servidor, si quieres saber más este <a target="_blank" href="https://www.nginx.com/blog/5-performance-tips-for-node-js-applications/">post</a> esta muy bueno.

Ejecutamos el siguiente comando para instalar Nginx :
```
sudo apt-get install nginx
```
Para comprobar que se instaló de manera correcta y ver la versión:
```
nginx -v
```
Abrimos el archivo de configuración de Nginx para editarlo:
```
sudo nano /etc/nginx/nginx.conf
```
Agregamos la siguiente configuración:
{% gist https://gist.github.com/thianlopezz/54ef56c2656ad09e7c759e5a45d22646 %}
Con esta configuración seteamos el puerto 443 para https y 80 para http, en las líneas 9 y 10 hacemos referencia a nuestros archivos de nuestro certificado SSL.

Con el comando nano entramos en una especie de editor, agregamos la configuración, presionamos **ctrl+x** luego **Y** y **enter**.

Verificamos que el archivo **nginx.conf** este correcto con:
```
sudo nginx -t
```
Para actualizar la nueva configuración reiniciamos el servicio de Nginx con:
```
sudo service nginx reload
```
Ya podemos acceder a nuestro sitio mediante nuestra URL.

## Última configuración en la consola de Amazon
Para terminar con la configuración en Amazon debemos asignar una dirección IP fija a nuestra instancia EC2, para esto vamos a en la sección de **NETWORK & SECURITY** e ingresamos en **Elastic IP** y damos en la opción **Allocate new address**.
![](https://thepracticaldev.s3.amazonaws.com/i/ejzuz2y0ddufs5rwen3f.png)

Luego solo damos en Allocate.
![](https://thepracticaldev.s3.amazonaws.com/i/8hwgxv6lhlnqdxfqs9y7.png)

Ahora configuremos el destino, asociamos la dirección IP a nuestra instancia.
![](https://thepracticaldev.s3.amazonaws.com/i/ducen9c5az2uc957g2up.png)
![](https://thepracticaldev.s3.amazonaws.com/i/9xrirm86jj9c6wsjhd28.png)
>No te olvides de eliminar el acceso al puerto 5002 en las reglas de servidor en la consola de Amazon, esta regla ya no es necesaria debido a que con esta configuración Nginx se encarga de redirigir las llamadas desde el puerto 443 hacia el 5002 internamente

![](https://thepracticaldev.s3.amazonaws.com/i/wrzrlfrvh2d4wba6prwr.png)

## Conclusiones
A lo largo de mi investigación me tope con muchos tutoriales pero ninguno se ajustaba exactamente a mi caso, todos recomendaban Nginx para terminar una configuración correcta pero yo quise saltarme este paso, consideraba a Nginx como una herramienta que no me iba a aportar mucho en lo que estoy enfocado, pero una vez que comprendí su concepto me pareció una herramienta muy poderosa. Con esta configuración tenemos listo nuestro ambiente para nuestra aplicación en Node.Js no te olvides de dejar tus aplausos y comentarios. Cuéntame como te va.