Apuntes DAM
Tema 3 de 7DAW · 2º DAW

Despliegue de Aplicaciones Web

Servidores de Aplicaciones

Tomcat y los WAR, PHP-FPM, Node.js y Spring Boot como servicios de systemd, proxy inverso, configuración con variables de entorno y estrategias de despliegue: rolling, blue-green y canary.

50 min lecturaIntermedio

1. El servidor que ejecuta tu código

El servidor web sabe servir ficheros, pero no sabe ejecutar PHP, Java o JavaScript. De eso se encarga el servidor de aplicaciones (o el entorno de ejecución del lenguaje): mantiene tu aplicación cargada, atiende las peticiones que le pasa el servidor web, gestiona conexiones con la base de datos y escribe sus propios registros. Desplegar una aplicación consiste, en el fondo, en poner el código correcto en este servidor, con la configuración correcta, y reiniciarlo sin que los usuarios lo noten.

Servidor web y servidor de aplicaciones

El servidor web es el portero
Recibe a todos, atiende lo sencillo (ficheros) y acompaña lo demás adentro.
El de aplicaciones es el especialista
Solo atiende lo que requiere pensar: ejecutar el código y hablar con la base de datos.
El proxy inverso los une
El portero habla con el especialista por un puerto interno o un socket que nadie más ve.
LenguajeServidor de aplicacionesCómo se despliega
JavaTomcat, Jetty, WildFly; o Spring Boot con Tomcat embebidoUn fichero .war en Tomcat, o un .jar ejecutable
PHPPHP-FPMCopiar el código y ejecutar composer install --no-dev
Node.jsEl propio proceso de Node, vigilado por systemd o PM2npm ci --omit=dev y reiniciar el proceso
PythonGunicorn o UvicornEntorno virtual con las dependencias y reiniciar el servicio

2. Tomcat y las aplicaciones Java

Tomcat es el contenedor de servlets más usado. Una aplicación web Java se empaqueta en un fichero WAR (Web ARchive), un ZIP con una estructura fija: las páginas y recursos en la raíz, y dentro de WEB-INF las clases compiladas, las librerías y el descriptor web.xml. Al copiar tienda.war en la carpeta webapps, Tomcat lo despliega automáticamente y la aplicación queda en http://servidor:8080/tienda.

Carpeta o ficheroContenido
conf/server.xmlConectores (puertos 8080, 8443), hosts y opciones globales
conf/tomcat-users.xmlUsuarios y roles, por ejemplo para la aplicación Manager
webapps/Aplicaciones desplegadas (cada WAR se descomprime en su carpeta)
logs/catalina.out y los registros de acceso
bin/Scripts de arranque y parada; setenv.sh para memoria y variables

La aplicación Manager permite desplegar, parar y recargar aplicaciones desde el navegador o con Maven, pero es una puerta de entrada muy atacada: si la activas, protégela con un usuario fuerte y limítala a tu IP. En producción, Tomcat no se expone directamente: se coloca detrás de Nginx o Apache, que se encarga de HTTPS.

bash
1# Empaquetar y desplegar una aplicación Java
2mvn clean package                          # genera target/tienda.war
3sudo cp target/tienda.war /opt/tomcat/webapps/
4sudo tail -f /opt/tomcat/logs/catalina.out # comprueba que arranca sin errores
5
6# Spring Boot: un .jar con el servidor dentro
7java -jar target/tienda.jar --server.port=8080 --spring.profiles.active=prod
Desplegar archivo war en Apache Tomcat — Boorolex

3. Mantener la aplicación en marcha

Una aplicación de Node.js o un .jar de Spring Boot son procesos normales: si los arrancas en una terminal y la cierras, se paran, y si fallan a las tres de la mañana nadie los vuelve a levantar. En Linux, la forma estándar de convertirlos en un servicio es systemd: lo arranca al iniciar el sistema, lo reinicia si se cae y guarda su salida en el diario del sistema.

/etc/systemd/system/tienda.service
1[Unit]
2Description=API de la tienda
3After=network.target
4
5[Service]
6User=tienda                              ; nunca como root
7WorkingDirectory=/srv/tienda
8EnvironmentFile=/srv/tienda/.env         ; configuración y secretos, fuera del código
9ExecStart=/usr/bin/node server.js
10Restart=on-failure
11RestartSec=5
12
13[Install]
14WantedBy=multi-user.target
bash
1sudo systemctl daemon-reload
2sudo systemctl enable --now tienda      # arrancar ahora y en cada inicio
3systemctl status tienda
4journalctl -u tienda -f                 # ver sus registros en directo

El proxy inverso

La aplicación escucha en un puerto interno (3000, 8080) al que no se puede acceder desde fuera, y Nginx le pasa las peticiones. Así Nginx se ocupa de HTTPS, de la compresión y de los estáticos, y la aplicación puede reiniciarse o cambiarse sin tocar la configuración pública. Las cabeceras X-Forwarded-* le cuentan a la aplicación la IP real del cliente y si la petición original venía por HTTPS.

nginx
1location / {
2    proxy_pass http://127.0.0.1:3000;
3    proxy_set_header Host $host;
4    proxy_set_header X-Real-IP $remote_addr;
5    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
6    proxy_set_header X-Forwarded-Proto $scheme;
7}

4. Configuración y despliegues sin sustos

Una misma versión del código debe poder ejecutarse en desarrollo, en pruebas y en producción cambiando solo la configuración: la cadena de conexión, las claves de las APIs, el nivel de registro. Esa configuración vive en variables de entorno (o en un fichero .env fuera del repositorio), nunca en el código. Es uno de los principios de las aplicaciones twelve-factor, una guía muy influyente sobre cómo construir aplicaciones fáciles de desplegar.

  • Construye una vez, despliega muchas: el mismo artefacto (WAR, imagen Docker) pasa por pruebas y llega a producción; no se recompila por el camino.
  • Comprobación de salud: una ruta como /salud que diga si la aplicación y su base de datos responden, para que el balanceador y la monitorización lo sepan.
  • Migraciones de base de datos automatizadas y compatibles con la versión anterior durante el cambio.
  • Poder volver atrás: conservar la versión anterior para restaurarla en un minuto si algo falla.
EstrategiaCómo funcionaVentaja
Parar y actualizarSe para, se copia la versión nueva y se arrancaSimple, pero hay un corte de servicio
RollingSe actualizan los servidores de uno en uno detrás del balanceadorSin corte, sin duplicar recursos
Blue-greenSe prepara un entorno nuevo completo y se cambia el tráfico de golpeVuelta atrás instantánea
CanaryLa versión nueva recibe primero un pequeño porcentaje del tráficoDetecta errores afectando a pocos usuarios

Despliegue atómico con enlaces simbólicos

Un truco clásico en servidores PHP: cada versión se copia en su propia carpeta (releases/2025-09-30-1) y la carpeta pública es un enlace simbólico current. Cambiar el enlace es instantáneo, y volver atrás es apuntarlo a la versión anterior. Herramientas como Deployer automatizan exactamente esto.

5. Reto

La monitorización empieza por algo tan sencillo como clasificar el resultado de las comprobaciones de salud de cada servicio y resumir el estado general del sistema.

  1. Lee cada comprobación: nombre, código HTTP y tiempo de respuesta.
  2. Clasifica cada servicio y lleva la cuenta de los problemas.
  3. Decide el estado general, de peor a mejor.

Retos de Bash en el IDE

Escribe el script y pulsa Ejecutar tests: se ejecuta en un Linux real con Bash y se prueba con varios casos, algunos ocultos.

🖥️BashEstado de los serviciosMedio

Cada línea es el resultado de comprobar un servicio: «nombre código_http milisegundos». Clasifica cada uno como «OK» (200 y menos de 500 ms), «LENTO» (200 y 500 ms o más) o «CAÍDO» (cualquier otro código), con el formato «nombre: ESTADO». Al final, «Estado general: OK», «DEGRADADO» (si hay alguno lento y ninguno caído) o «CAÍDO» (si hay alguno caído).

⏳
Todo bien
⏳
Uno lento
⏳
Uno caído
⏳
Test oculto #4
0/4 tests pasados

¿Has terminado este tema?

Crea una cuenta gratis para guardar qué temas has terminado, subir de nivel y ganar medallas.

Guardar mi progreso