Programación de un servidor web Apache en GNU/Linux

Servidor Apache.
Información sobre la plantilla
Httpapache.jpg
Sistemas Operativos compatiblesLinux

Servidores Apache. Apache es el servidor web más usado en sistemas Linux. Los servidores web se usan para servir páginas web solicitadas por equipos cliente. Los clientes normalmente solicitan y muestran páginas web mediante el uso de navegadores web como Firefox, Opera o Mozilla.

Introducción a los Servidores Apache

Los usuarios introducen un Localizador de Recursos Uniforme (Uniform Resource Locator, URL) para señalar a un servidor web por medio de su Nombre de Dominio Totalmente Cualificado (Fully Qualified Domain Name, FQDN) y de una ruta al recurso solicitado. Por ejemplo, para ver la página web del sitio web de Ubuntu, un usuario debería introducir únicamente el FQDN. Para solicitar información específica acerca del soporte de pago, un usuario deberá introducir el FQDN seguido de una ruta. El protocolo más comúnmente utilizado para ver páginas Web es el Hyper Text Transfer Protocol(HTTP). Protocolos como el Hyper Text Transfer Protocol sobre Secure Sockets Layer (HTTPS) y File Transfer Protocol (FTP), un protocolo para subir y descargar archivos, también son soportados. Los servidores web Apache a menudo se usan en combinación con el motor de bases de datos MySQL, el lenguaje de script PHP y otros lenguajes de script populares como Python y Perl. Esta configuración se denomina LAMP(Linux, Apache, MySQL y Perl/Python/PHP) y conforma una potente y robusta plataforma para el desarrollo y distribución de aplicaciones basadas en la web. Apache está diseñado para ejecutarse como un proceso daemon standalone. En esta forma crea un conjunto de procesos hijo que manejarán las peticiones de entrada. También puede ejecutarse como Internet daemon a través de inetd, por lo cual se pondrá en marcha cada vez que se reciba una petición. La configuración del servidor puede ser extremadamente compleja según las necesidades (consultad la documentación), sin embargo, aquí veremos una configuración mínima aceptable. Los archivos de configuración se encuentran en /etc/apache2 y entre ellos están apache2.conf (archivo principal de configuración), httpd.conf, ports.conf(para la configuración de host virtual)). Los archivos log se encuentran en /var/log/apache2 y entre ellos están error.log (registra los errores en las peticiones del servidor) y access.log (registro de quién y a qué ha accedido). Apache se pone en marcha desde el script de inicio /etc/init.d/apache2, pero puede controlarse manualmente mediante el comando apache2ctl. El directorio por defecto es:

• /var/www: directorio de documentos HTML. • /usr/lib/cgi-bin: directorio de ejecutables (cgi) por el servidor. El archivo por defecto es index.html.

Instalación del Apache

Procedemos a arrancar nuestro servidor y nos logueamos como (root). Seguidamente instalaremos el paquete Apache2.

apt-get install apache2

Debian configura básicamente el servidor y lo pone en marcha. Se puede comprobar que funciona abriendo un navegador (por ejemplo, el Konqueror, Mozilla Firefox, etc y poniendo en la barra de URL http://localhost, lo cual cargará la página /var/www/index.html) y veremos el mensaje (It works). Este mensaje quiere decir que el servidor Web Apache está funcionando y listo para servir contenido Web.

Configuración del servidor Apache

Apache se configura colocando directivas en archivos de configuración de texto plano. El archivo principal de configuración se llama apache2.conf. Además, se pueden añadir otros archivos de configuración mediante la directiva Include y se pueden usar comodines para incluir muchos archivos de configuración. Todas las directivas deben colocarse en alguno de esos archivos de configuración. Apache2 sólo reconocerá los cambios realizados en los archivos principales de configuración cuando se inicie o se reinicie. El servidor también lee un fichero que contiene los tipos mime de los documentos; el nombre de ese fichero lo establece la directiva TypesConfig y es mime.types por omisión. El archivo de configuración predeterminado de Apache2 es: /etc/apache2/apache2.conf. Puede editar este archivo para configurar el servidor Apache2. Podrá configurar el número de puertos, la raíz de documentos, los módulos, los archivos de registros, los hosts virtuales, etc.

Iniciar y detener un servidor apache.

Cuando realicemos cualquier cambio en los ficheros de configuración es necesario reiniciar el demonio de apache para ello:

/etc/init.d/apache2 start/stop/restart

o también:

Iniciar apache2ctl -k start

Detener apache2ctl -k stop

Reiniciar apache2ctl -k graceful

Opciones predeterminadas

Esta sección explica la configuración de las opciones predeterminadas del servidor Apache2. Por ejemplo, si deseas añadir un host virtual, las opciones que configuras para el host virtual tienen prioridad para ese host virtual. Para las directivas no definidas dentro de las opciones del host virtual, se usan los valores predeterminados.

• El DirectoryIndex es la página servida por defecto por el servidor cuando un usuario solicita el índice de un directorio añadiendo la barra de división (/) al final del nombre del directorio. Por ejemplo, cuando un usuario solicite la página http://www.ejemplo.com/este_directorio/, él obtendrá la página DirectoryIndex si existe, un listado del directorio generado por el servidor si no existe pero tiene especificada la opción Indexes o una página Permiso Denegado si no se cumplen ninguna de las condiciones anteriores. El servidor intentará buscar uno de los archivos listados en la directiva DirectoryIndex y devolverá el primero que encuentre. Si no encuentra ninguno de esos archivos y está establecida la opción Options Indexes para ese directorio, el servidor generará y devolverá una lista, en formato HTML, de los subdirectorios y archivos del directorio. El valor predeterminado, almacenado en /etc/apache2/apache2.conf, es «index.html index.cgi index.pl index.php index.xhtml». Por tanto, si Apache2 encuentra un archivo en un directorio solicitado que se ajusta a alguno de esos nombres, se mostrará el primero de todos.

• La directiva ErrorDocument te permite especificar un archivo que usará Apache2 para los eventos de error específicos. Por ejemplo, si un usuario solicita un recurso que no existe, se producirá un error 404 y (en base a la configuración predeterminada de Apache2), se mostrará el archivo /usr/share/apache2/error/HTTP_NOT_FOUND.html.var . Ese archivo no está en el DocumentRoot del servidor, sino que existe una directiva Alias en /etc/apache2/apache2.conf que redirige hacia /usr/share/apache2/error/ las solicitudes dirigidas al directorio /error. Para ver una lista de las directivas ErrorDocument predeterminadas, usa la orden: grep ErrorDocument /etc/apache2/apache2.conf

• De forma predeterminada, el servidor escribe los registros de las transferencias en el archivo /var/log/apache2/access.log. Puedes cambiar esto sitio a sitio en los archivos de configuración de su servidor virtual con la directiva CustomLog o también puedes omitirla para aceptar la opción predeterminada, especificada en /etc/apache2/apache2.conf. También puedes especificar el archivo en el que se registrarán los errores, por medio de la directiva ErrorLog, cuyo valor predeterminado es / var/log/apache2/error.log. Estos se mantienen separados de los registros de transferencias para ayudar en la resolución de problemas con su servidor Apache2. También puedes especificar la directiva LogFormat (consulta en /etc/apache2/apache2.conf su valor predeterminado).

• Algunas opciones son especificadas por directorio en lugar de por servidor. Una de estas directivas es Options. Un párrafo Directory es encerrado entre etiquetas XML, como estas:

<Directory /var/www/mynewsite>

Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch

...

...

</Directory>


La directiva Options dentro del párrafo Directory acepta uno o más de los siguientes valores (entre otros), separados por espacios:

• ExecCGI -Permite la ejecución de scripts CGI. Los scripts CGI no serán ejecutados si esta opción no fue escogida. Nota: Muchos archivos no deberían ser ejecutados como scripts CGI. Esto podría resultar muy peligroso. Los scripts CGI deberían mantenerse en un directorio separado fuera de su DocumentRoot y dicho directorio debería ser el único que tuviese activada la opción ExecCGI. Así está establecido desde el principio y la ubicación predeterminada para los scripts CGI es /usr/lib/cgi-bin.

• Includes -Permite «server-side includes». Éstos, permiten a un fichero HTML incluir otros ficheros. No es una opción muy común, consulte el Apache2 SSL para más información. • IncludesNOEXEC -Permite «server-side includes», pero deshabilita los #exec y #include en los scripts CGI. • Indexes -Muestra una lista formateada del contenido de los directorios, si no existe el DirectoryIndex (como el index.html) en el directorio solicitado. • MultiViews -Soporte para vistas múltiples negociadas por contenido; esta opción está desactivada de forma predeterminada por motivos de seguridad. • SymLinksIfOwnerMatch -Solo seguirá enlaces simbólicos si el directorio de destino es del mismo usuario que el enlace.

Configuración de Servidores Virtuales

Los servidores virtuales te permiten ejecutar, en la misma máquina, diferentes servidores para diferentes direcciones IP, diferentes nombres de máquina o diferentes puertos. Por ejemplo, puedes tener los sitios web http://www.ejemplo.com y http://www.otroejemplo.com en el mismo servidor web usando servidores virtuales. Esta opción corresponde a la directiva <VirtualHost> para el servidor virtual predeterminado y para los servidores virtuales basados en IP. Corresponde a la directiva <NameVirtualHost> para un servidor virtual basado en el nombre. El conjunto de directivas para un servidor virtual sólo se aplican a un servidor virtual particular. Si una directiva se establece a nivel del servidor completo y no se define dentro de las opciones del servidor virtual, entonces se usarán las opciones predeterminadas. Por ejemplo, puedes definir una dirección de correo electrónico para el webmaster y no definir direcciones de correo individuales para cada servidor virtual. La directiva DocumentRoot apunta al directorio que contenga el documento raíz (como el index.html) para el host virtual. El DocumentRoot por defecto es /var/www. La directiva ServerAdmin dentro del apartado VirtualHost es la dirección de correo electrónico que se usa en el pie de las páginas de error si selecciona mostrar un pie de página con una dirección de correo cuando se muestran páginas de error. La configuración de host virtuales puede ser basada en ip, basada en nombre o las 2 configuraciones anteriores juntas.

Directivas

Apache2 trae una configuración predeterminada preparada para servidores virtuales. Viene configurado con un único servidor virtual predeterminado (usando la directiva VirtualHost) que se puede modificar o dejarlo tal cual si sólo tiene un único sitio web o usarlo como plantilla para servidores virtuales adicionales si tienes varios sitios web. Si se deja solo, el servidor virtual predeterminado funcionará como tu servidor predeterminado, o los usuarios del sitio web verán si la URL que introducen no concuerda con la directiva ServerName de cualquiera de tus sitios personalizados. Para modificar el servidor virtual predeterminado, edita el archivo /etc/apache2/sites-available/default. Si deseas configurar un nuevo servidor o sitio virtual, copia ese archivo dentro del mismo directorio con el nombre que haya elegido. Por ejemplo: cp /etc/apache2/sites-available/default /etc/apache2/sites-available/misitio y edita el nuevo archivo para configurar el nuevo sitio usando algunas de las directivas que se describen a continuación.

• La directiva ServerAdmin especifica la dirección de correo del administrador del servidor. El valor por omisión es webmaster(arroba)localhost. Cambia esta dirección por alguna a la que le puedan llegar los mensajes que se le envíen (si tu eres el administrador del servicio). Si tu sitio web tiene algún problema, Apache2 mostrará un mensaje de error con el que aparecerá esta dirección de correo para que la gente pueda enviar un informe del error. La directiva se encuentra en el fichero de configuración de su sitio en /etc/apache2/sites-available. • La directiva Listen especifica el puerto (y opcionalmente, la dirección IP) por el que escuchará Apache2. Si no se especifica la dirección IP, Apache2 escuchará por todas las direcciones IP asignadas a la máquina en la que se ejecute. El valor predeterminado de la directiva Listen es 80. Cambiarlo a 127.0.0.1:80 provoca que Apache2 sólo escuche por su dispositivo loopback, de forma que no estará disponible para Internet. Cámbialo a 81 (por ejemplo) para cambiar el puerto por el que escucha o déjalo tal cual para que funcione normalmente. La directiva se puede encontrar y cambiar en su propio archivo de configuración /etc/apache2/ports.conf.

• La directiva ServerName es opcional y especifica con cual FQDN (Full Qualified Domain Name, Nombre de Dominio Totalmente Cualificado) responderá tu sitio web. El servidor virtual predeterminado no especifica ninguna directiva ServerName, por lo que responderá a todas las peticiones que no se ajusten a ninguna directiva ServerName en otro servidor virtual. Si acabas de adquirir el dominio tele.cu y desea asociar a él tu servidor, el valor de la directiva ServerName en el archivo de configuración de su servidor virtual debería ser tele.cu. Añade esta directiva al nuevo archivo de configuración virtual que creó previamente /etc/apache2/sites-available/minuevositio, que en este caso se llama tele.cu. También puedes desear que tu sitio responda a www.tele.cu, ya que muchos usuarios asumen que el prefijo www es apropiado. Para ello, usa la directiva ServerAlias. Puedes usar comodines en la directiva ServerAlias. Por ejemplo, ServerAlias *.tele.cu hará que tu sitio responda a cualquier solicitud de dominio que termine en .tele.cu. • La directiva DocumentRoot especifica dónde debe buscar Apache los archivos que forman el sitio. El valor predeterminado es /var/www. No hay ningún sitio configurado allí. Cambia este valor en el archivo de host virtual de tu sitio y recuerda crear ese directorio si fuese necesario. Ejemplo de configuración de host virtual para 2 sitios en mi servidor web

Basados en IP:

<VirtualHost 10.209.4.4>

ServerAdmin webmaster(arroba)mail.grm.jovenclub.cu

DocumentRoot /media/JOSE/Debian5

ServerName debian.grm.jovenclub.cu

ErrorLog /media/apache2/logs/error_log #si se desea cambiar la opción por defecto

TransferLog /media/tele/logs/access_log #si se desea cambiar la opción por defecto

</VirtualHost>

<VirtualHost 10.209.4.5>

ServerAdmin webmaster(arroba)mail.info.cu

DocumentRoot /media/info/www

ServerName www.info.cu

</VirtualHost>

Basados en nombre:

NameVirtualHost *:80

<VirtualHost *:80>

ServerName www.domain.tld

ServerAlias domain.tld *.domain.tld

DocumentRoot /www/domain

</VirtualHost>

<VirtualHost *:80>

ServerName www.otherdomain.tld

DocumentRoot /www/otherdomain

</VirtualHost>

Basados en IP y basados en nombres:

Listen 80

NameVirtualHost 172.20.30.40

<VirtualHost 172.20.30.40>

DocumentRoot /www/example1

ServerName www.example1.com

</VirtualHost>

<VirtualHost 172.20.30.40>

DocumentRoot /www/example2

ServerName www.example2.org

</VirtualHost>

<VirtualHost 172.20.30.40>

DocumentRoot /www/example3

ServerName www.example3.net

</VirtualHost>

IP-based <VirtualHost 172.20.30.50>

DocumentRoot /www/example4

ServerName www.example4.edu

</VirtualHost>

<VirtualHost 172.20.30.60>

DocumentRoot /www/example5

ServerName www.example5.gov

</VirtualHost>

Nota: Apache2 no procesa el directorio /etc/apache2/sites-available. Los enlaces simbólicos en /etc/apache2/sites-enabled apuntan a los sitios «disponibles». Usa la utilidad a2ensite (Apache2 Enable Site) para crear esos enlaces simbólicos, así:

a2ensite misitio

donde el archivo de configuración de su sitio es /etc/apache2/sites-available/minuevositio. Igualmente, se debe usar la utilidad a2dissite para deshabilitar sitios. Debian incluye sus propias herramientas para activar y desactivar tanto sitios web como módulos:

a2ensite-> Activa un sitio web.

a2dissite-> Desactiva un sitio web

a2enmod-> Activa un módulo de apache disponible en mods-available.

a2dismod->Desactiva un módulo.

Ejemplo: Para activar el soporte SSL

a2enmod ssl

Fuentes

  • Administración Avanzada de GNU/Linux. Josep Jorba Esteve y Remo Suppi Boldrito.
  • Implementación de Servidores con GNU/Linux. Joel Barrios Dueñas.