Clase 15 - Clusters y Escalabilidad
Clase 15 - Clusters y Escalabilidad
Clase 15 - Clusters y Escalabilidad
Programación Backend
Clusters y Escalabilidad
● Conocer e implementar el módulo cluster.
● Aprender acerca del módulo Forever y su
diferencia con Nodemon.
● Conocer e implementar el módulo PM2 y su
ventaja sobre Forever.
👉 Poner en marcha el servidor con node (sin nodemon) y verificar en el sistema operativo el proceso de node
y su pid. Hacerlo con nodemon y ver la diferencia (constatar que nodemon crea un proceso padre forkeando a
nuestro server). En ambos casos el puerto de escucha será el 8081.
SERVIDOR NODE CON CLUSTER
Tiempo: 10 minutos
Servidor Node con Cluster
Tiempo: 10 minutos
Tomando como base el ejercicio anterior, agregar la lógica que permita construir un cluster de
servidores, poniendo un evento de escucha en cada servidor para reiniciarlo si se cae.
● Representar por consola el número de procesadores detectados, el momento en el que un servidor
se cae, el pid de los procesos worker y el del master.
● Poner en marcha el servidor con node y nodemon en el puerto 8081, verificando en cada caso, la
respuesta en su ruta raíz y el número de procesos activos de node en el sistema operativo,
relacionándolos con el número de procesadores.
● Finalizar en el sistema operativo un proceso worker comprobando que se reinicia en un nuevo pid.
● Como último identificar el pid del master y finalizar su proceso de node, analizando qué ocurre en
el caso de haberlo ejecutado con node y con nodemon.
MÓDULO FOREVER
¿Qué es?
● Cuando ejecutamos un proyecto de Node en un servidor en el que lo tengamos
desplegado, dejamos la consola “ocupada” con esa aplicación. Si queremos
seguir haciendo cosas o arrancar otro proyecto no podemos, ya que
tendríamos que detener la aplicación pulsando Ctrl+C quedando la consola
libre nuevamente.
● Por otro lado, si el servidor se parara por un fallo, nuestra aplicación no se
arrancaría de nuevo.
● Ambos problemas se pueden resolver con el módulo Forever de Node.
Comparación con Nodemon
● Como ya vimos, cada vez que hacemos cambios en alguno de los archivos del
programa, debemos parar e iniciar nuevamente el servidor.
● El módulo Nodemon de Node, evita esto y se reinicia de forma automática
ante cualquier cambio en los archivos del programa en ejecución.
● Sin embargo, Nodemon solo nos sirve en desarrollo. Cuando estamos en
producción, no se puede hacer uso de este módulo
● Esta es la ventaja de Forever, ya que este puede utilizarse en producción.
Además, nos sirve también para reiniciar el servidor ante un fallo del mismo.
Usando ‘forever’ por línea de comando
● Finalizar por sistema operativo el proceso de cada uno de estos servidores (fork y cluster), comprobando
que PM2 los ponga en marcha nuevamente (tendrían que iniciar con un nuevo pid).
● Con PM2 listar todos los servidores activos y e ir finalizando los procesos (por id y por name),
verificando en el sistema operativo, para cada operación, los procesos activos de node.
☕
BREAK
¡20/25 MINUTOS Y
VOLVEMOS!
SERVIDOR PROXY
¿Qué es?
● Es un servidor que hace de intermediario entre las conexiones de un cliente y
un servidor de destino, filtrando todos los paquetes entre ambos.
● Sin el proxy, la conexión entre cliente y servidor de origen a través de la web
es directa.
● Se utiliza para navegar por internet de forma más anónima ya que oculta las
IP, sea del cliente o del servidor de origen.
● Por ser intermediario, ofrece funcionalidades como control de acceso,
registro del tráfico, mejora de rendimiento, entre otras.
FORWARD PROXY vs. REVERSE
PROXY
Proxy directo (forward)
● Es un servidor proxy que se coloca entre el cliente y la web.
● Recibe la petición del cliente para acceder a un sitio web, y la transmite al
servidor del sitio, para que este no se entere de qué cliente está haciendo
la petición.
● Lo utiliza un cliente cuando quiere anonimizar su IP.
● Es útil para mejorar la privacidad, y para evitar restricciones de contenido
geográfico (contenido bloqueado en cierta región).
Proxy inverso (reverse)
● Es este caso, el servidor proxy se coloca entre la web y el servidor de
origen.
● Entonces, el que se mantiene en el anonimato es el servidor de origen.
Garantiza que ningún cliente se conecte directo con él y por ende mejore
su seguridad.
● En general el cifrado SSL de un sitio web seguro se crea en el proxy (y no
directamente en el servidor).
● Además, es útil para distribuir la carga entre varios servidores web.
Similitudes y diferencias
● Ambos pueden trabajar juntos, ya que no se superponen en su funcionamiento.
● Los clientes/usuarios pueden utilizar un proxy directo y los servidores de origen un
proxy inverso.
REVERSE PROXY EN BACKEND
Utilizar proxy inverso en backend
Existen varios beneficios por lo que, al crear un sitio web, conviene utilizar un
proxy inverso:
● Balancear la carga: Un solo servidor de origen, en una página con
millones de visitantes diarios, no puede manejar todo el tráfico entrante.
El proxy inverso puede recibir el tráfico entrante antes de que llegue al
servidor de origen. Si este está sobrecargado o cae completamente, puede
distribuir el tráfico a otros servidores sin afectar la funcionalidad del sitio.
Es el principal uso de los servidores proxy inverso.
Utilizar proxy inverso en backend
● Seguridad mejorada: Al ocultar el proxy inverso la IP del servidor de
origen de un sitio web, se puede mantener el anonimato del mismo,
aumentando considerablemente su seguridad. Al tener al proxy como
intermediario, cualquier atacante que llegue va a tener una traba más para
llegar al servidor de origen.
● Potente caching: Podemos utilizar un proxy inverso para propósitos de
aceleración de la web, almacenando en caché tanto el contenido estático
como el dinámico. Esto puede reducir la carga en el servidor de origen,
resultando en un sitio web más rápido.
Utilizar proxy inverso en backend
● Compresión superior: Un proxy inverso es ideal para comprimir las
respuestas del servidor. Esto se utiliza mucho ya que las respuestas del
servidor ocupan mucho ancho de banda, por lo que es una buena práctica
comprimirlas antes de enviarlas al cliente.
● Cifrado SSL optimizado: Cifrar y descifrar las solicitudes SSL/TLS para
cada cliente puede ser muy difícil para el servidor de origen. Un proxy
inverso puede hacer esta tarea para liberar los recursos del servidor de
origen para otras tareas importantes, como servir contenido.
Utilizar proxy inverso en backend
● Monitoreo y registro del tráfico: Un proxy inverso captura cualquier
petición que pase por él. Por lo tanto, podemos usarlos como un centro de
control para monitorear y registrar el tráfico. Incluso si utilizamos varios
servidores web para alojar todos los componentes de nuestro sitio web, el
uso de un proxy inverso facilitará la supervisión de todos los datos
entrantes y salientes del sitio.
☕
BREAK
¡5/10 MINUTOS Y
VOLVEMOS!
NGINX
¿Qué es?
● Nginx es un servidor web, orientado a eventos (como Node) que actúa como un
proxy lo que nos permite redireccionar el tráfico entrante en función del dominio de
dónde vienen, hacia el proceso y puerto que nos interese.
● Se usa para solucionar el problema que se genera al correr nuestra app Node en el
puerto 80, para que sea accesible desde una IP o dominio, y queremos utilizar el
mismo puerto con otro proceso.
Configurar Nginx para Windows
● Para configurar Nginx para Windows, primero debemos descargarlo del link:
http://nginx.org/en/download.html
● Descargar la última versión mainline.
● Para empezar a configurarlo, en consola (por ejemplo, en el disco C:
directamente) descomprimimos el archivo descargado, e inicializamos el
Nginx abriendo el ejecutable: nginx.exe
Configurar Nginx para Windows
● Observamos la estructura de carpetas del Nginx.
● La configuración se encuentra en la carpeta llamada conf.
● El espacio público está en la carpeta llamada html.
Configurar Nginx para Windows
● Luego, para listar los procesos de Nginx, podemos usar el comando tasklist
(aunque también podemos usar el Administrador de Tareas).
nuevos procesos de trabajo con una nueva configuración, cierre elegante de los
procesos de trabajo antiguos.
./nginx.exe -s reopen para reabrir logs de archivos.
EJECUTAR SERVIDOR NGINX
Tiempo: 8 minutos
Ejecutar servidor Nginx
Tiempo: 8 minutos
● En el código anterior, vemos que está comentada la línea de código del recurso
del espacio público .
Servidor Cluster
Ejecutando el server de Nginx
● Ahora ya podemos iniciar el Nginx. Para eso, primero lanzamos el ejecutable
nginx.exe
NOTA: El proyecto de Node se llama NginxNode y está en la misma carpeta que el Nginx.
Ejecutando el server de Nginx
● Si modificamos la configuración, debemos reiniciar el servidor de Nginx para
que la misma se ejecute, como lo indicamos en las diapositivas anteriores, a
través de la consola, con el comando ‘./nginx.exe -s reload’
○ La primera instancias (8081) correrá en modo fork (por código), la otra (8082) en
modo cluster (por código) utilizando PM2 modo fork (sin -i max).
○ Probar que con cada request cambie el servidor que responde en forma equitativa.
○ Luego cambiar la configuración del servidor para que la carga se distribuya 1-3
entre las dos instancias de Node, es decir, la instancia 8082 atenderá el triple de
paquetes que la instancias 8081. Verificar esta operación.
NOTA: la instancia de servidor node deberá recibir como primer parámetro el puerto de
escucha y como segundo el modo de trabajo: FORK ó CLUSTER.
SITIOS OFRECIDOS POR NODE
O NGINX
Tiempo: 5 minutos
Sitios ofrecidos por Node o Nginx
Tiempo: 5 minutos
Realizar un sitio web sencillo (con HTML, CSS y Javascript) que sea ofrecido en principio por
el servidor de node.js del desafío anterior, utilizando el servicio de archivos estáticos de express.
Las instancias de Node.js continuarán corriendo con PM2 en modo watch para incorporar
nuevos cambios.
Comprobar que el sitio web se vea correctamente desde las dos instancias de Node.js en su ruta
raíz.
Luego cambiar la configuración de Nginx para que ofrezca el sitio realizado en su ruta raíz,
desactivando en las instancias de Node.js el servicio estático de archivos.
Comprobar que ahora Nginx sea el que ofrezca el sitio web y no Node.js
1
5
>> Consigna:
Tomando con base el proyecto que vamos realizando, agregar un parámetro más en la ruta
de comando que permita ejecutar al servidor en modo fork o cluster. Dicho parámetro será
'FORK' en el primer caso y 'CLUSTER' en el segundo, y de no pasarlo, el servidor iniciará
en modo fork.
● Agregar en la vista info, el número de procesadores presentes en el servidor.
● Ejecutar el servidor (modos FORK y CLUSTER) con nodemon verificando el número de
procesos tomados por node.
● Ejecutar el servidor (con los parámetros adecuados) utilizando Forever, verificando su correcta
operación. Listar los procesos por Forever y por sistema operativo.
EJECUTAR SERVIDORES NODE
Formato: link a un repositorio en Github con el proyecto cargado.
Sugerencia: no incluir los node_modules
● Ejecutar el servidor (con los parámetros adecuados: modo FORK) utilizando PM2 en sus
modos modo fork y cluster. Listar los procesos por PM2 y por sistema operativo.
● Tanto en Forever como en PM2 permitir el modo escucha, para que la actualización del código
del servidor se vea reflejado inmediatamente en todos los procesos.
● Hacer pruebas de finalización de procesos fork y cluster en los casos que corresponda.
SERVIDOR NGINX
Formato: link a un repositorio en Github con el proyecto cargado.
Sugerencia: no incluir los node_modules
>> Consigna:
Configurar Nginx para balancear cargas de nuestro servidor de la siguiente manera:
Redirigir todas las consultas a /api/randoms a un cluster de servidores escuchando en el puerto 8081.
El cluster será creado desde node utilizando el módulo nativo cluster.
El resto de las consultas, redirigirlas a un servidor individual escuchando en el puerto 8080.
Verificar que todo funcione correctamente.
Luego, modificar la configuración para que todas las consultas a /api/randoms sean redirigidas a un
cluster de servidores gestionado desde nginx, repartiéndolas equitativamente entre 4 instancias
escuchando en los puertos 8082, 8083, 8084 y 8085 respectivamente.
SERVIDOR NGINX
Formato: link a un repositorio en Github con el proyecto cargado.
Sugerencia: no incluir los node_modules