Skip to content

T2. Implantación de arquitecturas web

Bases del despliegue.

Arquitecturas web:

Modelos de capas:

capas

  • Modelo 2 capas: cliente - datos tanto en aplicaciones clásicas (JavaFx + MySQL o Cpp+GUI + MySQL) como en otras modernas (Angular + Firebase o Vue + Supabase).
  • Modelo 3 capas: cliente - servidor - datos -> P.e.: React + Node.js + MySQL
  • Modelo 4 capas: cliente - contenedor web - lógica de negocio - datos -> P.e.: Vue + Spring(API) + Microservicios + PostgreSQL

Patrones de arquitecturas:

Escalabilidad de sistemas:

  • Escalabilidad vertical: Habitualmente, la separación lógica en capas se implementa de tal forma que se permita una separación física de las mismas. Interponiendo elementos conectores que actúen de middlewares es posible distribuir la aplicación de forma vertical (una máquina por cada capa del sistema), e incluso si esto no fuera suficiente, distribuyendo los elementos de una misma capa entre distintas máquinas servidoras.
  • Escalabilidad horizontal: Se trata de clonar el sistema en otra máquina de características similares y balancear la carga de trabajo mediante un dispositivo externo.

Protocolos.

Http

solicitud

  • Es un protocolo de solicitud/respuesta.
  • Un cliente realiza una solicitud similar a MIME (MUltipurpose Internet Mail Extensions), a menudo GET
  • El servidor devuelve el código de estado (éxito-200 o error-otro código) y un mensaje similar a MIME si procede.

HTTP

  • Versiones 1 y 2: conexiones http y https sobre TCP, puertos 80 y 443 respectivamente.
  • http1.1 - RFC2616 - Probablemente, aún el más utilizado.
  • http2.0 - RFC7540 - Mejoras se enfocan en como se empaquetan los datos y en el transporte.

  • Versión 3 http3. SIEMPRE https pero sobre UDP (puerto 443) - Mejoras en la conexión rápida ya que solo la primera conexión requiere el intercambio de mensajes previos para el cifrado.

Más info | MDN

HTTPS

HTTPS-gif

http vs https

Ejercicios

Consultar cabezeras http con curl -I Analizar las respuestas de:

curl -I mail.google.com
curl -I amazon.es
curl -I https://amazon.es
curl -I https://www.amazon.es
curl -I https://www.amazon.com
curl -I https://luiscastelar.duckdns.org/holaMundo.html
curl -I https://luiscastelar.duckdns.org/holaMundo.htm
curl -I https://luiscastelar.duckdns.org/holaMundo.json
curl https://luiscastelar.duckdns.org/holaMundo.json
curl luiscastelar.duckdns.org/holaMundo.json
curl -I luiscastelar.duckdns.org/holaMundo.json
curl -L luiscastelar.duckdns.org/holaMundo.json

curl - ampliado

Prototolo HTTPs

  • SSL
  • TLS
  • Certificados -> Let's encrypt

Criptografía asimétrica

Métodos

  • GET -> obtener
  • POST -> añadir
  • PUT -> modificar (todo el recurso)
  • PATCH -> modificar (parcialmente)
  • DELETE -> borrar
  • Otros... (no nos interesan para nuestro objeto de estudio).

Fuentes: + Métodos MDN + API REST + Qué es una API REST

Juego:

Juega con la API REST de muestra ofrecida por GoREST:

  • GET:
  • Todos: curl https://gorest.co.in/public/v2/users
  • Uno: curl https://gorest.co.in/public/v2/users/2936
  • Para POST, PUT, PATCH y DELETE requerimos autenticarnos y pasarle los datos a cambiar...

El uso de curl con datos:

curl --header "Content-Type: application/json" \
     --request POST \
     --data '{"username":"xyz","password":"xyz"}' \
     http://gorest.co.in/api/login

También podéis usar ReqBin

Códigos de respuesta

Pila TCP/IP

  • Modelo de capas
  • Direccionamiento IP
  • Clases (obsoleto).
  • CIDR (Enrutamiento [interdominio] sin clases).
  • VLSM (Máscara de red de longitud variable).
  • IPs de relevancia:
IPv4 IPv6 Nombre / Significado
0.0.0.0/0 ::/0 wildcard (comodín)
::/128 sin especificar
127.X.X.X/8 ::1/128 loopback (el propio host)
10.X.X.X/8 fc00::/7 Redes priv (con hasta 2^24 - 2 host IPv4)
172.16.X.X/12 Redes priv (con hasta 2^20 - 2 host IPv4)
192.168.X.X/16 Redes priv (con hasta 2^16 - 2 host IPv4)
255.255.255.255/32 -No existe- Difusión
::/96 IPv4 compatible NO usar.
::ffff:0:0/96 IPv4 mapeada
::ffff:0:0:0/96 IPv4 traducida
-------------------- ----------------- -----------------------------------------------
Enlace local No enrutable (sin salida a internet)
-------------------- ----------------- -----------------------------------------------
169.254.X.X/16 fe80::/10 link-local -> no hay DHCP y hay conf dinámica
-------------------- ----------------- -----------------------------------------------
De interés
-------------------- ----------------- -----------------------------------------------
224.0.0.1 ff02::1/128 All nodes (de la red)
224.0.0.2 ff02::2/128 All routers (de la red)
ff0e::1/128 All nodes (de todas las redes)
2001::/32 Túnel Teredo (conexión 6to4)
64:ff9b::/96 prefijo Well-know (IPv4 traducida automática)
192.168.56.X/24 Red NAT de Virtual Box
-------------------- ----------------- -----------------------------------------------
Lista no exhaustiva de ips de relevancia.

Si bien las direcciones link-local no son utilizadas habitualmente en IPv4, todas las interfaces deben disponer OBLIGATORIAMENTE de dirección fe80::/10.

Cheatsheet IPv6

Capa de transporte

TCP vs UDP:

tcp vs udp

Concepto de socket:

IP:Puerto => identificación de un servicio de manera única.

Ejerccios:

Ver sockets activos en el servidor (en equipo Linux): + Equipo propio:

ss -tutapon
netstat -tutapon
lsof -i -P -n

Tanto ss como netstat pueden correrse sin privilegios, pero con privilegios (sudo) nos dará información más detallada, como el nombre de los procesos entre otros.

Donde ss es una utilidad de análisis de sockets que sustituye a netstat en casi todas las distribuciones y lsof lista los “open files”.

  • Otro equipo:
nc -vC IP PUERTO
nmap IP
nmap IP/CIDR

Nota: en ocasiones nos puede ser de gran interés no tener instalado todas las herramientas, p.e. nmap, y aún así podríamos seguir ejecutándolo mediante contenedores docker. Para ello podemos crearnos un alias con alias nmap='docker run --name nmap --rm -it instrumentisto/nmap'.

Donde nc (netcat) es un similar a cat para sockets de red.

Para Windows

Muy presente en aplicaciones .net:

# Información de puestos y conexiones:
netstat -ano
netstat -abno

# Información de rutas:
route print

# Extra: Información sobre los procesos
tasklist /FI "pid eq NUM_PID_DEL_PROCESO" /V /FO List

# Matar procesos
taskkill /F /PID PID_PROCESO
# Información de puestos y conexiones:
Test-NetConnection IP -Port PUERTO

# Información de rutas:
Get-NetRoute

# Extra: Información sobre los procesos
Get-NetTCPConnection -LocalPort PUERTO

# Matar procesos
taskkill /F /PID PID_PROCESO

Tareas:

  1. Dado el mapa de red, asigna direcciones de forma coherente y razonada a TODOS los dispositivos en sus interfaces de capa 3. capas
  2. Obtén las cabeceras de una petición GET a amazon.es pero disfrazando el user-agent para parecer un Firefox versión 105.0.1.
  3. Sobre un entorno linux (virtualizado o no), investiga todas los procesos con referencias a los puertos 67 y 68 y cómo interactúan.

Info: si la máquina está virtualizada, deberá estar conectada directamente a la red lan sin NAT.

P.D.: Un par de párrafos por puerto serán suficientes para demostar que sabes sus funciones.

Forma de entrega: ver moodle

Contenedores:

Introducción a los Contenedores o Virtualización LIGERA:

LXC y LXD:

Linux Containers y Linux Conteiner Daemon son una herramienta de creación de contenedores Linux bajo entornos Linux y una Herramienta de gestión de LXC respectivamente. Esto es, LXD es una abstracción de LXC.

¿Pero que són los LXC?

portada Algo de info

Docker

Al contrario que las anteriores lxd y lxc, docker está orientado que correr un contenedor por cada servicio, mientras que los anteriores lo estaban a emular S.O.s completos.

otra

LXC virtualiza sistemas completos (mismo núcleo que el host) y Docker aplicaciones.

En ocasiones Docker cede el control a aplicaciones sin sistema operativo (a menudo en Rust).

Podman

Es otro motor de contenedores similar a docker pero con interesantes características, por ejemplo:

  • No requiere permisos de root. No hay demonio en segundo plano. Ésto es bueno en torno a seguridad pero requiere que nosotros gestionemos el encendido de los contenedores, por ejemplo con systemd.
  • Pod: En podman tenemos un elemento intermedio llamado Pod que contiene uno o varios contenedores. Todos ellos comparten una misma IP.
  • Nos permite generar un manifiesto de Kubernetes a partir de un Pod creado con sólo podman generate kube {{nombre del pod}} > {{nombre del manifiesto}}.yaml, e incluso correr manifiestos de Kubernetes en un pod.

Fuente: + Pelao Nerd

Kubernetes (K8s, K3s, miniKube)

Es un orquestador de contenedores.

Kubernetes es una plataforma portable y extensible de código abierto para administrar cargas de trabajo y servicios. Kubernetes facilita la automatización y la configuración declarativa. Tiene un ecosistema grande y en rápido crecimiento. El soporte, las herramientas y los servicios para Kubernetes están ampliamente disponibles.

Puedes pensar en Kubernetes como: * una plataforma de contenedores * una plataforma de microservicios * una plataforma portable de nube ...y mucho más.

Kubernetes ofrece un entorno de administración centrado en contenedores. Kubernetes orquesta la infraestructura de cómputo, redes y almacenamiento para que las cargas de trabajo de los usuarios no tengan que hacerlo. Esto ofrece la simplicidad de las Plataformas como Servicio (PaaS) con la flexibilidad de la Infraestructura como Servicio (IaaS) y permite la portabilidad entre proveedores de infraestructura.

otra otra

docker CLI

Introducción a docker cli

Práctica

Deberéis crear un conjunto de microservicios (con docker) compuesto por 3 contenedores:

  • Red interna para la comunicación entre contenedores
  • Microservicio mariaDB no accesible desde el mundo, sólo desde la red interna. Éste debe inicializarse con la creación del usuario pepe y el pass despliegue.
  • Microservicio php-apache que pueda acceder a la bbdd y desde el exterior en el puerto 80. Debe contener un phpinfo() en el archivo info.php de la raíz pública.
  • Microservicio phpMyAdmin que pueda acceder a la bbdd y sea accesible desde el exterior en el puerto 8080 o 443 si lo realizas desde un VPS. \

Nota: para simplificar esta última conexión deberéis pasarle la variable de entorno PMA_HOST=nombre_contenedor_mariaDB`.

Nota 2: El sistema debe ser accesible por cualquiera desde internet (VPS) o ser facilitado en un entorno reproducible (vagrant) con instrucciones claras para su ejecución.

Forma de entrega: moodle.

docker compose

Introducción a docker compose

Práctica

Transformar la práctica anterior (mariaDB+php-apache+phpMyAdmin) en un compose funcional.

Para aumentar la seguridad le pasaremos toda la información sensible como parámentros a través del archivo de secretos .env.

Recuerda:

Deberéis crear un conjunto de microservicios (con docker) compuesto por 3 contenedores:

  • Red interna para la comunicación entre contenedores
  • Microservicio mariaDB no accesible desde el mundo, sólo desde la red interna. Éste debe inicializarse con la creación del usuario pepey el pass despliegue.
  • Microservicio php-apache que pueda acceder a la bbdd y desde el exterior en el puerto 80. Debe contener un phpinfo() en el archivo info.php de la raíz púbilica.
  • Microservicio phpMyAdminque pueda accedar a la bbdd y sea accesible desde el exterior en el puerto 8080 o 443 si lo realizas desde un VPS.

Nota: para simplificar esta última conexión deberéis pasarle la variable de entorno PMA_HOST=nombre_contenedor_mariaDB.

Nota: El sistema debe ser accesible por cualquiera desde internet (VPS) o ser facilitado en un entorno reproducible (vagrant) con instrucciones claras para su ejecución.

Forma de entrega: moodle

Dockerfile

Introducción a Dockerfile

Servidor web:

En términos sencillos, un servidor web es un ordenador que almacena, procesa y entrega archivos de sitios web a los usuarios desde un navegador.

Los servidores web están formados por hardware y software que utilizan el Protocolo de Transferencia de Hipertexto (HTTP) para responder a las peticiones de los usuarios de la web realizadas a través de la World Wide Web.

Fuente: Hostinger

De forma general un servidor web recibe en interpreta las peticiones http o https de una URL, tomando éstas la siguiente forma: partes de url Fuente: edytapukocz.com

Y más genérico aún: manz

Lo veremos ampliamente en UT3.

Servidor de aplicaciones (UT4).

En informática, se denomina servidor de aplicaciones a un servidor en una red de computadores que ejecuta ciertas aplicaciones.

Usualmente se trata de un dispositivo de software que proporciona servicios de aplicación a las computadoras cliente. Un servidor de aplicaciones generalmente gestiona la mayor parte (o la totalidad) de las funciones de lógica de negociación y de acceso a los datos de las aplicaciones. Los principales beneficios de la aplicación de la tecnología de servidores de aplicación son la centralización y la disminución de la complejidad en el desarrollo de aplicaciones.

Fuente: Wikipedia

Nosotros nos centraremos en el contenedor de aplicaciones Tomcat que ejecuta aplicaciones Jakarta EE (antes Java EE) con base en el lenguaje Java.

Lo veremos ampliamente en UT4.

Servidores en la nube (vps).

vps profesor Raul

Fuente: profesor Raúl

Para el trabajo en clase utilizaremos un servidor vps basado en los siguientes proveedores:

Se reseñan los 2 primeros dado que nuestra organización @iescastelar.com tiene cuenta educativa con ellos y podéis generar instancias de máquinas virtuales de forma gratuita (con algunas limitaciones) sin proporcionar tarjetas de crédito.

Algunos otros proveedores como Oracle o AWS también ofrecen instancias gratuitas (fuera de España) pero requieren proporcionar tarjetas de crédito/débito (no prepago).

La ventaja de realizarlo sin cuenta educativa es que será permanente ya que no requiere que renovéis anualmente.

AWS Academy

La AWS Academy nos proporciona Learning Labs con:

  • una duración de 6 meses
  • sesiones de 4 horas
  • hasta $50 para gastar en extras NO gratuitos
  • Instancias EC2 micro y small gratuitas (no consumen crédito) si tienen hasta 30GB de persistencia compartida (entre todas las instancias).
  • Intraestructura de red VPC virtual

Pasos:

  1. Alta en la clase en AWS Academy
  2. Creación de pares de llaves
  3. Lanzar laboratorio (Asignatura-Contenido-Lanzar Learning Lab)
  4. Creación de una instancia EC2
  5. Conexión a la instancia vía SSH (con Private Key pem)
  6. Instalación de docker
  7. Prueba con curl localhost
  8. Prueba desde el exterior... ¿porqué no funciona? => Firewall (security groups)

Security group (firewall)

Por regla general queremos sólo tocar las reglas de entrada, dejando todo abierto de salida.

Las reglas tienen “tipo”, “protocolo”, “rango de puertos”, “fuente de peticiones” y “descripción”.

Algunos servicios como “HTTP” tienen su configuración predefinida HTTP, -, -, 0.0.0.0/0, comentario.

Podría ser interesante crear un segundo servicio para fuentes concretas, por ejemplo Custom TCP, TCP, 8080, 17.17.17.0/24, web intranet, que dejaría pasar cualquier petición proveniente de la red 17.17.17.0/24 sea aceptado en ese puerto.

DNS y HTTPs

Frontend DNS TLS para nuestros servicios (ver completo)

Otros servidores de despliegue:

Con opciones gratis:

  • Free-for.dev: recopilatorio completo de servicios gratuitos para desarrolladores.
  • Render
  • backend: python, nodeJs
  • frontend: ¿todos?
  • db: PostgreSQL, Redis, MySQL
  • docker
  • ¿sin VPS?
  • Google Cloud (VPS e2-micro + otros + $300/90d)

Low-cost Hay muchos proveedores de VPS por 1€/mes.

Con crédito gratis:

Referencias Free-Hosting

“Ampliando” la RAM con Swap

Dado que las instancias suelen venir muy limitadas de RAM, pero con discos de velocidad decentes, lo que podemos hacer es crear un archivo de swap que permita simular una RAM mayor.

Pasos:

Crear el script swap_on.sh:

#!/bin/bash
if [[ $# -gt 0 ]]; then MEM=$1; else MEM=4; fi

free -h
sudo swapon --show
sudo fallocate -l ${MEM}G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
sleep 5
free -h
echo "$(whoami) $(date)" >> ~/swap_on.log

El script lo podemos llamar al iniciar la máquina pasándole la cantidad de GB deseados o por defecto 4, p.e.swap_on.sh 2 -> aportará 2GB de swap.

También podemos ser mas finos y lanzarlo como un servicio de inicio con systemd:

  1. Crear el timer en /etc/systemd/system/crearSwap.timer:

     
        [Unit]
        Description= Timer para swap
    
        [Timer]
        Unit=crearSwap.service
        #OnBootSec=5min
        OnBootSec=30sec
    
        [Install]
        WantedBy=timers.target
       

  2. Crear el servicio en /etc/systemd/system/crearSwap.service:

    
        [Unit]
        Description= Servicio para crear Swap
    
        [Service]
        Type=simple
        ExecStart=/path/completo/swap_on.sh
       

  3. Habilitar servicio en el arranque: systemctl enable crearSwap

Sustituye /path/completo por lo que corresponda.


Notas al pie

Nota1

Servicios AWS a utilizar:

Nota2

Azure: Para crear un vps (12 meses gratis) en Azure deberemos seguir los siguientes pasos:

  1. Ir a https://azureforeducation.microsoft.com/devtools
  2. Crear cuenta @outlook.com
  3. Iniciar con ella
  4. Activar M-Autenticator, G-Autenticator o similar
  5. Cuando te diga que no hay acceso -> si que lo hay pero en https://portal.azure.com