




Un servidor web es un software que acepta solicitudes mediante HTTP (el protocolo de red creado para distribuir contenido web ) o su variante segura HTTPS . Un agente de usuario, generalmente un navegador web o un rastreador web , inicia la comunicación solicitando una página web u otro recurso mediante HTTP, y el servidor responde con el contenido de dicho recurso o un mensaje de error . Un servidor web también puede aceptar y almacenar recursos enviados por el agente de usuario si está configurado para ello. [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ]
El hardware utilizado para ejecutar un servidor web puede variar según el volumen de solicitudes que deba gestionar. En el extremo inferior del rango se encuentran los sistemas embebidos , como un enrutador que ejecuta un pequeño servidor web como interfaz de configuración. Un sitio web con mucho tráfico podría gestionar las solicitudes con cientos de servidores que se ejecutan en racks de computadoras de alta velocidad. [ 6 ]
Un recurso enviado desde un servidor web puede ser un archivo preexistente ( contenido estático ) disponible para el servidor, o puede generarse en el momento de la solicitud ( contenido dinámico ) mediante otro programa que se comunica con el software del servidor. El primero suele ser más rápido y se puede almacenar en caché con mayor facilidad para solicitudes repetidas, mientras que el segundo admite una gama más amplia de aplicaciones.
Tecnologías como REST y SOAP , que utilizan HTTP como base para la comunicación general entre ordenadores, así como la compatibilidad con las extensiones WebDAV , han extendido la aplicación de los servidores web mucho más allá de su propósito original de servir páginas legibles por humanos.
Historia

Esta es una breve historia de los programas de servidor web , por lo que cierta información se superpone necesariamente con las historias de los navegadores web , la World Wide Web e Internet ; por lo tanto, en aras de la claridad y la comprensión, cierta información histórica clave que se presenta a continuación puede ser similar a la que se encuentra también en uno o más de los artículos históricos mencionados anteriormente. [ 7 ]
Proyecto inicial de la WWW (1989–1991)
En marzo de 1989, Sir Tim Berners-Lee propuso un nuevo proyecto a su empleador, el CERN , con el objetivo de facilitar el intercambio de información entre científicos mediante un sistema de hipertexto . La propuesta, titulada «Hipertexto y CERN» , solicitaba comentarios y fue leída por varias personas. En octubre de 1990, la propuesta fue reformulada y ampliada (con Robert Cailliau como coautor ) y, finalmente, fue aprobada. [ 8 ] [ 9 ] [ 10 ]
Entre finales de 1990 y principios de 1991, el proyecto dio como resultado que Berners-Lee y sus desarrolladores escribieran y probaran varias bibliotecas de software junto con tres programas, que inicialmente se ejecutaban en NeXTSTEP OS instalado en estaciones de trabajo NeXT : [ 11 ] [ 12 ] [ 10 ]
- un navegador web gráfico , llamado WorldWideWeb ;
- un navegador web portátil en modo línea ;
- un servidor web, posteriormente conocido como CERN httpd .
Esos primeros navegadores recuperaban páginas web escritas en una forma simple y primitiva de HTML desde servidores web utilizando un nuevo protocolo de comunicación básico que se denominó HTTP 0.9 .
En agosto de 1991, Tim Berners-Lee anunció el nacimiento de la tecnología WWW y animó a los científicos a adoptarla y desarrollarla. [ 13 ] Poco después, esos programas, junto con su código fuente , se pusieron a disposición de las personas interesadas en su uso. [ 11 ] Aunque el código fuente no fue licenciado formalmente ni puesto en el dominio público, el CERN permitió informalmente a usuarios y desarrolladores experimentar y seguir desarrollándolo. Berners-Lee comenzó a promover la adopción y el uso de esos programas, así como su adaptación a otros sistemas operativos . [ 10 ]
Desarrollo rápido y vertiginoso (1991-1995)
En diciembre de 1991, se instaló el primer servidor web fuera de Europa en SLAC (EE. UU.). [ 12 ] Este fue un acontecimiento muy importante porque dio inicio a las comunicaciones web transcontinentales entre navegadores web y servidores web.
Entre 1991 y 1993, el programa de servidor web del CERN continuó siendo desarrollado activamente por el grupo www; mientras tanto, gracias a la disponibilidad de su código fuente y a las especificaciones públicas del protocolo HTTP, comenzaron a desarrollarse muchas otras implementaciones de servidores web.
En abril de 1993, el CERN emitió una declaración oficial pública en la que afirmaba que los tres componentes del software web (el cliente básico en modo línea, el servidor web y la biblioteca de código común), junto con su código fuente , pasaban a ser de dominio público . [ 14 ] Esta declaración eximió a los desarrolladores de servidores web de cualquier posible problema legal relacionado con el desarrollo de obras derivadas basadas en ese código fuente (una amenaza que, en la práctica, nunca existió).
A principios de 1994, el servidor web más destacado entre los nuevos era NCSA httpd, que funcionaba en diversos sistemas operativos basados en Unix y podía servir contenido generado dinámicamente mediante la implementación del POSTmétodo HTTP y CGI para comunicarse con programas externos. Estas capacidades, junto con las funciones multimedia del navegador Mosaic de NCSA (que también podía gestionar formularios HTML para enviar datos a un servidor web), pusieron de manifiesto el potencial de la tecnología web para la publicación y las aplicaciones de computación distribuida .
En la segunda mitad de 1994, el desarrollo de NCSA httpd se estancó hasta tal punto que un grupo de desarrolladores de software externos, webmasters y otras figuras profesionales interesadas en ese servidor, comenzaron a escribir y recopilar parches gracias a que el código fuente de NCSA httpd estaba disponible en el dominio público. A principios de 1995, todos esos parches se aplicaron a la última versión del código fuente de NCSA y, después de varias pruebas, se inició el proyecto del servidor HTTP Apache . [ 17 ] [ 18 ]
A finales de 1994, se lanzó un nuevo servidor web comercial llamado Netsite , con características específicas. Fue el primero de muchos productos similares desarrollados primero por Netscape , luego por Sun Microsystems y finalmente por Oracle Corporation .
A mediados de 1995, Microsoft lanzó la primera versión de IIS para el sistema operativo Windows NT . Esto marcó la entrada, en el campo de las tecnologías de la World Wide Web, de un desarrollador y proveedor comercial que ha desempeñado y sigue desempeñando un papel clave tanto en el lado del cliente como en el del servidor de la web.
En la segunda mitad de 1995, los servidores web del CERN y del NCSA comenzaron a experimentar un declive (en porcentaje de uso global) debido a la adopción generalizada de nuevos servidores web que tenían un ciclo de desarrollo mucho más rápido, además de más funciones, más correcciones aplicadas y un mayor rendimiento que los anteriores.
Crecimiento explosivo y competencia (1996-2014)

A finales de 1996, ya existían más de cincuenta programas de software de servidor web diferentes y conocidos, disponibles para cualquiera que quisiera tener un nombre de dominio de Internet o alojar sitios web. [ 20 ] Muchos de ellos tuvieron una vida corta y fueron reemplazados por otros servidores web.
La publicación de los RFC sobre las versiones del protocolo HTTP/1.0 (1996) y HTTP/1.1 (1997, 1999) obligó a la mayoría de los servidores web a cumplir (aunque no siempre por completo) con dichos estándares. El uso de conexiones persistentes TCP/IP (HTTP/1.1) requirió que los servidores web aumentaran el número máximo de conexiones simultáneas permitidas y mejoraran su escalabilidad.
Entre 1996 y 1999, Netscape Enterprise Server e IIS de Microsoft se consolidaron como las principales opciones comerciales, mientras que entre los programas gratuitos y de código abierto , Apache HTTP Server se mantuvo a la cabeza como el servidor preferido (debido a su fiabilidad y sus numerosas funciones).
En aquellos años también existía otro servidor web comercial llamado Zeus ( actualmente descatalogado ) que era conocido como uno de los servidores web más rápidos y escalables disponibles en el mercado, al menos hasta la primera década de los 2000, a pesar de su bajo porcentaje de uso.
Apache fue el servidor web más utilizado desde mediados de 1996 hasta finales de 2015, cuando, tras unos años de declive, fue superado inicialmente por IIS y luego por Nginx. Posteriormente, IIS cayó a porcentajes de uso mucho menores que Apache (véase también cuota de mercado ).
Entre 2005 y 2006, Apache comenzó a mejorar su velocidad y su nivel de escalabilidad mediante la introducción de nuevas características de rendimiento (por ejemplo, MPM de eventos y nueva caché de contenido). [ 21 ] [ 22 ] Como estas nuevas mejoras de rendimiento se marcaron inicialmente como experimentales, sus usuarios no las habilitaron durante mucho tiempo y, por lo tanto, Apache sufrió aún más la competencia de los servidores comerciales y, sobre todo, de otros servidores de código abierto que, mientras tanto, ya habían alcanzado rendimientos muy superiores (principalmente al servir contenido estático) desde el comienzo de su desarrollo y, en el momento del declive de Apache, también podían ofrecer una lista suficientemente larga de características avanzadas bien probadas.
Pocos años después del inicio del año 2000, surgieron no solo otros servidores web comerciales y altamente competitivos (por ejemplo, LiteSpeed ), sino también muchos otros programas de código abierto como Hiawatha , el servidor HTTP Cherokee , Lighttpd , Nginx y otros productos derivados y relacionados que también contaban con soporte comercial.
Alrededor de 2007-2008, la mayoría de los navegadores web más populares aumentaron su límite predeterminado anterior de 2 conexiones persistentes por dominio de host (un límite recomendado por RFC-2616) [ 23 ] a 4, 6 u 8 conexiones persistentes por dominio de host, con el fin de acelerar la recuperación de páginas web pesadas con muchas imágenes y mitigar el problema de la escasez de conexiones persistentes dedicadas a objetos dinámicos utilizados para notificaciones bidireccionales de eventos en páginas web. [ 24 ] En un año, estos cambios, en promedio, casi triplicaron el número máximo de conexiones persistentes que los servidores web tenían que gestionar. Esta tendencia (de aumentar el número de conexiones persistentes) definitivamente dio un fuerte impulso a la adopción de proxies inversos delante de servidores web más lentos y también dio una nueva oportunidad a los nuevos servidores web emergentes que podían demostrar toda su velocidad y su capacidad para manejar un número muy alto de conexiones concurrentes sin requerir demasiados recursos de hardware (computadoras costosas con muchas CPU , RAM y discos rápidos). [ 25 ]
Nuevos retos (2015 y años posteriores)
En 2015, los RFC publicaron una nueva versión del protocolo [HTTP/2], y como la implementación de las nuevas especificaciones no era nada trivial, surgió un dilema entre los desarrolladores de servidores web menos populares (por ejemplo, con un porcentaje de uso inferior al 1% .. 2%), sobre si añadir o no soporte para esa nueva versión del protocolo. [ 26 ] [ 27 ]
De hecho, el soporte para HTTP/2 a menudo requería cambios radicales en su implementación interna debido a muchos factores (prácticamente siempre se requerían conexiones cifradas, capacidad para distinguir entre conexiones HTTP/1.x y HTTP/2 en el mismo puerto TCP, representación binaria de mensajes HTTP, prioridad de mensajes, compresión de encabezados HTTP, uso de flujos también conocidos como subconexiones TCP/IP y control de flujo relacionado, etc.) y por eso algunos desarrolladores de esos servidores web optaron por no soportar la nueva versión HTTP/2 (al menos en el futuro cercano) también por estas razones principales: [ 26 ] [ 27 ]
- Los protocolos HTTP/1.x habrían sido compatibles con los navegadores durante mucho tiempo (quizás para siempre), de modo que no habría incompatibilidad entre clientes y servidores en el futuro próximo;
- La implementación de HTTP/2 se consideraba una tarea de una complejidad abrumadora que podría abrir la puerta a una nueva clase de errores que hasta 2015 no existían, por lo que habría requerido inversiones notables en el desarrollo y las pruebas de la implementación del nuevo protocolo;
- Siempre se podría añadir compatibilidad con HTTP/2 en el futuro si el esfuerzo estuviera justificado.
En cambio, los desarrolladores de la mayoría de los servidores web más populares se apresuraron a ofrecer la disponibilidad del nuevo protocolo , no solo porque contaban con la mano de obra y el tiempo para hacerlo, sino también porque, por lo general, su implementación anterior del protocolo SPDY podía reutilizarse como punto de partida y porque la mayoría de los navegadores web más utilizados lo implementaron muy rápidamente por la misma razón. Otro motivo que impulsó a esos desarrolladores a actuar con rapidez fue que los administradores web sentían la presión del tráfico web cada vez mayor y realmente querían instalar y probar, cuanto antes, algo que pudiera reducir drásticamente el número de conexiones TCP/IP y acelerar el acceso a los sitios web alojados. [ 28 ]
Entre 2020 y 2021, la dinámica de HTTP/2 en cuanto a su implementación (por parte de los principales servidores web y navegadores web populares) se replicó parcialmente tras la publicación de borradores avanzados de futuras RFC sobre el protocolo HTTP/3 .
Descripción general técnica

La siguiente descripción técnica debe considerarse únicamente como un intento de ofrecer algunos ejemplos muy limitados sobre algunas características que se pueden implementar en un servidor web y algunas de las tareas que puede realizar, con el fin de tener una visión suficientemente amplia del tema.
Un programa de servidor web desempeña el papel de servidor en un modelo cliente-servidor al implementar una o más versiones del protocolo HTTP, que a menudo incluyen la variante segura HTTPS y otras características y extensiones que se consideran útiles para su uso previsto.
La complejidad y la eficiencia de un programa de servidor web pueden variar mucho dependiendo de: [ 1 ]
- Características comunes implementadas;
- tareas comunes realizadas;
- El rendimiento y el nivel de escalabilidad se consideran como un objetivo;
- Modelo de software y técnicas adoptadas para lograr el nivel de rendimiento y escalabilidad deseados;
- Hardware de destino y categoría de uso (por ejemplo, sistema embebido, servidor web de tráfico bajo-medio, servidor web de Internet de alto tráfico ).
Características comunes
Aunque los programas de servidor web difieren en su implementación, la mayoría ofrece las siguientes características comunes.
Estas son características básicas que suelen tener la mayoría de los servidores web.
- Servicio de contenido estático : poder servir contenido estático (archivos web) a los clientes a través del protocolo HTTP.
- HTTP : compatibilidad con una o más versiones del protocolo HTTP para enviar versiones de respuestas HTTP compatibles con las versiones de las solicitudes HTTP del cliente (por ejemplo, HTTP/1.0, HTTP/1.1, HTTP/2 , HTTP/3 ).
- Registro de eventos : por lo general, los servidores web también tienen la capacidad de registrar cierta información sobre las solicitudes de los clientes y las respuestas del servidor en archivos de registro con fines estadísticos y de seguridad.
Algunas otras características más avanzadas y populares ( solo una selección muy breve ) son las siguientes.
- Servicio de contenido dinámico : para poder servir contenido dinámico (generado sobre la marcha) a los clientes a través del protocolo HTTP.
- Alojamiento virtual : poder alojar muchos sitios web ( nombres de dominio ) utilizando una sola dirección IP .
- Autorización : poder permitir, prohibir o autorizar el acceso a partes de las rutas de un sitio web (recursos web).
- Caché de contenido : para poder almacenar en caché el contenido con el fin de acelerar las respuestas del servidor;
- Compatibilidad con archivos grandes : permite servir archivos cuyo tamaño sea superior a 2 GB en sistemas operativos de 32 bits .
- Limitación del ancho de banda : limitar la velocidad de respuesta del contenido para no saturar la red y poder atender a más clientes;
- Motor de reescritura : para mapear partes de URL limpias (que se encuentran en las solicitudes del cliente) a sus nombres reales.
- Páginas de error personalizadas : compatibilidad con mensajes de error HTTP personalizados.
Tareas comunes
Un programa de servidor web, cuando está en ejecución, generalmente realiza varias tareas generales : [ 1 ]
- Se inicia, opcionalmente lee y aplica la configuración que se encuentra en sus archivos de configuración o en otro lugar, opcionalmente abre el archivo de registro, comienza a escuchar las conexiones y solicitudes de los clientes;
- Opcionalmente, intenta adaptar su comportamiento general según su configuración y sus condiciones de funcionamiento actuales ;
- Gestiona las conexiones de los clientes (aceptando nuevas o cerrando las existentes según sea necesario);
- Recibe solicitudes de clientes (leyendo mensajes HTTP):
- lee y verifica cada mensaje de solicitud HTTP;
- normalmente realiza la normalización de URL ;
- normalmente realiza la asignación de URL (que por defecto puede ser la traducción de la ruta de la URL);
- Por lo general, realiza la traducción de la ruta URL junto con varias comprobaciones de seguridad;
- ejecuta o rechaza el método HTTP solicitado:
- Opcionalmente, gestiona las autorizaciones de URL ;
- Opcionalmente, gestiona las redirecciones de URL ;
- Opcionalmente, gestiona las solicitudes de recursos estáticos (contenido de archivos):
- Opcionalmente, gestiona los archivos de índice del directorio ;
- Opcionalmente, gestiona archivos regulares ;
- Opcionalmente, gestiona las solicitudes de recursos dinámicos :
- Opcionalmente, gestiona los listados del directorio ;
- Opcionalmente, gestiona el procesamiento de programas o módulos , comprobando la disponibilidad, el inicio y, finalmente, la detención de la ejecución de programas externos utilizados para generar contenido dinámico;
- Opcionalmente, gestiona las comunicaciones con programas externos o módulos internos utilizados para generar contenido dinámico;
- responde a las solicitudes del cliente enviando respuestas HTTP adecuadas (por ejemplo, recursos solicitados o mensajes de error) y, eventualmente, verificando o agregando encabezados HTTP a los enviados por programas y módulos dinámicos;
- Opcionalmente, registra (parcial o totalmente) las solicitudes del cliente o sus respuestas en un archivo de registro de usuario externo o en un archivo de registro del sistema mediante syslog , generalmente utilizando un formato de registro común ;
- Opcionalmente, registra mensajes de proceso sobre anomalías detectadas u otros eventos notables (por ejemplo, en solicitudes de clientes o en su funcionamiento interno) utilizando syslog u otras funciones del sistema; estos mensajes de registro suelen tener un nivel de depuración, advertencia, error o alerta que se puede filtrar (no registrar) según algunas configuraciones; consulte también el nivel de gravedad .
- Opcionalmente, genera estadísticas sobre el tráfico web gestionado o su rendimiento;
- otras tareas personalizadas.
Leer el mensaje de solicitud
Los programas de servidor web son capaces de: [ 29 ] [ 30 ] [ 31 ]
- leer un mensaje de solicitud HTTP;
- interpretarlo;
- para verificar su sintaxis;
- identificar encabezados HTTP conocidos y extraer sus valores.
Una vez que se ha decodificado y verificado un mensaje de solicitud HTTP, sus valores se pueden usar para determinar si esa solicitud se puede satisfacer o no. Esto requiere muchos otros pasos, incluidas comprobaciones de seguridad .
Normalización de URL
Los programas de servidor web suelen realizar algún tipo de normalización de URL ( URL que se encuentra en la mayoría de los mensajes de solicitud HTTP) con el fin de:
- Asegúrese de que la ruta de recursos sea siempre una ruta limpia y uniforme desde el directorio raíz del sitio web;
- menores riesgos de seguridad (por ejemplo, interceptando más fácilmente los intentos de acceder a recursos estáticos fuera del directorio raíz del sitio web o de acceder a partes de la ruta por debajo del directorio raíz del sitio web que están prohibidas o que requieren autorización);
- Hacer que la ruta de los recursos web sea más reconocible para los seres humanos y los programas de análisis de registros web (también conocidos como analizadores de registros o aplicaciones estadísticas).
La normalización de URL se refiere al proceso de modificar y estandarizar una URL de forma consistente. Existen varios tipos de normalización, como la conversión del esquema y el host a minúsculas. Entre las normalizaciones más importantes se encuentran la eliminación de los segmentos de ruta "." y "." y la adición de barras diagonales al final de una ruta no vacía.
Mapeo de URL
El mapeo de URL es el proceso mediante el cual un servidor web o un marco de aplicación determina cómo se enruta una solicitud de URL entrante al recurso, controlador o acción apropiados. Los mecanismos modernos de mapeo de URL analizan la estructura de la URL solicitada y utilizan reglas de enrutamiento o patrones de configuración para entregar recursos estáticos, invocar controladores dinámicos o realizar reescrituras y redirecciones sin depender directamente de las rutas del sistema de archivos. Este enfoque permite URL claras y legibles para humanos, así como arquitecturas de aplicaciones flexibles. [ 32 ]
En la práctica, los programas de servidor web que implementan funciones avanzadas, más allá del simple servicio de contenido estático (por ejemplo, motor de reescritura de URL, servicio de contenido dinámico), normalmente tienen que averiguar cómo se debe manejar esa URL como:
- Redirección de URL , una redirección a otra URL;
- solicitud estática del contenido del archivo ;
- Solicitud dinámica de:
- Listado de archivos u otros subdirectorios contenidos en ese directorio;
- otros tipos de solicitud dinámica para identificar el programa o módulo procesador capaz de manejar ese tipo de ruta URL y pasarle otras partes de la URL (es decir, generalmente variables de información de ruta y cadena de consulta ).
Uno o más archivos de configuración del servidor web pueden especificar la asignación de partes de la ruta URL (por ejemplo, partes iniciales de la ruta del archivo , extensión del nombre del archivo y otros componentes de la ruta) a un controlador URL específico (archivo, directorio, programa externo o módulo interno). [ 33 ]
Cuando un servidor web implementa una o más de las funciones avanzadas mencionadas anteriormente, la parte de la ruta de una URL válida puede no coincidir siempre con una ruta de sistema de archivos existente en el árbol de directorios del sitio web (un archivo o un directorio en el sistema de archivos ) porque puede referirse a un nombre virtual de un procesador de módulo interno o externo para solicitudes dinámicas.
Traducción de la ruta URL al sistema de archivos
Los programas de servidor web pueden traducir una ruta URL (total o parcial), que hace referencia a una ruta del sistema de archivos físico, a una ruta absoluta dentro del directorio raíz del sitio web de destino. [ 33 ]
El directorio raíz del sitio web puede especificarse mediante un archivo de configuración o mediante alguna regla interna del servidor web utilizando el nombre del sitio web, que es la parte del host de la URL que se encuentra en la solicitud del cliente HTTP. [ 33 ]
La traducción de rutas al sistema de archivos se realiza para los siguientes tipos de recursos web:
- un archivo local, generalmente no ejecutable (solicitud estática del contenido del archivo);
- un directorio local (solicitud dinámica: listado del directorio generado sobre la marcha);
- un nombre de programa (solicitudes dinámicas que se ejecutan mediante la interfaz CGI o SCGI y cuya salida es leída por el servidor web y reenviada al cliente que realizó la solicitud HTTP).
El servidor web agrega la ruta encontrada en la URL solicitada (mensaje de solicitud HTTP) y la agrega a la ruta del directorio raíz del sitio web (Host). En un servidor Apache , esto suele ser /home/www/website(en máquinas Unix , generalmente es: /var/www/website). Vea los siguientes ejemplos de cómo puede resultar.
Traducción de la ruta URL para una solicitud de archivo estático
Ejemplo de una solicitud estática de un archivo existente especificado por la siguiente URL:
http://www.example.com/path/file.htmlEl agente de usuario del cliente se conecta www.example.comy luego envía la siguiente solicitud HTTP /1.1:
GET /ruta/archivo.html HTTP/1.1 Host: www.example.com Conexión: keep-alive
El resultado es el recurso del sistema de archivos local:
/home/www/www.example.com/path/file.htmlEl servidor web lee el archivo , si existe, y envía una respuesta al navegador del cliente. La respuesta describirá el contenido del archivo y contendrá el archivo en sí, o bien devolverá un mensaje de error indicando que el archivo no existe o que su acceso está prohibido.
Traducción de la ruta URL para una solicitud de directorio (sin un archivo de índice estático)
Ejemplo de una solicitud dinámica implícita de un directorio existente especificado por la siguiente URL:
http://www.example.com/directory1/directory2/El agente de usuario del cliente se conecta www.example.comy luego envía la siguiente solicitud HTTP /1.1:
GET /directorio1/directorio2 HTTP/1.1 Host: www.example.com Connection: keep-alive
El resultado es la ruta del directorio local:
/home/www/www.example.com/directory1/directory2/El servidor web verifica la existencia del directorio y, si existe y se puede acceder a él, intenta encontrar un archivo de índice (que en este caso no existe). A continuación, transfiere la solicitud a un módulo interno o a un programa dedicado a la gestión de directorios, que lee los datos de salida y envía una respuesta al navegador del cliente. La respuesta describe el contenido del directorio (lista de subdirectorios y archivos) o bien devuelve un mensaje de error indicando que el directorio no existe o que su acceso está prohibido.
Traducción de la ruta URL para una solicitud de programa dinámico
Para una solicitud dinámica, la ruta URL especificada por el cliente debe hacer referencia a un programa externo existente (normalmente un archivo ejecutable con CGI) utilizado por el servidor web para generar contenido dinámico. [ 34 ]
Ejemplo de una solicitud dinámica que utiliza un archivo de programa para generar una salida:
http://www.example.com/cgi-bin/forum.php?action=view&orderby=thread&date=2021-10-15El agente de usuario del cliente se conecta www.example.comy luego envía la siguiente solicitud HTTP /1.1:
GET /cgi-bin/forum.php?action=view&ordeby=thread&date=2021-10-15 HTTP/1.1 Host: www.example.com Connection: keep-alive
El resultado es la ruta de archivo local del programa (en este ejemplo, un programa PHP ):
/home/www/www.example.com/cgi-bin/forum.phpEl servidor web ejecuta ese programa, pasándole la ruta y la cadena de consultaaction=view&orderby=thread&date=2021-10-15 para que disponga de la información necesaria para su funcionamiento. (En este caso, devolverá un documento HTML con una vista de las entradas del foro ordenadas por hilo desde el 15 de octubre de 2021). Además, el servidor web lee los datos enviados por el programa externo y los reenvía al cliente que realizó la solicitud.
Gestionar el mensaje de solicitud
Una vez que una solicitud ha sido leída, interpretada y verificada, debe gestionarse en función de su método, su URL y sus parámetros, que pueden incluir valores de encabezados HTTP.
En la práctica, el servidor web tiene que manejar la solicitud utilizando una de estas rutas de respuesta: [ 33 ]
- Si algún aspecto de la solicitud no era aceptable (en la línea de estado o en los encabezados del mensaje), el servidor web ya había enviado una respuesta de error;
- Si la solicitud tiene un método (por ejemplo,
OPTIONS) que puede ser satisfecho por el código general del servidor web, entonces se envía una respuesta exitosa; - Si la URL requiere autorización, se envía un mensaje de error de autorización ;
- Si la URL apunta a una redirección, se envía un mensaje de redirección ;
- Si la URL se corresponde con un recurso dinámico (una ruta virtual o una lista de directorios), entonces se llama a su controlador (un módulo interno o un programa externo) y se le pasan los parámetros de la solicitud (cadena de consulta e información de la ruta) para que pueda responder a esa solicitud;
- Si la URL se corresponde con un recurso estático (normalmente un archivo en el sistema de archivos), entonces se llama al controlador estático interno para enviar ese archivo;
- Si se desconoce el método de solicitud o si existe alguna otra condición inaceptable (por ejemplo, recurso no encontrado, error interno del servidor, etc.), se envía una respuesta de error .
Servir contenido estático

Si un programa de servidor web es capaz de servir contenido estático y ha sido configurado para hacerlo, entonces puede enviar contenido de archivo siempre que un mensaje de solicitud tenga una ruta URL válida que coincida (después del mapeo, traducción y redirección de URL) con la de un archivo existente en el directorio raíz de un sitio web y el archivo tenga atributos que coincidan con los requeridos por las reglas internas del programa de servidor web. [ 33 ]
Ese tipo de contenido se denomina estático porque, por lo general, el servidor web no lo modifica cuando se envía a los clientes y porque permanece igual hasta que algún programa lo modifica (modificación de archivos).
NOTA: cuando se sirve únicamente contenido estático , un programa de servidor web normalmente no modifica el contenido de los archivos de los sitios web servidos (ya que solo se leen y nunca se escriben), por lo que basta con admitir únicamente estos métodos HTTP :
OPTIONSHEADGET
La respuesta del contenido de archivos estáticos se puede acelerar mediante una caché de archivos .
Archivos de índice de directorio
Si un programa de servidor web recibe un mensaje de solicitud de cliente con una URL cuya ruta coincide con la de un directorio existente , y dicho directorio es accesible y está habilitado el servicio de archivos de índice de directorio, entonces el programa de servidor web puede intentar servir el primero de los nombres de archivos de índice estáticos conocidos (o configurados) (un archivo regular ) que se encuentren en ese directorio; si no se encuentra ningún archivo de índice o no se cumplen otras condiciones, se devuelve un mensaje de error.
Los nombres más utilizados para los archivos de índice estático son: index.html, index.htmy Default.htm.
Archivos regulares
Si un programa de servidor web recibe un mensaje de solicitud de un cliente con una URL cuya ruta coincide con el nombre de un archivo existente, y ese archivo es accesible para el programa del servidor web y sus atributos coinciden con las reglas internas del programa del servidor web, entonces el programa del servidor web puede enviar ese archivo al cliente.
Por lo general, por motivos de seguridad, la mayoría de los programas de servidor web vienen preconfigurados para servir solo archivos regulares o para evitar el uso de tipos de archivo especiales como archivos de dispositivo , junto con enlaces simbólicos o enlaces duros a ellos. El objetivo es evitar efectos secundarios indeseables al servir recursos web estáticos. [ 35 ]
Ofrecer contenido dinámico

Si un programa de servidor web es capaz de servir contenido dinámico y ha sido configurado para ello, entonces puede comunicarse con el módulo interno o programa externo correspondiente (asociado a la ruta URL solicitada) para pasarle los parámetros de la solicitud del cliente. Posteriormente, el programa de servidor web lee su respuesta de datos (que ha generado, a menudo sobre la marcha) y luego la reenvía al programa cliente que realizó la solicitud. [ 36 ]
NOTA: al servir contenido estático y dinámico , un programa de servidor web generalmente también debe admitir el siguiente método HTTP para poder recibir datos de los clientes de forma segura y así poder alojar también sitios web con formularios interactivos que pueden enviar grandes conjuntos de datos (por ejemplo, mucha entrada de datos o carga de archivos ) al servidor web, programas externos o módulos:
POST
Para poder comunicarse con sus módulos internos o programas externos, un programa de servidor web debe haber implementado una o más de las numerosas interfaces de puerta de enlace disponibles (véase también Interfaces de puerta de enlace de servidor web utilizadas para contenido dinámico ).
Las tres interfaces de puerta de enlace estándar e históricas son las siguientes.
- CGI
- Un programa CGI externo es ejecutado por el programa del servidor web para cada solicitud dinámica; luego, el programa del servidor web lee la respuesta de datos generada y la reenvía al cliente.
- SCGI
- Un programa SCGI externo (generalmente un proceso) es iniciado una vez por un programa de servidor web o por algún otro programa o proceso, y luego espera conexiones de red; cada vez que hay una nueva solicitud, el programa de servidor web establece una nueva conexión de red para enviar los parámetros de la solicitud y leer su respuesta de datos, luego se cierra la conexión de red.
- FastCGI
- Un programa FastCGI externo (normalmente un proceso) es iniciado una sola vez por un programa de servidor web o por algún otro programa o proceso, y luego espera una conexión de red que el servidor web establece de forma permanente; a través de esa conexión se envían los parámetros de la solicitud y las respuestas de los datos leídos.
Listados de directorio

Un programa de servidor web puede ser capaz de gestionar la generación dinámica (sobre la marcha) de una lista de índice de directorios de archivos y subdirectorios. [ 37 ]
Si un programa de servidor web está configurado para ello y la URL solicitada coincide con un directorio existente, se permite el acceso y no se encuentra ningún archivo de índice estático en dicho directorio, se genera dinámicamente (sobre la marcha) una página web (normalmente en formato HTML) que contiene la lista de archivos o subdirectorios del directorio mencionado. Si no se puede generar, se devuelve un error.
Algunos programas de servidor web permiten la personalización de listados de directorios mediante el uso de una plantilla de página web (un documento HTML que contiene marcadores de posición, por ejemplo, $(FILE_NAME), $(FILE_SIZE), etc.) que son reemplazados con los valores de campo de cada entrada de archivo encontrada en el directorio por el servidor web (por ejemplo, index.tpl) o el uso de HTML y código fuente incrustado que es interpretado y ejecutado (por ejemplo, index.asp) o mediante el soporte del uso de programas de índice dinámico como CGI, SCGI, FCGI (por ejemplo, index.cgi, index.php, index.fcgi).
Por lo general, se evita el uso de listados de directorios generados dinámicamente o se limita a unos pocos directorios seleccionados de un sitio web, ya que esa generación consume muchos más recursos del sistema operativo que el envío de una página de índice estática.
El uso principal de los listados de directorios es permitir la descarga de archivos (generalmente cuando sus nombres, tamaños, fechas y horas de modificación o atributos de archivo pueden cambiar de forma aleatoria y frecuente) tal como están, sin necesidad de proporcionar información adicional al usuario solicitante . [ 38 ]
Procesamiento de programas o módulos
Un programa externo o un módulo interno ( unidad de procesamiento ) puede ejecutar algún tipo de función de aplicación que puede utilizarse para obtener datos de uno o más repositorios de datos o para almacenarlos en ellos :
- archivos (sistema de archivos);
- bases de datos (BD);
- otras fuentes ubicadas en la computadora local o en otras computadoras.
Una unidad de procesamiento puede devolver cualquier tipo de contenido web, incluso utilizando datos recuperados de un repositorio de datos:
- un documento (por ejemplo, HTML , XML , etc.);
- una imagen;
- un vídeo;
- datos estructurados (por ejemplo, que pueden usarse para actualizar uno o más valores mostrados por una página dinámica ( DHTML ) de una interfaz web y que tal vez fueron solicitados por una API XMLHttpRequest ) (ver también: página dinámica ).
En la práctica, siempre que haya contenido que pueda variar en función de uno o más parámetros contenidos en la solicitud del cliente o en la configuración, normalmente se genera de forma dinámica.
Enviar mensaje de respuesta
Los programas de servidor web pueden enviar mensajes de respuesta como réplicas a los mensajes de solicitud del cliente. [ 29 ]
Es posible que se envíe un mensaje de respuesta de error porque un mensaje de solicitud no pudo leerse, decodificarse, analizarse o ejecutarse correctamente. [ 30 ]
NOTA: Las siguientes secciones se presentan únicamente como ejemplos para ayudar a comprender qué hace, más o menos, un servidor web; estas secciones no son en absoluto exhaustivas ni completas.
Mensaje de error
Un programa de servidor web puede responder a un mensaje de solicitud del cliente con muchos tipos de mensajes de error; sin embargo, estos errores se dividen principalmente en dos categorías:
- Errores del cliente HTTP , debido al tipo de mensaje de solicitud o a la disponibilidad del recurso web solicitado; [ 39 ]
- Errores del servidor HTTP , debido a errores internos del servidor. [ 40 ]
Cuando un navegador cliente recibe una respuesta o mensaje de error, si este está relacionado con la solicitud principal del usuario (por ejemplo, la URL de un recurso web como una página web), normalmente ese mensaje de error se muestra en alguna ventana o mensaje del navegador.
autorización de URL
Un programa de servidor web puede verificar si la ruta URL solicitada: [ 41 ]
- Puede ser accedido libremente por todos;
- requiere autenticación de usuario (solicitud de credenciales de usuario como nombre de usuario y contraseña );
- El acceso está prohibido a algunos o a todos los tipos de usuarios.
Si la función de autorización o derechos de acceso se ha implementado y habilitado y no se concede el acceso al recurso web, entonces, dependiendo de los derechos de acceso requeridos, un programa de servidor web:
- puede denegar el acceso enviando un mensaje de error específico (por ejemplo, acceso prohibido );
- Puede denegar el acceso enviando un mensaje de error específico (por ejemplo, acceso no autorizado ) que normalmente obliga al navegador del cliente a pedir al usuario que proporcione las credenciales de usuario necesarias; si se proporcionan las credenciales de autenticación, el programa del servidor web las verifica y las acepta o las rechaza.
Redirección de URL
Un programa de servidor web puede tener la capacidad de realizar redirecciones de URL a nuevas URL (nuevas ubicaciones), lo que consiste en responder a un mensaje de solicitud del cliente con un mensaje de respuesta que contiene una nueva URL adecuada para acceder a un recurso web válido o existente (el cliente debe rehacer la solicitud con la nueva URL). [ 42 ]
Se utiliza la redirección de URL de la ubicación: [ 42 ]
- para corregir un nombre de directorio agregando una barra diagonal final '/'; [ 37 ]
- para proporcionar una nueva URL para una ruta URL que ya no existe, a una nueva ruta donde se pueda encontrar ese tipo de recurso web.
- para asignar una nueva URL a otro dominio cuando el dominio actual tiene demasiada carga.
Ejemplo 1: una ruta URL apunta a un nombre de directorio pero no tiene una barra diagonal final '/', por lo que el servidor web envía una redirección al cliente para indicarle que rehaga la solicitud con el nombre de ruta corregido. [ 37 ]
De: A: /directory1/directory2 /directory1/directory2/
Ejemplo 2: Se ha movido un conjunto completo de documentos dentro del sitio web con el fin de reorganizar las rutas de su sistema de archivos.
De: A: /directory1/directory2/2021-10-08/ /directory1/directory2/2021/10/08/
Ejemplo 3: Se ha trasladado un conjunto completo de documentos a un nuevo sitio web y ahora es obligatorio utilizar conexiones HTTPS seguras para acceder a ellos.
De: A: http://www.example.com/directory1/directory2/2021-10-08/ https://docs.example.com/directory1/2021-10-08/
Los ejemplos anteriores son solo algunos de los posibles tipos de redireccionamiento.
Mensaje exitoso
Un programa de servidor web puede responder a un mensaje de solicitud válido del cliente con un mensaje de éxito, que opcionalmente contiene los datos de recursos web solicitados . [ 43 ]
Si los datos de un recurso web se envían de vuelta al cliente, pueden ser contenido estático o dinámico, dependiendo de cómo se hayan recuperado (desde un archivo o desde la salida de algún programa o módulo).
Caché de contenido
Para acelerar las respuestas de los servidores web reduciendo los tiempos de respuesta HTTP promedio y los recursos de hardware utilizados, muchos servidores web populares implementan una o más cachés de contenido , cada una especializada en una categoría de contenido. [ 44 ] [ 45 ]
El contenido suele almacenarse en caché según su origen:
- contenido estático:
- contenido dinámico:
- caché dinámica (salida del módulo o del programa).
Caché de archivos
Históricamente, el contenido estático que se encuentra en los archivos a los que se debe acceder con frecuencia, de forma aleatoria y rápida, se ha almacenado principalmente en discos electromecánicos desde mediados o finales de los años 60 y 70; lamentablemente, las operaciones de lectura y escritura en este tipo de dispositivos siempre se han considerado muy lentas en comparación con la velocidad de la RAM , por lo que, desde los primeros sistemas operativos , se desarrollaron primero cachés de disco y luego subsistemas de caché de archivos del sistema operativo para acelerar las operaciones de E/S de los datos a los que se accede con frecuencia.
Incluso con la ayuda de una caché de archivos del sistema operativo, la lentitud relativa u ocasional de las operaciones de E/S que involucraban directorios y archivos almacenados en discos pronto se convirtió en un cuello de botella para el aumento del rendimiento esperado de los servidores web de alto nivel, especialmente desde mediados y finales de la década de 1990, cuando el tráfico de Internet comenzó a crecer exponencialmente junto con el aumento constante de la velocidad de las líneas de Internet o de red.
El problema de cómo acelerar aún más la entrega de archivos estáticos, aumentando así el número máximo de solicitudes o respuestas por segundo ( RPS ), comenzó a estudiarse e investigarse desde mediados de la década de 1990, con el objetivo de proponer modelos de caché útiles que pudieran implementarse en programas de servidores web. [ 46 ]
En la práctica, hoy en día, muchos programas de servidor web incluyen su propia caché de archivos de espacio de usuario , adaptada al uso de un servidor web y utilizando su implementación y parámetros específicos. [ 47 ] [ 48 ] [ 49 ]
La adopción generalizada de RAID y de unidades de estado sólido rápidas (hardware de almacenamiento con una velocidad de E/S muy alta) ha reducido ligeramente, pero por supuesto no ha eliminado, la ventaja de tener una caché de archivos incorporada en un servidor web.
Caché dinámica
El contenido dinámico, generado por un módulo interno o un programa externo, puede no cambiar con mucha frecuencia (dado que tiene una URL única con claves o parámetros) y, por lo tanto, tal vez durante un tiempo (por ejemplo, de un segundo a varias horas o más), la salida resultante puede almacenarse en caché en la RAM o incluso en un disco rápido . [ 50 ]
El uso típico de una caché dinámica se da cuando un sitio web tiene páginas web dinámicas sobre noticias, clima, imágenes, mapas, etc., que no cambian con frecuencia (por ejemplo, cada n minutos) y a las que acceden muchísimos clientes por minuto y por hora; en esos casos, también es útil devolver el contenido almacenado en caché (sin llamar al módulo interno ni al programa externo) porque los clientes a menudo no tienen una copia actualizada del contenido solicitado en la caché de su navegador. [ 51 ]
En la mayoría de los casos, este tipo de cachés se implementan mediante servidores externos (por ejemplo, proxy inverso ) o almacenando la salida de datos dinámicos en ordenadores separados, gestionados por aplicaciones específicas (por ejemplo, memcached ), para no competir por los recursos de hardware (CPU, RAM, discos) con los servidores web. [ 52 ] [ 53 ]
Servidores web en modo kernel y en modo usuario
Un software de servidor web puede integrarse en el sistema operativo y ejecutarse en el espacio del kernel , o bien ejecutarse en el espacio de usuario (como otras aplicaciones habituales).
Los servidores web que se ejecutan en modo kernel (generalmente llamados servidores web de espacio kernel ) pueden tener acceso directo a los recursos del kernel y, por lo tanto, en teoría, pueden ser más rápidos que los que se ejecutan en modo usuario, pero existen desventajas al ejecutar un servidor web en modo kernel (por ejemplo, dificultades para desarrollar y depurar software), mientras que los errores críticos en tiempo de ejecución pueden provocar problemas graves en el kernel del sistema operativo.
Los servidores web que se ejecutan en modo usuario deben solicitar al sistema permiso para usar más memoria o más recursos de CPU . Estas solicitudes al núcleo no solo consumen tiempo, sino que además no siempre se satisfacen, ya que el sistema reserva recursos para su propio uso y tiene la responsabilidad de compartir los recursos de hardware con todas las demás aplicaciones en ejecución. La ejecución en modo usuario también puede implicar un mayor uso de búferes o copias de datos (entre el espacio de usuario y el espacio del núcleo), lo que puede provocar una disminución del rendimiento del servidor web.
Actualmente, casi todo el software de servidor web se ejecuta en modo usuario (ya que muchas de las pequeñas desventajas mencionadas anteriormente se han superado gracias a un hardware más rápido, nuevas versiones del sistema operativo, llamadas al sistema mucho más rápidas y software de servidor web optimizado). Consulte también la comparación de software de servidor web para descubrir cuáles se ejecutan en modo kernel o en modo usuario (también conocido como espacio kernel o espacio de usuario).
Actuaciones
Para mejorar la experiencia del usuario (tanto en el cliente como en el navegador), un servidor web debe responder rápidamente (lo antes posible) a las solicitudes del cliente; a menos que la respuesta del contenido esté limitada (por configuración) para algún tipo de archivo (por ejemplo, archivos grandes o enormes), el contenido de los datos devueltos también debe enviarse lo más rápido posible (alta velocidad de transferencia).
En otras palabras, un servidor web siempre debe ser muy receptivo , incluso bajo una alta carga de tráfico web, para mantener el tiempo total de espera del usuario (suma del tiempo del navegador + tiempo de red + tiempo de respuesta del servidor web ) para obtener una respuesta lo más bajo posible .
Métricas de rendimiento
Para el software de servidor web, las principales métricas de rendimiento clave (medidas bajo diversas condiciones de funcionamiento ) suelen ser al menos las siguientes: [ 54 ]
- número desolicitudes por segundo (RPS, similar aQPS, dependiendo de la versión y configuración de HTTP, el tipo de solicitudes HTTP y otras condiciones de funcionamiento);
- Número de conexiones por segundo ( CPS ), es el número de conexiones por segundo aceptadas por el servidor web (útil cuando se utiliza HTTP/1.0 o HTTP/1.1 con un límite muy bajo de solicitudes o respuestas por conexión, es decir, 1 .. 20);
- latencia de red + tiempo de respuesta para cada nueva solicitud del cliente; por lo general, la herramienta de evaluación comparativa muestra cuántas solicitudes se han satisfecho dentro de una escala de intervalos de tiempo (por ejemplo, dentro de 1 ms, 3 ms, 5 ms, 10 ms, 20 ms, 30 ms, 40 ms) o el tiempo de respuesta más corto, el promedio y el más largo;
- Rendimiento de las respuestas , en bytes por segundo.
Entre las condiciones de funcionamiento, el número (1 .. n ) de conexiones de clientes concurrentes utilizadas durante una prueba es un parámetro importante porque permite correlacionar el nivel de concurrencia soportado por el servidor web con los resultados de las métricas de rendimiento probadas.
eficiencia del software
El diseño y modelo específico del software del servidor web adoptado :
- proceso único o multiproceso;
- un solo hilo (sin hilo) o múltiples hilos para cada proceso;
- con o sin uso de corrutinas ;
... y otras técnicas de programación , tales como:
- minimización de posibles fallos de caché de la CPU ;
- Minimización de posibles errores de predicción de bifurcaciones de la CPU en rutas críticas para optimizar la velocidad;
- minimización del número de llamadas al sistema utilizadas para realizar una determinada función o tarea;
- otros trucos;
... utilizado para implementar un programa de servidor web, puede influir mucho en el rendimiento y, en particular, en el nivel de escalabilidad que se puede lograr bajo una carga pesada o cuando se utiliza hardware de gama alta (muchas CPU, discos y mucha RAM).
En la práctica, algunos modelos de software de servidor web pueden requerir más recursos del sistema operativo (especialmente más CPU y más RAM) que otros para poder funcionar correctamente y, por lo tanto, alcanzar el rendimiento deseado.
Condiciones de funcionamiento
Existen muchas condiciones de funcionamiento que pueden afectar el rendimiento de un servidor web; los valores de rendimiento pueden variar dependiendo de:
- la configuración del servidor web (incluido el hecho de que el archivo de registro esté habilitado o no, etc.);
- la versión HTTP utilizada por las solicitudes del cliente;
- el tipo de solicitud HTTP promedio (método, longitud de los encabezados HTTP y cuerpo opcional);
- si el contenido solicitado es estático o dinámico;
- si el contenido está almacenado en caché o no (por el servidor o el cliente);
- ya sea que el contenido se comprima sobre la marcha (al transferirse), se precomprima (es decir, cuando un recurso de archivo se almacena en el disco ya comprimido para que el servidor web pueda enviar ese archivo directamente a la red con la única indicación de que su contenido está comprimido) o no se comprima en absoluto;
- tanto si las conexiones están cifradas como si no;
- la velocidad media de la red entre el servidor web y sus clientes;
- el número de conexiones TCP activas ;
- el número de procesos activos gestionados por el servidor web (incluidos los programas externos CGI, SCGI y FCGI);
- las limitaciones o configuraciones de hardware y software del sistema operativo de los ordenadores en los que se ejecuta el servidor web;
- otras afecciones menores.
Evaluación comparativa
El rendimiento de un servidor web se suele evaluar mediante el uso de una o más de las herramientas de prueba de carga automatizadas disponibles .
Límites de carga
Un servidor web (instalación de programa) suele tener límites de carga predefinidos para cada combinación de condiciones de funcionamiento , también porque está limitado por los recursos del sistema operativo y porque solo puede manejar un número limitado de conexiones de clientes concurrentes (normalmente entre 2 y varias decenas de miles para cada proceso de servidor web activo, véase también el problema C10k y el problema C10M ).
Cuando un servidor web se acerca o supera sus límites de carga, se sobrecarga y, por lo tanto, puede dejar de responder .
Causas de sobrecarga
En cualquier momento, los servidores web pueden sobrecargarse debido a una o más de las siguientes causas:
- Tráfico web legítimo excesivo . Miles o incluso millones de clientes conectándose al sitio web en un corto período de tiempo (por ejemplo, el efecto Slashdot ).
- Ataques de denegación de servicio distribuido . Un ataque de denegación de servicio (ataque DoS) o ataque de denegación de servicio distribuido (ataque DDoS) es un intento de dejar un recurso informático o de red inaccesible para sus usuarios previstos.
- Gusanos informáticos que a veces provocan tráfico anormal debido a millones de ordenadores infectados (sin coordinación entre ellos).
- Los gusanos XSS pueden provocar un alto tráfico debido a los millones de navegadores o servidores web infectados.
- Bots de Internet Tráfico no filtrado ni limitado en sitios web grandes con muy pocos recursos de red (por ejemplo, ancho de banda ) o recursos de hardware (CPU, RAM, discos).
- La ralentización de Internet (red) (por ejemplo, debido a la pérdida de paquetes) provoca que las solicitudes de los clientes se atiendan más lentamente y que el número de conexiones aumente tanto que se alcancen los límites del servidor.
- Los servidores web, que sirven contenido dinámico , esperan respuestas lentas provenientes de los ordenadores de back-end (por ejemplo, bases de datos ), tal vez debido a demasiadas consultas combinadas con demasiadas inserciones o actualizaciones de datos de la base de datos; en estos casos, los servidores web tienen que esperar las respuestas de datos del back-end antes de responder a los clientes HTTP, pero durante estas esperas llegan demasiadas conexiones o solicitudes de clientes nuevos y, por lo tanto, se sobrecargan.
- Indisponibilidad parcial de los servidores web ( ordenadores ) . Esto puede ocurrir debido a tareas de mantenimiento o actualización necesarias o urgentes, fallos de hardware o software, como fallos en el sistema (por ejemplo, la base de datos ); en estos casos, los servidores web restantes pueden recibir demasiado tráfico y sobrecargarse.
Síntomas de sobrecarga
Los síntomas de un servidor web sobrecargado suelen ser los siguientes:
- Las solicitudes se atienden con demoras (posiblemente largas) (de un segundo a varios cientos de segundos).
- El servidor web devuelve un código de error HTTP , como 500, 502, [ 55 ] [ 56 ] 503, [ 57 ] 504, [ 58 ] 408, o incluso un 404 intermitente .
- El servidor web rechaza o restablece (interrumpe) las conexiones TCP antes de devolver cualquier contenido.
- En casos muy excepcionales, el servidor web devuelve solo una parte del contenido solicitado. Este comportamiento puede considerarse un error , aunque suele ser síntoma de sobrecarga.
Técnicas anti-sobrecarga
Para superar parcialmente los límites de carga superiores a la media y evitar la sobrecarga, la mayoría de los sitios web populares utilizan técnicas comunes como las siguientes:
- Ajuste de los parámetros del sistema operativo según las capacidades y el uso del hardware.
- Optimización de los parámetros de los servidores web para mejorar su seguridad y rendimiento.
- Implementar técnicas de almacenamiento en caché web (no solo para contenido estático, sino también, siempre que sea posible, para contenido dinámico).
- Gestionar el tráfico de red, mediante el uso de:
- Cortafuegos para bloquear el tráfico no deseado procedente de direcciones IP maliciosas o con patrones sospechosos;
- Los gestores de tráfico HTTP se encargan de descartar, redirigir o reescribir las solicitudes que presenten patrones HTTP incorrectos;
- Gestión del ancho de banda y modelado del tráfico , con el fin de suavizar los picos de uso de la red.
- Utilizar diferentes nombres de dominio , direcciones IP y ordenadores para servir distintos tipos de contenido (estático y dinámico); el objetivo es separar los archivos grandes o enormes (
download.*) (ese dominio también podría ser reemplazado por una CDN ) de los archivos pequeños y medianos (static.*) y del sitio dinámico principal (quizás donde algunos contenidos se almacenan en una base de datos backend ) (www.*); la idea es poder servir eficientemente archivos grandes o enormes (de más de 10 a 1000 MB) (quizás limitando las descargas) y almacenar en caché completamente los archivos pequeños y medianos, sin afectar el rendimiento del sitio dinámico bajo una carga pesada, utilizando diferentes configuraciones para cada (grupo) de ordenadores del servidor web:https://download.example.comhttps://static.example.comhttps://www.example.com
- Utilizar muchos servidores web (ordenadores) agrupados detrás de un balanceador de carga para que actúen o sean vistos como un único servidor web de gran tamaño.
- Agregar más recursos de hardware (es decir, RAM , discos rápidos ) a cada computadora.
- Utilizar programas informáticos más eficientes para servidores web (véase también: eficiencia del software ).
- Utilizar la interfaz de puerta de enlace del servidor web más eficiente para procesar solicitudes dinámicas (generar uno o más programas externos cada vez que se recupera una página dinámica perjudica el rendimiento).
- Utilizar otras técnicas de programación y soluciones alternativas , especialmente si hay contenido dinámico involucrado, para acelerar las respuestas HTTP (es decir, evitando llamadas dinámicas para recuperar objetos, como hojas de estilo, imágenes y scripts), que nunca cambian o cambian muy raramente, copiando ese contenido a archivos estáticos una sola vez y luego manteniéndolos sincronizados con el contenido dinámico.
- Utilizar las versiones más recientes y eficientes de HTTP (por ejemplo, además de usar HTTP/1.1, habilitar también HTTP/2 y posiblemente HTTP/3 , siempre que el software del servidor web disponible ofrezca soporte fiable para estos dos últimos protocolos) para reducir considerablemente el número de conexiones TCP/IP iniciadas por cada cliente y el tamaño de los datos intercambiados (debido a una representación más compacta de las cabeceras HTTP y posiblemente a la compresión de datos). Esto podría no evitar las sobrecargas de RAM y CPU causadas por la necesidad de cifrado. Tampoco solucionaría las sobrecargas causadas por archivos excesivamente grandes cargados a alta velocidad, ya que están optimizados para la concurrencia. [ 59 ] [ 60 ]
Cuota de mercado


A continuación se muestran las últimas estadísticas de la cuota de mercado de todos los sitios de los principales servidores web de Internet, según Netcraft .
NOTA: (*) El porcentaje se ha redondeado a un número entero, ya que la página de origen no informa públicamente de sus valores decimales (solo se informa del valor redondeado en el gráfico).
Véase también
- Servidor (informática)
- Servidor de aplicaciones
- Comparación de software de servidor web
- compresión HTTP
- Aplicación web
- Aplicación web de código abierto
- Lista de paquetes AMP
- Objeto variante
- Alojamiento virtual
- Servicio de alojamiento web
- Contenedor web
- Proxy web
- Servicio web
Interfaces de puerta de enlace de servidor web estándar utilizadas para contenido dinámico :
- Interfaz de puerta de enlace común (CGI)
- Interfaz de puerta de enlace común simple (SCGI)
- Interfaz de puerta de enlace común rápida (FastCGI)
Otras interfaces de servidor web (específicas del servidor o del lenguaje de programación ) utilizadas para contenido dinámico:
- Las directivas SSI ( Server Side Includes), poco utilizadas, son documentos HTML estáticos que el software del servidor interpreta para incluir pequeños datos dinámicos sobre la marcha cuando se sirven las páginas (por ejemplo, fecha y hora, otros contenidos de archivos estáticos, etc.).
- Interfaz de programación de aplicaciones del servidor SAPI :
- Interfaz de programación de aplicaciones (API) para servidores de Internet
- Interfaz de programación de aplicaciones (API) de Netscape Server
- Interfaz de puerta de enlace de servidor web PSGI Perl
- Interfaz de puerta de enlace de servidor web WSGI para Python
- Interfaz de puerta de enlace del servidor web Rack Rack
- Interfaz de puerta de enlace de servidor web JavaScript JSGI
- Servlet Java , Páginas JavaServer
- Páginas activas del servidor , ASP.NET
Referencias
- 1 2 3 Nancy J. Yeager; Robert E. McGrath (1996). Tecnología de servidores web . Morgan Kaufmann. ISBN 1-55860-376-XArchivado del original el 20 de enero de 2023. Consultado el 22 de enero de 2021 .
- ↑ William Nelson; Arvind Srinivasan; Murthy Chintalapati (2009). Sun Web Server: The Essential Guide . Pearson Education. ISBN 978-0-13-712892-1Archivado del original el 20 de enero de 2023. Consultado el 14 de octubre de 2021 .
- ↑ "¿Qué es un servidor web? - MDN Web Docs" . MDN Web Docs . 13 de marzo de 2025. Consultado el 20 de marzo de 2025 .
- ↑ "¿Qué es un servidor web y cómo funciona? - Glosario de TI | SolarWinds" . www.solarwinds.com . Consultado el 26 de abril de 2025 .
- ↑ "¿Qué son los servidores web?" . Akamai.com . 26 de abril de 2025.
- ↑ "Material de estudio sobre servidores web - eGyanKosh" (PDF) . eGyanKosh . Consultado el 20 de marzo de 2025 .
- ↑ "Breve historia de la web" . CERN . Consultado el 20 de marzo de 2025 .
- ↑ Zolfagharifard, Ellie (24 de noviembre de 2018) .«El padre de la web, Sir Tim Berners-Lee, habla sobre su plan para combatir las noticias falsas» . The Telegraph . Londres. ISSN 0307-1235 . Archivado del original el 11 de enero de 2022. Consultado el 1 de febrero de 2019 .
- ↑ "Historia de las computadoras y la informática, Internet, nacimiento, la World Wide Web de Tim Berners-Lee" . history-computer.com . Archivado del original el 4 de enero de 2019. Consultado el 1 de febrero de 2019 .
- 1 2 3 Tim Berner-Lee (1992). "Historia del proyecto WWW (original)" . CERN (proyecto World Wide Web). Archivado del original el 8 de diciembre de 2021. Recuperado el 20 de diciembre de 2021 .
- 1 2 Tim Berner-Lee (20 de agosto de 1991). "WorldWideWeb: aplicación de hipertexto de área amplia disponible (anuncio)" . CERN (proyecto World Wide Web). Archivado del original el 2 de diciembre de 2021. Recuperado el 16 de octubre de 2021 .
- 1 2 Administrador web. "Historial web" . CERN (proyecto World Wide Web). Archivado del original el 2 de diciembre de 2021. Recuperado el 16 de octubre de 2021 .
- ↑ Tim Berner-Lee (2 de agosto de 1991). "Calificadores en enlaces de hipertexto..." CERN (proyecto World Wide Web). Archivado del original el 7 de diciembre de 2021. Recuperado el 16 de octubre de 2021 .
- ↑ Tim Smith; François Flückiger. "Licencias para la Web" . CERN (Proyecto World Wide Web). Archivado del original el 6 de diciembre de 2021. Consultado el 16 de octubre de 2021 .
- ↑ Ali Mesbah (2009). Análisis y pruebas de aplicaciones web de una sola página basadas en Ajax . ISBN 978-90-79982-02-8Consultado el 18 de diciembre de 2021 .
- 1 2 Robert H'obbes' Zakon. "Hobbes' Internet Timeline v5.1 (WWW Growth) NOTE: until 1996 number of web servers = number of web sites" . ISOC. Archivado del original el 15 de agosto de 2000. Recuperado el 18 de diciembre de 2021 .
- ↑ "NCSA httpd" . NCSA (archivo web). Archivado del original el 1 de agosto de 2010. Consultado el 16 de diciembre de 2021 .
- ↑ "Acerca del servidor Apache HTTPd: Cómo surgió Apache" . Apache: proyecto del servidor HTTPd. 1997. Archivado del original el 7 de junio de 2008. Consultado el 17 de diciembre de 2021 .
- ↑ "Encuesta de servidores web, NOTA: el número de sitios web activos en el año 2000 se ha interpolado" . Netcraft. 22 de diciembre de 2021. Archivado del original el 27 de diciembre de 2021. Recuperado el 27 de diciembre de 2021 .
- ↑ "Netcraft: software de servidor web (1996)" . Netcraft (archivo web). Archivado del original el 30 de diciembre de 1996. Consultado el 16 de diciembre de 2021 .
- ↑ "Descripción general de las nuevas características de Apache 2.2" . Apache: proyecto de servidor HTTPd. 2005. Archivado del original el 27 de noviembre de 2021. Consultado el 16 de diciembre de 2021 .
- ↑ "Descripción general de las nuevas características de Apache 2.4" . Apache: proyecto de servidor HTTPd. 2012. Archivado del original el 26 de noviembre de 2021. Consultado el 16 de diciembre de 2021 .
- ↑ "Conexiones, conexiones persistentes: consideraciones prácticas" . RFC 2616, Protocolo de transferencia de hipertexto -- HTTP/1.1 . IETF . págs. 46–47. sec. 8.1.4. doi : 10.17487/RFC2616 . RFC 2616 .
- ↑ "Número máximo de conexiones simultáneas al mismo dominio para navegadores" . 2017. Archivado del original el 21 de diciembre de 2021. Consultado el 21 de diciembre de 2021 .
- ↑ "Prueba de rendimiento de servidores web Linux: resultados de 2016" . RootUsers. 8 de marzo de 2016. Archivado del original el 23 de diciembre de 2021. Consultado el 22 de diciembre de 2021 .
- 1 2 "¿Reemplazará HTTP/2 a HTTP/1.x?" . Grupo de Trabajo HTTP de la IETF. Archivado del original el 27 de septiembre de 2014. Recuperado el 22 de diciembre de 2021 .
- 1 2 "Implementaciones de HTTP/2 en software de cliente y servidor" . Grupo de trabajo HTTP de la IETF. Archivado del original el 23 de diciembre de 2021. Recuperado el 22 de diciembre de 2021 .
- ↑ "¿Por qué solo una conexión TCP?" . Grupo de Trabajo HTTP de la IETF. Archivado del original el 27 de septiembre de 2014. Consultado el 22 de diciembre de 2021 .
- 1 2 "Mensajería cliente/servidor" . RFC 7230, HTTP/1.1: Sintaxis y enrutamiento de mensajes . IETF . págs. 7–8. sec. 2.1. doi : 10.17487/RFC7230 . RFC 7230 .
- 1 2 "Manejo de mensajes incompletos" . RFC 7230, HTTP/1.1: Sintaxis y enrutamiento de mensajes . IETF . pág. 34. sec. 3.4. doi : 10.17487/RFC7230 . RFC 7230 .
- ↑ "Robustez del análisis de mensajes" . RFC 7230, HTTP/1.1: Sintaxis y enrutamiento de mensajes . IETF . págs. 34–35. sec. 3.5. doi : 10.17487/RFC7230 . RFC 7230 .
- ↑ https://developer.mozilla.org/en-US/docs/Learn/Server-side/First_steps/Routing
- 1 2 3 4 5 "Mapeo de URL a ubicaciones del sistema de archivos" . Apache: proyecto de servidor HTTPd. 2021. Archivado del original el 20 de octubre de 2021. Recuperado el 19 de octubre de 2021 .
- ↑ "Contenido dinámico con CGI" . Apache: proyecto de servidor HTTPd. 2021. Archivado del original el 15 de noviembre de 2021. Consultado el 19 de octubre de 2021 .
- ↑ Chris Shiflett (2003). Manual del desarrollador HTTP . Editorial Sams. ISBN 0-672-32454-7Archivado del original el 20 de enero de 2023. Consultado el 9 de diciembre de 2021 .
- ↑ Spasojevic, Anastazija (26 de agosto de 2024). "¿Qué es la interfaz de puerta de enlace común?" . Glosario de TI de phoenixNAP . Consultado el 18 de marzo de 2026 .
- 1 2 3 ASF Infrabot (22 de mayo de 2019). "Listados de directorios" . Fundación Apache: proyecto de servidor HTTPd. Archivado del original el 7 de junio de 2019. Recuperado el 16 de noviembre de 2021 .
- ↑ "Apache: listado de directorios para descargar archivos" . Apache: servidor HTTPd. Archivado del original el 2 de diciembre de 2021. Recuperado el 16 de diciembre de 2021 .
- ↑ "Error del cliente 4xx" . RFC 7231, HTTP/1.1: Semántica y contenido . IETF . pág. 58. sec. 6.5. doi : 10.17487/RFC7231 . RFC 7231 .
- ↑ "Error del servidor 5xx" . RFC 7231, HTTP/1.1: Semántica y contenido . IETF . págs. 62-63. sec. 6.6. doi : 10.17487/RFC7231 . RFC 7231 .
- ↑ "Introducción" . RFC 7235, HTTP/1.1: Autenticación . IETF . pág. 3. sec. 1. doi : 10.17487/RFC7235 . RFC 7235 .
- 1 2 "Códigos de estado de respuesta: redirección 3xx" . RFC 7231, HTTP/1.1: Semántica y contenido . IETF . págs. 53–54. sec. 6.4. doi : 10.17487/RFC7231 . RFC 7231 .
- ↑ "Successful 2xx" . RFC 7231, HTTP/1.1: Semántica y contenido . IETF . págs. 51-54. sec. 6.3. doi : 10.17487/RFC7231 . RFC 7231 .
- ↑ "Guía de almacenamiento en caché" . Apache: proyecto de servidor HTTPd. 2021. Archivado del original el 9 de diciembre de 2021. Consultado el 9 de diciembre de 2021 .
- ↑ "NGINX Content Caching" . F5 NGINX. 2021. Archivado del original el 9 de diciembre de 2021. Consultado el 9 de diciembre de 2021 .
- ↑ Evangelos P. Markatos (1996). "Almacenamiento en caché de documentos web en la memoria principal" . Redes informáticas y sistemas ISDN. Archivado del original el 20 de enero de 2023. Consultado el 9 de diciembre de 2021 .
- ↑ "IPlanet Web Server 7.0.9: caché de archivos" . Oracle. 2010. Archivado del original el 9 de diciembre de 2021. Recuperado el 9 de diciembre de 2021 .
- ↑ "Módulo Apache mod_file_cache" . Apache: proyecto de servidor HTTPd. 2021. Archivado del original el 9 de diciembre de 2021. Recuperado el 9 de diciembre de 2021 .
- ↑ "Servidor HTTP: configuración: caché de archivos" . GNU. 2021. Archivado del original el 9 de diciembre de 2021. Recuperado el 9 de diciembre de 2021 .
- ↑ "Módulo Apache mod_cache_disk" . Apache: proyecto de servidor HTTPd. 2021. Archivado del original el 9 de diciembre de 2021. Recuperado el 9 de diciembre de 2021 .
- ↑ "¿Qué es la caché dinámica?" . Educativo. 2021. Archivado del original el 9 de diciembre de 2021. Recuperado el 9 de diciembre de 2021 .
- ↑ "Tutorial sobre la opción de caché dinámica" . Siteground. 2021. Archivado del original el 20 de enero de 2023. Consultado el 9 de diciembre de 2021 .
- ↑ Arun Iyengar; Jim Challenger (2000). "Mejora del rendimiento del servidor web mediante el almacenamiento en caché de datos dinámicos" . Usenix . Consultado el 9 de diciembre de 2021 .
- ↑ Jussara M. Almeida ; Virgilio Almeida; David J. Yates (7 de julio de 1997). "WebMonitor: una herramienta para medir el rendimiento de los servidores de la World Wide Web" . First Monday . doi : 10.5210/fm.v2i7.539 . Archivado del original el 4 de noviembre de 2021. Recuperado el 4 de noviembre de 2021 .
- ↑ Fisher, Tim; Lifewire. "¿Obtienes un error 502 Bad Gateway? Esto es lo que debes hacer" . Lifewire . Archivado del original el 23 de febrero de 2017. Consultado el 1 de febrero de 2019 .
- ↑ "¿Qué es un error 502 bad gateway y cómo se soluciona?" . IT PRO . Archivado del original el 20 de enero de 2023 . Consultado el 1 de febrero de 2019 .
- ↑ Fisher, Tim; Lifewire. "¿Recibe un error 503 Servicio no disponible? Esto es lo que debe hacer" . Lifewire . Archivado del original el 20 de enero de 2023. Consultado el 1 de febrero de 2019 .
- ↑ Fisher, Tim; Lifewire. "¿Recibe un error 504 Gateway Timeout? Esto es lo que debe hacer" . Lifewire . Archivado del original el 23 de abril de 2021. Consultado el 1 de febrero de 2019 .
- ↑ muchos (24 de enero de 2021). "Cargas lentas con HTTP/2" . github. Archivado del original el 16 de noviembre de 2021. Recuperado el 15 de noviembre de 2021 .
- ↑ Junho Choi (24 de agosto de 2020). "Mejoras en la velocidad de subida de HTTP/2" . Cloudflare. Archivado del original el 16 de noviembre de 2021. Consultado el 15 de noviembre de 2021 .
- ↑ "Encuesta de servidores web de octubre de 2021" . Netcraft . 15 de octubre de 2021. Archivado del original el 15 de noviembre de 2021. Consultado el 15 de noviembre de 2021 .
- ↑ "Encuesta sobre servidores web de febrero de 2021" . Netcraft . 26 de febrero de 2021. Archivado del original el 15 de abril de 2021. Consultado el 8 de abril de 2021 .
- ↑ "Encuesta sobre servidores web de febrero de 2020" . Netcraft . 20 de febrero de 2020. Archivado del original el 17 de abril de 2021. Consultado el 8 de abril de 2021 .
- ↑ "Encuesta sobre servidores web de febrero de 2019" . Netcraft . 28 de febrero de 2019. Archivado del original el 15 de abril de 2021. Consultado el 8 de abril de 2021 .
- ↑ "Encuesta sobre servidores web de febrero de 2018" . Netcraft . 13 de febrero de 2018. Archivado del original el 17 de abril de 2021. Consultado el 8 de abril de 2021 .
- ↑ "Encuesta sobre servidores web de febrero de 2017" . Netcraft . 27 de febrero de 2017. Archivado del original el 14 de marzo de 2017. Consultado el 13 de marzo de 2017 .
- ↑ "Encuesta de servidores web de febrero de 2016" . Netcraft . 22 de febrero de 2016. Archivado del original el 27 de enero de 2022. Consultado el 27 de enero de 2022 .
Enlaces externos
- Mozilla: ¿Qué es un servidor web?
- Netcraft: novedades sobre la encuesta de servidores web