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://localhost

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] [-X]  
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  
  -X                 : debug mode (only one worker, do not detach)

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 “alumno” en la máquina local deberímos utilizar la URL:

http://localhost/~alumno

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  
    alumno$ mkdir public_html  
     
    # Comprobamos que tenga premisos de lectura y de acceso  
    alumno$ ls -la public_html/  
    total 8  
    drwxr-xr-x  2 alumno alumno 4096 2007-01-13 13:27 .  
    drwxr-xr-x 14 alumno alumno 4096 2007-01-13 13:27 ..  
     
    # Copiamos un fichero con un objeto Web  
    alumno$ cp /var/www/apache2-default/index.html public_html  
     
    # Comprobamos que tenemos acceso a dicho fichero  
    alumno$ firefox http://localhost/~alumno &

_____________________________________________________________

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

_________________________________________________________________

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  
# Ojo que es posible que además haya que modificar algún fichero extra!  
# Léase detenidamente los comentarios en /etc/apache2/ports.conf  
# acerca de esta posibilidad.  
 
# Re-iniciamos Apache.  
root# /etc/init.d/apache2 restart  
 
# Comprobamos el cambio.  
alumno$ 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  
alumno$ firefox http://localhost:80 &  
alumno$ 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 lab-redes.
# Comprobamos la primera dirección IP.  
alumno$ 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)  
alumno$ ping -c 1 lab-redes  
PING lab-redes.localdomain (127.0.1.1) 56(84) bytes of data.  
64 bytes from lab-redes.localdomain (127.0.1.1): icmp_seq=1 ttl=64 time=0.048 ms  
 
--- lab-redes.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 lab-redes>  
  DocumentRoot /var/www/lab-redes/  
</VirtualHost>  
EOF  
 
# Creamos el nuevo "site".  
root# mkdir /var/www/lab-redes  
 
# Metemos dentro un objeto.  
root# cp /var/www/apache2-default/index.html /var/www/lab-redes/  
 
# Lo cambiamos un poco:  
root# sed "s/It works/Funciona/g;" /var/www/lab-redes/index.html >\  
 /var/www/lab-redes/index.html.new  
root# mv /var/www/lab-redes/index.html.new /var/www/lab-redes/index.html  
 
# Reiniciamos Apache  
root# /etc/init.d/apache2 restart  
 
# ¿Funciona?  
alumno$ firefox localhost &  
alumno$ firefox lab-redes

_____________________________________________________________

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\tlab-redes.localdomain\tlab-redes/127.0.1.1\tlab-redes.localdomain\tlab-redes\talias_lab-redes/g"\  
 /etc/hosts > /etc/hosts.new  
root# mv /etc/hosts.new /etc/hosts  
 
alumno$ ping -c 1 alias_lab-redes  
PING lab-redes.localdomain (127.0.1.1) 56(84) bytes of data.  
64 bytes from lab-redes.localdomain (127.0.1.1): icmp_seq=1 ttl=64 time=0.060 ms  
 
--- lab-redes.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_lab-redes  
<VirtualHost alias_lab-redes>  
  DocumentRoot /var/www/alias_lab-redes/  
</VirtualHost>  
EOF  
 
# Creamos el nuevo "site".  
root# cp -rav /var/www/lab-redes/ /var/www/alias_lab-redes  
 
# Lo cambiamos un poco:  
root# sed "s/Funciona/Funciona de nuevo/g" /var/www/alias_lab-redes/index.html\  
 > /var/www/alias_lab-redes/index.html.new  
root# mv /var/www/alias_lab-redes/index.html.new /var/www/alias_lab-redes/index.html  
 
# Reiniciamos Apache  
root# /etc/init.d/apache2 restart  
 
# ¿Funciona?  
alumno$ firefox alias_lab-redes &

_____________________________________________________________

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

____________________________________________