11.2. Servidor web (HTTP)
Los administradores de Falcot Corp decidieron utilizar el servidor HTTP Apache, cuya versión 2.4.10 estaba incluida en la distribucion Debian Wheezy.
11.2.1. Instalación de Apache
Installing the apache2 package is all that is needed. It contains all the modules, including the Multi-Processing Modules (MPMs) that affect how Apache handles parallel processing of many requests (those used to be provided in separate apache2-mpm-* packages). It will also pull apache2-utils containing the command line utilities that we will discover later.
The MPM in use affects significantly the way Apache will handle concurrent requests. With the worker MPM, it uses threads (lightweight processes), whereas with the prefork MPM it uses a pool of processes created in advance. With the event MPM it also uses threads, but the inactive connections (notably those kept open by the HTTP keep-alive feature) are handed back to a dedicated management thread.
The Falcot administrators also install libapache2-mod-php5 so as to include the PHP support in Apache. This causes the default event MPM to be disabled, and prefork to be used instead, since PHP only works under that particular MPM.
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/
).
With its default configuration, the web server listens on port 80 (as configured in /etc/apache2/ports.conf
), and serves pages from the /var/www/
directory (as configured in /etc/apache2/sites-enabled/000-default.conf
).
11.2.2. 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).
The default configuration for Apache 2 enables name-based virtual hosts. In addition, a default virtual host is defined in the /etc/apache2/sites-enabled/000-default.conf
file; this virtual host will be used if no host matching the request sent by the client is found.
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.16. The /etc/apache2/sites-available/www.falcot.org.conf
file
<VirtualHost *:80>
ServerName www.falcot.org
ServerAlias falcot.org
DocumentRoot /srv/www/www.falcot.org
</VirtualHost>
The Apache server, as configured so far, uses the same log files for all virtual hosts (although this could be changed by adding CustomLog
directives in the definitions of the virtual hosts). It therefore makes good sense to customize the format of this log file to have it include the name of the virtual host. This can be done by creating a /etc/apache2/conf-available/customlog.conf
file that defines a new format for all log files (with the LogFormat
directive) and by enabling it with a2enconf customlog
. The CustomLog
line must also be removed (or commented out) from the /etc/apache2/sites-available/000-default.conf
file.
Ejemplo 11.17. The /etc/apache2/conf.d/customlog.conf
file
# 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.3. 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.18. Bloque Directory
<Directory /var/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
también le indica al servidor que siga los enlaces simbólicos, pero sólo cuando el enlace y su objetivo tengan el mismo dueño.
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 pedido.
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.3.1. Autenticación obligatoria
En algunas cirucunstancia necesitará restringir el acceso a partes de un sitio web, de forma que sólo usuarios legítimos que provean un nombre de usuario y una contraseña tengan acceso al contenido.
Ejemplo 11.19. 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.3.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.20. Sólo permitir desde la red local
Require ip 192.168.0.0/16
11.2.4. 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.21. Archivo de configuración de AWStats para un servidor virtual
Include "/etc/awstats/awstats.conf"
SiteDomain="www.falcot.org"
HostAliases="falcot.org"
AWStats utiliza varios íconos almacenados en el directorio /usr/share/awstats/icon/
. Para que éstos estén disponibles en el sitio web, necesita adaptar la configuración de Apache para incluir la siguiente directiva:
Alias /awstats-icon/ /usr/share/awstats/icon/
Luego de unos minutos (y una vez que el script ejecutó varias veces), los resultados estarán disponibles en el sitio web: