1.bc.1 - Funcionamiento de los Servidores Web

Objetivo

Comprender la función de un servidor web, analizar cómo recibe y procesa las peticiones HTTP e identificar los principales mecanismos utilizados para ejecutar código en el servidor e integrar lenguajes de programación con servidores web.

Indicadores de Logro

  1. 1.b - Reconocer las ventajas que proporciona la generación dinámica de páginas.
  2. 1.c - Identificar los mecanismos de ejecución de código en los servidores web.

1. Contenidos

1.1 Función del servidor web

Un servidor web es un programa que permanece a la espera de peticiones realizadas por clientes, normalmente navegadores, y devuelve una respuesta HTTP. El término también puede utilizarse para referirse al equipo físico o virtual donde se ejecuta ese programa, pero en esta unidad nos referiremos principalmente al software.

Su función básica puede resumirse así:


Cliente                         Servidor web
(Navegador)                     (Apache, Nginx...)
     |                                |
     | ------- Petición HTTP -------> |
     |                                |
     |        procesa petición        |
     |                                |
     | <------ Respuesta HTTP ------- |
     |                                |
				

Un servidor web puede realizar, entre otras, las siguientes tareas:

  • Escuchar conexiones en uno o varios puertos, normalmente 80 para HTTP y 443 para HTTPS.
  • Recibir y analizar peticiones HTTP.
  • Localizar y entregar recursos estáticos, como archivos HTML, CSS, JavaScript o imágenes.
  • Delegar la ejecución de contenido dinámico a un lenguaje, intérprete, proceso o servidor de aplicaciones.
  • Aplicar reglas de configuración: redirecciones, permisos, autenticación, compresión, caché, etc.
  • Gestionar conexiones seguras mediante HTTPS.
  • Registrar la actividad mediante archivos de log.

Importante: un servidor web no es necesariamente el programa que ejecuta el código de nuestra aplicación. Puede limitarse a recibir la petición y delegarla a otro componente.

1.2 Recepción y procesamiento de peticiones

Cuando escribimos una dirección en el navegador, este construye una petición HTTP y la envía al servidor correspondiente. El servidor debe decidir qué hacer con esa petición y construir una respuesta.

Ejemplo de petición


GET /productos.php?id=25 HTTP/1.1
Host: www.ejemplo.com
User-Agent: Mozilla/5.0
Accept: text/html
				

En esta petición podemos reconocer:

  • GET: método HTTP utilizado.
  • /productos.php?id=25: recurso solicitado y datos enviados en la URL.
  • Host: servidor al que va dirigida la petición.
  • Las líneas siguientes son cabeceras HTTP con información adicional.

Proceso simplificado

  1. El servidor web acepta la conexión.
  2. Lee el método, la URL, las cabeceras y, si existe, el cuerpo de la petición.
  3. Determina qué sitio o aplicación debe atenderla.
  4. Decide cómo obtener la respuesta: leyendo un archivo o ejecutando/delegando código.
  5. Construye una respuesta con un código de estado, cabeceras y, normalmente, un cuerpo.
  6. Envía la respuesta al cliente.

Ejemplo de respuesta


HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8

<!DOCTYPE html>
<html>
    <body>
        <h1>Producto 25</h1>
    </body>
</html>
				

Algunos códigos de estado frecuentes son:

CódigoSignificadoEjemplo
200Petición correctaEl recurso se ha encontrado y se devuelve.
301 / 302RedirecciónEl cliente debe solicitar otra URL.
403Acceso prohibidoEl recurso existe, pero no se permite el acceso.
404No encontradoEl recurso solicitado no existe.
500Error internoSe ha producido un error durante el procesamiento.

Recuerda: HTTP funciona mediante un intercambio de petición → procesamiento → respuesta. El navegador no necesita conocer cómo se ha generado internamente la respuesta.

1.3 Modelos de ejecución de código

Cuando el recurso solicitado contiene código de servidor, el servidor web necesita un mecanismo para ejecutarlo o para entregar la petición a otro programa que pueda hacerlo.

1.3.1 Módulo integrado en el servidor web

El intérprete o soporte del lenguaje se carga como un módulo del propio servidor web. El servidor puede ejecutar el código sin iniciar un programa independiente para cada petición.


Navegador
    |
    | petición .php
    v
Apache HTTP Server
    |
    |-- módulo PHP integrado
    |        |
    |        +--> ejecuta PHP
    |
    +--> devuelve HTML
				

Un ejemplo clásico es Apache utilizando PHP como módulo (mod_php).

  • Ventaja: integración directa y configuración conceptualmente sencilla.
  • Limitación: el lenguaje queda estrechamente ligado al proceso y al modelo de ejecución del servidor web.

1.3.2 Intérprete ejecutado mediante CGI

CGI (Common Gateway Interface) define una forma de comunicación entre el servidor web y un programa externo. En el modelo CGI tradicional, el servidor inicia un proceso para ejecutar el programa que atenderá la petición.


Navegador
    |
    v
Servidor web
    |
    +----> inicia intérprete/programa CGI
                 |
                 +----> ejecuta código
                 |
                 +----> genera respuesta
    |
    v
Navegador
				
  • Ventaja: permite utilizar programas externos escritos en distintos lenguajes.
  • Limitación: crear un nuevo proceso para muchas peticiones puede resultar costoso.

1.3.3 Procesos externos persistentes: FastCGI

FastCGI mejora la idea de CGI manteniendo procesos preparados para atender múltiples peticiones. El servidor web envía las peticiones a esos procesos en lugar de crear uno nuevo cada vez.

En PHP es habitual utilizar PHP-FPM (FastCGI Process Manager), que mantiene un conjunto o pool de procesos PHP disponibles.


                    +----------------------+
                    |      PHP-FPM         |
                    |                      |
                    |  PHP   PHP   PHP     |
                    |  proc. proc. proc.   |
                    +----------^-----------+
                               |
                               | FastCGI
                               |
Navegador ----HTTP----> Nginx / Apache
    ^                          |
    |                          |
    +--------- HTML -----------+
				
  • Ventaja: los procesos se reutilizan y el servidor web queda separado del intérprete.
  • Ventaja: permite gestionar de forma independiente cuántos procesos del lenguaje se mantienen activos.
  • Ejemplo: Nginx + PHP-FPM.

1.3.4 Aplicación o servidor externo mediante proxy

Muchas aplicaciones modernas incorporan su propio servidor HTTP o se ejecutan en un servidor de aplicaciones. En ese caso, el servidor web frontal actúa como proxy inverso: recibe la petición del cliente y la reenvía a la aplicación.


Cliente
   |
   | HTTPS
   v
Nginx / Apache / Caddy
   |
   | petición interna
   v
Aplicación
(Node.js, Spring Boot, Django,
 ASP.NET Core, etc.)
   |
   | respuesta
   v
Servidor web
   |
   v
Cliente
				

No confundas: PHP es un lenguaje y necesita un motor que ejecute su código; Apache o Nginx son servidores web. Un servidor web puede ejecutar o delegar el código utilizando diferentes mecanismos.

1.4 Integración entre servidores web y lenguajes de programación

La integración consiste en establecer cómo pasa una petición desde el servidor web hasta el código de la aplicación y cómo vuelve la respuesta. Esta integración depende del servidor y de la tecnología utilizada.

Ejemplo: Apache y PHP mediante módulo


Petición → Apache → módulo PHP → ejecución PHP → HTML → Apache → Cliente
				

Ejemplo: Nginx y PHP-FPM


Petición → Nginx → FastCGI → PHP-FPM → ejecución PHP
                                   |
Cliente  ← Nginx ←----- HTML ------+
				

Una configuración simplificada de Nginx puede contener una regla similar a esta:


location ~ \.php$ {
    include fastcgi_params;
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
				

La directiva fastcgi_pass indica que las peticiones correspondientes a PHP se enviarán a un servidor FastCGI, por ejemplo PHP-FPM.

Ejemplo: servidor web como proxy inverso

Supongamos que una aplicación se ejecuta en el puerto 3000. El servidor web puede aceptar las conexiones públicas y reenviarlas a esa aplicación.


location / {
    proxy_pass http://127.0.0.1:3000;
}
				

Esta separación permite que el servidor web se ocupe de tareas como HTTPS, archivos estáticos o redirecciones, mientras la aplicación se concentra en la lógica de negocio.

Comparación de mecanismos

ModeloCómo se ejecutaEjemploCaracterística principal
MóduloEl soporte del lenguaje está integrado en el servidor web.Apache + mod_phpIntegración directa.
CGIEl servidor ejecuta un programa externo para procesar la petición.Script CGIModelo sencillo, pero con coste de creación de procesos.
FastCGIProcesos externos persistentes atienden varias peticiones.Nginx + PHP-FPMSepara servidor e intérprete.
Proxy inversoEl servidor reenvía la petición a otra aplicación o servidor.Nginx → Node.js / Spring BootDesacopla servidor web y aplicación.

1.5 Principales servidores web actuales

Existen numerosos servidores web. Los siguientes representan soluciones relevantes que permiten comprender los modelos de despliegue que encontraremos actualmente.

Apache HTTP Server

Apache HTTP Server es un servidor web libre y de código abierto desarrollado por la Apache Software Foundation. Su arquitectura es modular: numerosas funcionalidades se incorporan mediante módulos.

  • Disponible en distintos sistemas operativos.
  • Arquitectura extensible mediante módulos.
  • Puede servir contenido estático, actuar como proxy y trabajar con distintas tecnologías de servidor.
  • Es especialmente relevante para aprender PHP por su larga integración con este lenguaje.

Nginx

Nginx es un servidor HTTP que también puede actuar como proxy inverso y balanceador. Para ejecutar PHP suele enviar las peticiones a un servidor FastCGI como PHP-FPM.

  • Servidor web y proxy inverso.
  • Puede servir directamente recursos estáticos.
  • Integra aplicaciones mediante FastCGI, proxy HTTP y otros protocolos.

Microsoft Internet Information Services (IIS)

IIS es el servidor web de Microsoft para Windows y Windows Server. Se integra especialmente con el ecosistema .NET y ASP.NET Core mediante módulos específicos de IIS.

LiteSpeed y OpenLiteSpeed

LiteSpeed Web Server y su alternativa de código abierto OpenLiteSpeed son servidores orientados al alojamiento web y permiten integrar aplicaciones PHP mediante mecanismos como LSAPI, CGI y FastCGI.

Caddy

Caddy es un servidor web y proxy extensible escrito en Go. Destaca por automatizar la configuración de HTTPS y puede integrarse con PHP-FPM o actuar como proxy inverso hacia otras aplicaciones.

Tabla resumen

ServidorCaracterística destacadaEjemplo de integración
Apache HTTP ServerArquitectura modular y gran capacidad de configuración.Módulo, FastCGI o proxy.
NginxServidor HTTP y proxy inverso.PHP-FPM mediante FastCGI.
IISIntegración con Windows y .NET.ASP.NET Core Module.
LiteSpeed / OpenLiteSpeedOrientado a alojamiento web y aplicaciones dinámicas.LSAPI, CGI o FastCGI.
CaddyHTTPS automático y configuración sencilla.PHP-FPM o proxy inverso.

Idea clave: elegir un servidor web no determina necesariamente el lenguaje de programación. Lo importante es que exista un mecanismo adecuado para integrar el servidor con la aplicación.

2. Ejercicios

2.1 El viaje de una petición (Nivel básico)

Un usuario escribe en su navegador la siguiente dirección:


https://tienda.ejemplo.com/producto.php?id=42
				

La aplicación utiliza Nginx como servidor web y PHP-FPM para ejecutar PHP. Explica el recorrido completo de la petición utilizando los siguientes elementos:

  • Navegador.
  • Petición HTTP.
  • Nginx.
  • PHP-FPM.
  • Archivo producto.php.
  • HTML generado.
  • Respuesta HTTP.

Realiza las siguientes tareas:

  1. Dibuja un diagrama indicando el orden de intervención de cada elemento.
  2. Indica qué componente recibe inicialmente la petición del navegador.
  3. Explica por qué Nginx necesita comunicarse con PHP-FPM.
  4. Indica si el navegador recibe el contenido de producto.php o el resultado de su ejecución.
  5. Indica qué ocurriría si el archivo solicitado no existiera.

2.2 Identifica el modelo de ejecución (Nivel intermedio)

Para cada una de las siguientes arquitecturas, indica si corresponde principalmente a módulo integrado, CGI, FastCGI o proxy inverso. Justifica brevemente cada respuesta.

  1. Apache recibe una petición PHP y ejecuta el código mediante un módulo PHP cargado en el propio servidor.
  2. Nginx recibe una petición a /index.php y la envía a un conjunto de procesos PHP-FPM que permanecen activos.
  3. Un servidor web inicia un programa externo para procesar cada petición recibida.
  4. Caddy recibe una petición HTTPS y la reenvía a una aplicación que está escuchando en localhost:8080.
  5. IIS recibe una petición y la entrega a una aplicación ASP.NET Core mediante su módulo de integración.

Después, responde:

  • ¿Qué diferencia fundamental existe entre CGI tradicional y FastCGI?
  • ¿Qué ventaja aporta separar el servidor web del proceso que ejecuta la aplicación?
  • ¿Qué modelos permiten que el lenguaje o la aplicación se ejecute en procesos independientes del servidor web?

2.3 Diseña una arquitectura sencilla (Nivel aplicado)

Una pequeña empresa quiere publicar una aplicación web formada por:

  • Archivos HTML, CSS, JavaScript e imágenes.
  • Una aplicación PHP que genera páginas dinámicas.
  • Acceso público mediante HTTPS.

Propón una arquitectura utilizando uno de los servidores estudiados y responde:

  1. ¿Qué servidor web utilizarías?
  2. ¿Qué recursos podría entregar directamente el servidor web?
  3. ¿Cómo integrarías PHP: módulo, CGI, FastCGI u otro mecanismo?
  4. Dibuja el flujo de una petición a /index.php.
  5. Dibuja el flujo de una petición a /css/estilos.css y explica por qué no necesita ejecutar PHP.
  6. Justifica tu elección en un máximo de cinco líneas.

3. Bibliografía