Product SiteDocumentation Site

11.2. Servidor web (HTTP)

The Falcot Corp administrators decided to use the Apache HTTP server, included in Debian Bookworm at version 2.4.59.

11.2.1. Instalación de Apache

Lo único que necesita es instalar el paquete apache2. Contiene todos los módulos, incluídos los Módulos de Multi-proceso (MPMs), que afectan a cómo Apache gestiona el procesamiento en paralelo de muchas peticiones, que solían facilitarse en los paquetes separados apache2-mpm-*". Arrastrará también apache2-utils, que contiene las utilidades de linea de órdenes que descubriremos más tarde.
El uso de MPM en Apache afecta significativamente al manejo de las peticiones concurrentes. Con el worker MPM, se usan hilos (procesos ligeros) mientras que con prefork MPM usa un conjunto de procesos creados préviamente. Con el uso de event MPM tambien usa hilos pero las conexiones inactivas (las que se mantienen abiertas por la característica keep-alive de HTTP) son llevadas por el gestor de hilos dedicado.
The Falcot administrators also install libapache2-mod-php so as to include the PHP 8.2 support in Apache. This causes the default event MPM to be disabled, and prefork to be used instead. To use the event MPM one can use php-fpm.
Apache es un servidor modular y mucha funcionalidad está implementada por módulos externos que el programa principal carga durante su inicialización. La configuración predeterminada sólo activa los módulos más comunes, pero activar nuevos módulos es tan simple como ejecutar a2enmod módulo; similarmente, podrá desactivar un módulo ejecutando a2dismod módulo. En realidad, estos programas sólo crean (o eliminan) enlaces simbólicos en /etc/apache2/mods-enabled/ que apuntan a los archivos en sí (almacenados en /etc/apache2/mods-available/).
Con su configuración predeterminada, el servidor web escuchará en el puerto 80 (según se encuentra configurado en /etc/apache2/ports.conf) y servirá páginas del directorio /var/www/html/ (según se encuentra configurado en /etc/apache2/sites-enabled/000-default.conf).

11.2.2. Añadiendo soporte para SSL

Apache 2.4, así como viene, incluye el módulo SSL (mod_ssl) necesario para HTTP seguro (HTTPS). Sólo necesita activarlo con a2enmod ssl y luego agregar las directivas necesarias a los archivos de configuración. Puede encontrar un archivo de configuración de ejemplo en /etc/apache2/sites-available/default-ssl.conf.
Si quiere generar certificados de confianza, puede seguir la sección Sección 10.2.1, “Crear certificados de confianza gratuitos” y luego ajustar las siguientes variables:
SSLCertificateFile      /etc/letsencrypt/live/DOMINIO/fullchain.pem
SSLCertificateKeyFile   /etc/letsencrypt/live/DOMINIO/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/DOMINIO/chain.pem
SSLCACertificateFile    /etc/ssl/certs/ca-certificates.crt
Some extra care must be taken if you want to favor SSL connections with Perfect Forward Secrecy (those connections use ephemeral session keys ensuring that a compromise of the server's secret key does not result in the compromise of old encrypted traffic that could have been stored while sniffing on the network). Have a look at Mozilla's recommendations in particular:
As an alternative to the standard SSL module, there is an extension module called mod_gnutls, which is shipped with the libapache2-mod-gnutls package and enabled with the a2enmod gnutls command. Unfortunately the version packaged for Debian had serious issues and even security implications and is therefor not part of Debian Stable since the Bullseye release.

11.2.3. Configuración de servidores virtuales («virtual hosts»)

Un servidor virtual es una identidad adicional para el servidor web.
Apache considera dos tipos distintos de servidores virtuales: aquellos basados en la dirección IP (o puerto) y aquellos basados en el nombre de dominio del servidor web. El primer método requiere reservar una dirección IP (o puerto) diferente para cada sitio, mientras que el segundo puede funcionar en sólo una dirección IP (y puerto) y se diferencian los sitios por el nombre enviado por el cliente HTTP (que sólo funciona en la versión 1.1 del protocolo HTTP — afortunadamente esta versión es suficientemente antigua para que todos los clientes ya lo utilicen).
La escasez (creciente) de direcciones IPv4 generalmente favorece el segundo método; sin embargo, es más complejo si los servidores virtuales también necesitan proveer HTTPS ya que el protocolo SSL no siempre se adecuó a los servidores virtuales basados en nombres; no todos los navegadores son compatibles con la extensión SNI (indicación de nombre de servidor: «Server Name Indication») que permite esta combinación. Cuando varios sitios HTTPS necesitan ejecutar en el mismo servidor, generalmente se diferenciarán bien por ejecutar en un puerto o en una dirección IP diferente (IPv6 puede ayudar).
La configuración predeterminada de Apache 2, activa servidores virtuales basados en nombre. Además, define un servidor virtual predeterminado en el archivo /etc/apache2/sites-enabled/000-default.conf; utilizará este servidor virtual si no se encuentra ningún servidor que coincida con el pedido enviado por el cliente.
Luego puede describir cada servidor virtual adicional con un archivo almacenado en /etc/apache2/sites-available/. La configuración de un sitio web para el dominio falcot.org es tan simple como crear el siguiente archivo y luego habilitar el servidor virtual con a2ensite www.falcot.org.

Ejemplo 11.13. El archivo /etc/apache2/sites-available/www.falcot.org.conf

<VirtualHost *:80>
ServerName   www.falcot.org
ServerAlias  falcot.org
DocumentRoot /srv/www/www.falcot.org
</VirtualHost>
El servidor Apache, como está configurado hasta ahora, utiliza los mismos archivos de registro para todos los servidores virtuales (puede cambiarlo agregando directivas CustomLog en las definiciones de servidores virtuales). Por lo tanto, tiene sentido personalizar el formato de este archivo de registro para incluir el nombre del servidor virtual. Puede hacerlo creando un archivo /etc/apache2/conf-available/customlog.conf que define un nuevo formato para todos los archivos de registro (con la directiva LogFormat) y habilitándolo con la orden a2enconf customlog. También debe eliminar (o comentar) la línea CustomLog del archivo /etc/apache2/sites-available/000-default.conf.

Ejemplo 11.14. El archivo /etc/apache2/conf-available/customlog.conf

# Nuevo formato de registro que incluye el nombre del servidor (virtual)
LogFormat "%v %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" vhost

# Ahora utilicemos este formato de forma predeterminada
CustomLog /var/log/apache2/access.log vhost

11.2.4. Directivas comunes

Esta sección revisa brevemente alguna de las directivas de configuración de Apache más utilizadas.
El archivo de configuración principal generalmente incluye varios bloques Directory que permiten diferentes comportamientos del servidor dependiendo de la ubicación del archivo que está proveyendo. Tales bloques usualmente incluyen directivas Options y AllowOverride.

Ejemplo 11.15. Bloque Directory

<Directory /srv/www>
Options Includes FollowSymlinks
AllowOverride All
DirectoryIndex index.php index.html index.htm
</Directory>
La directiva DirectoryIndex contiene una lista de archivos a intentar cuando el pedido del cliente es un directorio. El primer archivo de la lista que exista será utilizado y enviado como respuesta.
La directiva Options debe seguirse de una lista de opciones a activar. El valor None desactiva todas las opciones; correspondientemente, All las activa todas excepto MultiViews. Las opciones disponibles incluyen:
  • ExecCGI indica que puede ejecutar scripts CGI.
  • FollowSymlinks le dice al servidor que puede seguir los enlaces simbólicos y que la respuesta debe contener el contenido del objetivo de dichos enlaces.
  • SymlinksIfOwnerMatch also tells the server to follow symbolic links, but only when the link and its target have the same owner.
  • Includes activa inclusiones del lado del servidor (SSI: «Server Side Includes»). Estas directivas se encuentran en las páginas HTML y son ejecutadas en el momento de cada petición.
  • IncludesNOEXEC permite inclusiones del lado del servidor (SSI: «Server Side Includes»), pero desabilita la orden exec y limita la directiva include a archivos de texto/marcado.
  • Indexes le indica al servidor que provea una lista del contenido de los directorios si el pedido HTTP del cliente apunta a un directorio sin un archivo de índice (es decir, que no existe en él ninguno de los archivos enumerados en la directiva DirectoryIndex).
  • MultiViews activa la negociación de contenido; el servidor puede utilizar esto para proveer una página web que utilice el idioma preferido configurado en el navegador.
La directiva AllowOverride enumera todas las opciones que pueden ser activadas o desactivadas en un archivo .htaccess. Un uso común de esta opción es restringir ExecCGI para que los administradores puedan elegir los usuarios que podrán ejecutar programas bajo la identidad del servidor web (el usuario www-data).

11.2.4.1. Autenticación obligatoria

In some circumstances, access to part of a website needs to be restricted, so only legitimate users who provide a username and a password are granted access to the contents. These feature are provided by the mod_auth* modules.

Ejemplo 11.16. Archivo .htaccess para autenticación obligatoria

Require valid-user
AuthName "Private directory"
AuthType Basic
AuthUserFile /etc/apache2/authfiles/htpasswd-private
El archivo /etc/apache2/authfiles/htpasswd-private contiene una lista de usuarios y contraseñas; usualmente lo manipulará con el programa htpasswd. Por ejemplo, ejecute lo siguiente para agregar un usuario o cambiar su contraseña:
# htpasswd /etc/apache2/authfiles/htpasswd-private usuario
New password:
Re-type new password:
Adding password for user usuario

11.2.4.2. Restricción de acceso

Las directiva Require controla las restricciones de acceso a un directorio (y sus subdirectorios de forma recursiva).
Puede usarse para restringir el acceso basado en varios criterios; Pararemos describiendo la restricción de acceso basada en la dirección IP del cliente, pero puede realizarse de un modo mucho más potente que eso, especificando varias directivas Require combinadas con un bloque RequireAll.

Ejemplo 11.17. Solo permitir desde la red local

Require ip 192.168.0.0/16

11.2.5. Analizadores de registros

Generalmente se instala un analizador de registros en un servidor web; ya que éste provee a los administradores una idea precisa sobre los patrones de uso del servidor.
Los administradores de Falcot Corp seleccionaron AWStats (estadísticas web avanzadas: «Advanced Web Statistics) para analizar sus archivos de registro de Apache.
El primer paso de configuración es personalizar el archivo /etc/awstats/awstats.conf. Los administradores de Falcot lo mantuvieron sin cambios más que los siguientes parámetros:
LogFile="/var/log/apache2/access.log"
LogFormat = "%virtualname %host %other %logname %time1 %methodurl %code %bytesd %refererquot %uaquot"
SiteDomain="www.falcot.com"
HostAliases="falcot.com REGEX[^.*\.falcot\.com$]"
DNSLookup=1
LoadPlugin="tooltips"
Todos estos parámetros están documentados con comentarios en el archivo de la plantilla. En particular, los parámetros LogFile y LogFormat describen la ubicación y el formato del archivo de registros y la información que contiene; SiteDomain y HostAliases enumeran los varios nombres con los que se conocerá el sitio web principal.
En sitios con mucho tráfico, no debería definir DNSLookup como 1; para sitios más pequeños, como el de Falcot ya descripto, esta configuración permite conseguir reportes más legibles que incluyen nombres completos de equipos en lugar de sólo direcciones IP.
AWStats también estará activo para otros servidores virtuales; cada servidor virtual necesita su propio archivo de configuración, como /etc/awstats/awstats.www.falcot.org.conf.

Ejemplo 11.18. Archivo de configuración de AWStats para un servidor virtual

Include "/etc/awstats/awstats.conf"
SiteDomain="www.falcot.org"
HostAliases="falcot.org"
AWStats uses many icons stored in the /usr/share/awstats/icon/ directory. In order for these icons to be available on the web site, the Apache configuration needs to be adapted to include the following directive (check out /usr/share/doc/awstats/examples/apache.conf for a more detailed example):
Alias /awstats-icon/ /usr/share/awstats/icon/
After a few minutes (and once the script has been run a few times), the results are available online: