T2. Implantación de arquitecturas web¶
Bases del despliegue.¶
Arquitecturas web:¶
Modelos de 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:¶
- MVC - Modelo-Vista-Controlador
- MVVM - Modelo-Vista-VistaModelo
- BFF - BackendForFrontend
- MVT - Modelo-Vista-Template habitual en frameworks como DJango
- Modelos según stack tecnológico
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¶
![]()
- 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.

- 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.
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
Prototolo HTTPs¶
- SSL
- TLS
- Certificados -> Let's encrypt
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.
Capa de transporte¶
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
sscomonetstatpueden 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 contenedoresdocker. Para ello podemos crearnos un alias conalias 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:¶
- Dado el mapa de red, asigna direcciones de forma coherente y razonada a TODOS los dispositivos en sus interfaces de capa 3.

- 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.
- 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?
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.

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.

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
mariaDBno accesible desde el mundo, sólo desde la red interna. Éste debe inicializarse con la creación del usuariopepey el passdespliegue. - Microservicio
php-apacheque pueda acceder a la bbdd y desde el exterior en el puerto 80. Debe contener unphpinfo()en el archivoinfo.phpde la raíz pública. - Microservicio
phpMyAdminque 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¶
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
mariaDBno accesible desde el mundo, sólo desde la red interna. Éste debe inicializarse con la creación del usuariopepey el passdespliegue.- Microservicio
php-apacheque pueda acceder a la bbdd y desde el exterior en el puerto 80. Debe contener unphpinfo()en el archivoinfo.phpde 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¶
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:
Fuente: edytapukocz.com
Y más genérico aún:

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).¶

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
VPCvirtual
Pasos:
- Alta en la clase en AWS Academy
- Creación de pares de llaves
- Lanzar laboratorio (Asignatura-Contenido-Lanzar
Learning Lab) - Creación de una instancia EC2
- Conexión a la instancia vía SSH (con Private Key
pem) - Instalación de docker
- Prueba con
curl localhost - 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.
- PiensaSOLUTIONS (VPS desde 1€/mes)
Con crédito gratis:
- DigitalOcean ($200/60d)
- IBM Cloud (VPS 30 días + otros Always Free)
“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:
-
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 -
Crear el servicio en
/etc/systemd/system/crearSwap.service:
[Unit] Description= Servicio para crear Swap [Service] Type=simple ExecStart=/path/completo/swap_on.sh -
Habilitar servicio en el arranque:
systemctl enable crearSwap
Sustituye /path/completo por lo que corresponda.
Notas al pie¶
Nota1¶
Servicios AWS a utilizar:
- Opción AWS Academy ($50 de saldo)
- Opción generales (para el PFC):
- VPS - ec2: nos ofrecen 750 horas/mes gratuitas durante 12 meses.
- Disco - s3: almacenamiento 5GB (para imágenes y similares).
- DB - rds: mysql/mariaDB, postgreSQL, ...
Nota2¶
Azure: Para crear un vps (12 meses gratis) en Azure deberemos seguir los siguientes pasos:
- Ir a https://azureforeducation.microsoft.com/devtools
- Crear cuenta @outlook.com
- Iniciar con ella
- Activar M-Autenticator, G-Autenticator o similar
- Cuando te diga que no hay acceso -> si que lo hay pero en https://portal.azure.com