6.3 Apache

Apache es un servidor Web. De hecho, es el servidor Web más difundido actualmente (http://news.netcraft.com/archives/web˙server˙survey.html). Si a esto sumamos que la Web es la aplicación más difundida en Internet, podemos asegurar que Apache es el servidor más extendido de la historia.

6.3.1 Instalación

Debian Linux:
 
root# apt-get install apache2

Fedora Core Linux:
 
root# yum install httpd

Gentoo Linux:
 
root# emerge apache

Taller 6.2:
Instale apache. Una vez instalado este paquete deberíamos poder conectarnos al servidor. Esto puede comprobarse si accedemos con el navegador a la URL:
http://hocalhost

y comprobamos que se lee un objeto Web (normalmente el fichero index.html que es el objeto por defecto cuando accedemos a un directorio).

También deberíamos tener acceso al servidor desde la línea de comandos:

root# apache2 -h  
 apache2 -h  
Usage: apache2 [-D name] [-d directory] [-f file]  
               [-C "directive"] [-c "directive"]  
               [-k start|restart|graceful|graceful-stop|stop]  
               [-v] [-V] [-h] [-l] [-L] [-t] [-S]  
Options:  
  -D name            : define a name for use in <IfDefine name> directives  
  -d directory       : specify an alternate initial ServerRoot  
  -f file            : specify an alternate ServerConfigFile  
  -C "directive"     : process directive before reading config files  
  -c "directive"     : process directive after reading config files  
  -e level           : show startup errors of level (see LogLevel)  
  -E file            : log startup errors to file  
  -v                 : show version number  
  -V                 : show compile settings  
  -h                 : list available command line options (this page)  
  -l                 : list compiled in modules  
  -L                 : list available configuration directives  
  -t -D DUMP_VHOSTS  : show parsed settings (currently only vhost settings)  
  -S                 : a synonym for -t -D DUMP_VHOSTS  
  -t -D DUMP_MODULES : show all loaded modules  
  -M                 : a synonym for -t -D DUMP_MODULES  
  -t                 : run syntax check for config files

Pruebe finalmente a usar el servidor Web que ha instalado desde el sistema operativo huésped (Windows). Para ello deberá averiguar la dirección IP que utiliza el host virtual (Debian) y especificar la URL usando dicha dirección.

6.3.2 Configuración

La configuración de Apache depende del contenido del directorio:

Debian Linux:
 
/etc/apache2/

Fedora Core Linux:
 
/etc/httpd/

Gentoo Linux:
 
/etc/apache2/

Dicho directorio contiene una serie de ficheros y directorios. El fichero de configuración principal es apache2.conf o httpd.conf (dependiendo de la distribución). El resto de ficheros de configuración son cargados desde éste.

Taller 6.3:
Localice el directorio con los ficheros de configuración de Apache.

Entre los directorios encontramos los que indican qué módulos hay disponibles y qué módulos hay habilitados (veremos más tarde qué son los módulos), así como qué sites hay disponibles y habilitados (esto está relacionado con los virtual hosts, más tarde también hablaremos de esto).

Cada vez que Apache es ejecutado (o re-ejecutado) se leen los ficheros de configuración que están bastante bien documentados. Dichos ficheros se organizan en secciones que contienen un conjunto de directivas. Cada directiva debe escribirse en una única línea. Veamos cómo controlar algunas de las posibilidades de Apache modificando dichas directivas y el contenido de los directorios de configuración:

Localización de los objetos Web en el servidor

La directiva DocumentRoot define el directorio que contiene los objetos Web del servidor. Dicha directiva cuando no se declara, tiene el siguiente valor por defecto:

Debian Linux:
 
/var/www/apache2-default

Fedora Core Linux:
 
/var/www/html

Gentoo Linux:
 
/var/www/localhost/htdocs

Taller 6.4:
Localice el directorio que almacena los objetos Web.

Apache además puede servir los objetos que se colocan en el directorio public_html de los usuarios. Por ejemplo, para acceder al directorio public_html del usuario “usuario” en la máquina local deberímos utilizar la URL:

http://localhost/~usuario

Para conseguir esto debemos hacer lo siguiente:

  1. Cargar el módulo “userdir”. Apache es capaz de realizar las más diversas tareas que se le pueden encargar a un servidor Web. Como hay muchos usuarios que no utilizan a la vez todas las posibilidades, el servidor se ha diseñado de forma modular. Por tanto, dependiendo de la tarea que deseamos realizar habrá que cargar el módulo correspondiente. En este caso necesitamos cargar el módulo “userdir” (si es que no está ya cargado).
    # Comprobamos si el módulo "userdir" está cargado  
    root# apache2 -M  
    Loaded Modules:  
     core_module (static)  
     log_config_module (static)  
     :  
     status_module (shared)  
    Syntax OK  
     
    # Esto también puede hacerse mostrando el contenido del directorio:  
    root# ls -l /etc/apache2/mods-enabled/  
    total 0  
    lrwxrwxrwx 1 root root 40 2007-01-08 18:51 actions.load ->\  
     /etc/apache2/mods-available/actions.load  
    lrwxrwxrwx 1 root root 28 2007-01-03 16:03 alias.load -> ../mods-available/alias.load  
    :  
    lrwxrwxrwx 1 root root 29 2007-01-03 16:03 status.load -> ../mods-available/status.load  
    # Aunque aquí sólo aparecerían los módulos de tipo "shared", que no se  
    # instalan por defecto en el servidor  
     
    # Si no lo está, configuramos Apache para que lo carge  
    root# a2enmod userdir  
     
    # Forzamos a Apache a leer todos los módulos  
    root# /etc/init.d/apache2 force-reload

  2. Crear el directorio que almacena los objetos Web:
    # Creamos el directorio  
    usuario$ mkdir public_html  
     
    # Comprobamos que tenga premisos de lectura y de acceso  
    usuario$ ls -la public_html/  
    total 8  
    drwxr-xr-x  2 usuario usuario 4096 2007-01-13 13:27 .  
    drwxr-xr-x 14 usuario usuario 4096 2007-01-13 13:27 ..  
     
    # Copiamos un fichero con un objeto Web  
    usuario$ cp /var/www/apache2-default/index.html public_html  
     
    # Comprobamos que tenemos acceso a dicho fichero  
    usuario$ firefox http://localhost/~usuario &

Taller 6.5:
Habilite Apache para que los usuarios puedan publicar objetos Web en sus directorios public_html. Compruebe que el servicio funciona correctamente.

Por ser la primera vez que se muestra cómo se instala un módulo en Apache, mostraremos además cómo se desinstala:

root# a2dismod userdir  
root# /etc/init.d/apache2 force-reload

Taller 6.6:
Desinstale e instale (de nuevo) el módulo userdir. Compruebe ambas situaciones comprobando si el módulo está funcionando.

Binding

Apache por defecto escucha en el puerto 80 a través de todos los interfaces de red de los que dispone el host. Este comportamiento puede modificarse para:

Escuchar en un puerto distinto del 80:
Esto se hace a través de la directiva Listen. Ejemplo:
# Usando un editor de ficheros ASCII, buscar en el fichero de  
# configuración de Apache la directiva "Listen 80" y cambiarla por  
# "Listen 8080". Si dicha directiva aparece en el fichero  
# "/etc/apache2/ports.conf", esto puede hacerse también con los  
# siguientes comandos:  
root# sed ’s/80/8080/g;’ /etc/apache2/ports.conf > /etc/apache2/ports.conf.new  
root# mv /etc/apache2/ports.conf.new /etc/apache2/ports.conf  
 
# Re-iniciamos Apache.  
root# /etc/init.d/apache2 restart  
 
# Comprobamos el cambio.  
usuario$ firefox http://localhost:8080 &  
 
# Deshacemos el cambio.  
root# sed ’s/8080/80/g;’ /etc/apache2/ports.conf > /etc/apache2/ports.conf.new  
root# mv /etc/apache2/ports.conf.new /etc/apache2/ports.conf  
 
# Reiniciamos Apache  
root# /etc/init.d/apache2 restart

Taller 6.7:
Realice las modificaciones oportunas para que Apache escuche en el puerto 8080 y compruebe que realmente es así. Finalmente deshaga dichas modificaciones y compruebe que Apache vuelve e escuchar en el puerto 80.
Escuchar en más de un puerto:
Ejemplo:
root# cat >> /etc/apache2/ports.conf << EOF  
Listen 8080  
EOF  
 
# Reiniciamos Apache  
root# /etc/init.d/apache2 restart  
 
# Comprobación  
usuario$ firefox http://localhost:80 &  
usuario$ firefox http://localhost:8080  
 
# Desahacemos el cambio.  
root# sed ’s/Listen 8080//g;’ /etc/apache2/ports.conf > /etc/apache2/ports.conf.new  
root# mv /etc/apache2/ports.conf.new /etc/apache2/ports.conf  
 
# Reiniciamos Apache  
root# /etc/init.d/apache2 restart

Taller 6.8:
Realice las modificaciones oportunas para que Apache escuche simultaneamente en los puertos 80 y 8080, y compruebe que realmente es así. Finalmente deshaga dichas modificaciones.
Escuchar por diferentes direcciones IP y mostrando diferentes objetos Web:
... en función de la dirección IP utilizada por el cliente. Aunque no es muy frecuente, sí que es posible instalar en un host más de un adaptador de red, cada uno configurado con una dirección IP distinta. En este contexto se puede configurar Apache para que sirva diferentes objetos Web en función del adaptador por el que recibe las peticiones. A esta cualidad de Apache se le llama IP-based Virtual Hosting. Para ver un ejemplo nos vamos a aprovechar de que el host con el que estamos trabajando tiene asignadas dos direcciones IP diferentes, una para localhost y otra para el nombre de la máquina debian.
# Comprobamos la primera dirección IP.  
usuario$ ping -c 1 localhost  
PING localhost (127.0.0.1) 56(84) bytes of data.  
64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.739 ms  
 
--- localhost ping statistics ---  
1 packets transmitted, 1 received, 0% packet loss, time 0ms  
rtt min/avg/max/mdev = 0.739/0.739/0.739/0.000 ms  
 
# Comprobamos la segunda (nótese que ahora es .1.1)  
usuario$ ping -c 1 debian  
PING debian.localdomain (127.0.1.1) 56(84) bytes of data.  
64 bytes from debian.localdomain (127.0.1.1): icmp_seq=1 ttl=64 time=0.048 ms  
 
--- debian.localdomain ping statistics ---  
1 packets transmitted, 1 received, 0% packet loss, time 0ms  
rtt min/avg/max/mdev = 0.048/0.048/0.048/0.000 ms  
 
# Añadimos el host virtual.  
root# cat >> /etc/apache2/apache2.conf << EOF  
 
<VirtualHost debian>  
  DocumentRoot /var/www/debian/  
</VirtualHost>  
EOF  
 
# Creamos el nuevo "site".  
root# mkdir /var/www/debian  
 
# Metemos dentro un objeto.  
root# cp /var/www/apache2-default/index.html /var/www/debian/  
 
# Lo cambiamos un poco:  
root# sed ’s/It works!/Funciona!/g;’ /var/www/debian/index.html >\  
 /var/www/debian/index.html.new  
root# mv /var/www/debian/index.html.new /var/www/debian/index.html  
 
# Reiniciamos Apache  
root# /etc/init.d/apache2 restart  
 
# ¿Funciona?  
usuario$ firefox localhost &  
usuario$ firefox debian

Taller 6.9:
Realice las anteriores configuraciones y compruebe que funcionan.
Escuchar en una única dirección IP, pero mostrando diferentes objetos:
... en función del alias del servidor que utiliza el cliente. El DNS tiene la posibilidad de asignar más de un nombre a una dirección IP. A uno de estos nombres se le conoce como nombre canónico y al resto como aliases. Aprovechándonos de esta posibilidad, el servidor Apache puede servir un conjunto de objetos Web diferente en función el alias que está usando el cliente para reclamar los objetos al servidor. De esta forma parecerá que estamos accediendo a un servidor ejecutado en otra máquina diferente, cuando en realidad estamos utilizando el mismo. A esta posibilidad se le conoce como Name-based Virtual Hosting. Un ejemplo:
# Añadimos un alias del host en el DNS.  
root# sed \  
’s/127.0.1.1\tdebian.localdomain\tdebian/127.0.1.1\tdebian.localdomain\tdebian\talias_debian/g’\  
 /etc/hosts > /etc/hosts.new  
root# mv /etc/hosts.new /etc/hosts  
 
usuario$ ping -c 1 alias_debian  
PING debian.localdomain (127.0.1.1) 56(84) bytes of data.  
64 bytes from debian.localdomain (127.0.1.1): icmp_seq=1 ttl=64 time=0.060 ms  
 
--- debian.localdomain ping statistics ---  
1 packets transmitted, 1 received, 0% packet loss, time 0ms  
rtt min/avg/max/mdev = 0.060/0.060/0.060/0.000 ms  
 
# Añadimos el host virtual.  
root# cat >> /etc/apache2/apache2.conf << EOF  
 
NameVirtualHost alias_debian  
<VirtualHost alias_debian>  
  DocumentRoot /var/www/alias_debian/  
</VirtualHost>  
EOF  
 
# Creamos el nuevo "site".  
root# cp -rav /var/www/debian/ /var/www/alias_debian  
 
# Lo cambiamos un poco:  
root# sed ’s/Funciona!/Funciona de nuevo!/g’ /var/www/alias_debian/index.html\  
 > /var/www/alias_debian/index.html.new  
root# mv /var/www/alias_debian/index.html.new /var/www/alias_debian/index.html  
 
# Reiniciamos Apache  
root# /etc/init.d/apache2 restart  
 
# ¿Funciona?  
usuario$ firefox alias_debian &

Taller 6.10:
Realice las anteriores configuraciones y compruebe que funcionan.