CONEXIÓN Y CONFIGURACIÓN DE INTERNET DESDE LINUX

Artículo 12: Servidor Web con APACHE

Autor: (c) Santiago Romero
Revista: NetOnline (Prensa Técnica) nº 23, Julio-1999


logo de apache

Disponiendo de Linux y de Apache nada nos impide montar un servidor Web en nuestro sistema, no sólo para una Intranets sino para que cualquier usuario de Internet vea nuestra página Web servida por nuestra propia máquina, incluyendo la posibilidad de ofrecer estos servicios a cualquier usuario de nuestro sistema.


Un servicio tan completo como es montar un servidor Web está al alcance de cualquiera con Apache y Linux, y por un precio nulo y una calidad profesional. No sólo dispondremos de nuestras páginas en el propio sistema, sin necesidad de acudir a nuestro ISP para realizar cambios en las mismas, sino que con Apache podremos, al mismo tiempo, dar servicio a otros usuarios de nuestro sistema, poniendo sus páginas Web al alcance del resto de usuarios de Internet ofreciendoles una direccion propia (del tipo http://nombre_maquina/~usuario), así como servir a máquinas internas de cualquier subred.

Algo así puede parecer complicado de instalar, montar y configurar, sobre todo teniendo en cuenta que Apache es uno de los servidores Web más extendidos en el mundo (1.2 millones de máquinas servidoras de http lo utilizan), pero al contrario de lo que lleva a pensar dicha tarea, montar un servidor Web básico es tan sencillo como instalar y copiar, como veremos a continuación de una manera práctica.


EL SERVIDOR APACHE

Apache nació del servidor httpd de la NCSA (v1.3) en 1995, a base de parches sobre el código ya existente y retomando ideas del mismo. Este conjunto de parches se ha convertido, actualmente, en uno de los mejores servidores de http por pleno derecho y capaz de competir directamente con otros servidores http basados en Unix en cuanto a flexibilidad, velocidad y rendimiento (por supuesto, ni siquiera entramos a compararlo con Windows NT, el cual necesita máquinas multiprocesador de hasta 1 GigaByte de RAM para poder competir con Apache compilado sin optimizaciones en las mismas máquinas, como puede verse en el último test de rendimiento realizado por MindCraft por encargo de Microsoft). Todo esto disponiendo del código del mismo, siendo totalmente gratuito, yendo a más, y con posibilidad de mantener sistemas con gran número de usuarios (recordemos que ciertos Sistemas Operativos rondan las cien o doscientas mil pesetas por un nº determinado de licencias, como puedan ser 8 licencias).

Y es que Apache está creado por programadores de http no contentos con los resultados de otros servidores disponibles, siempre sobre la base del clásico servidor de NCSA. El resultado es que a mediados de 1998 Apache funcionaba aproximadamente en 1.2 millones de servidores de Internet, y con unas expectativas de futuro realmente serias, como son incluir todas las nuevas especificaciones HTTP que vayan surgiendo, continuar siendo Open Source, y gracias a esto último, ser gratuítamente testeado por millones de personas en pro de su continua mejora, un panorama mucho más alentador que muchos servidores comerciales cerrados cuyos parches hay que comprar o instalar para la corrección de los bugs encontrados.

Por ejemplo, Apache es "Year 2000 compliant" (cumple las especificaciones para seguridad en el cambio de 2 dígitos del 2000 a partir de la versión 1.3), y es que Apache almacena las fechas mediante 4 dígitos (además los Sistemas Operativos Unix/Linux tienen como fecha límite de su función ftime() en el año 2038), y aunque el RFC indique que sólo se pueden usar fechas de 2 cifras para los años, cuando Apache ve una fecha menor de 70 asumirá que dicha fecha es del nuevo siglo.

Actualmente Apache soporta como servidor los Sistemas siguientes: AIX, AUX, BS2000-osd, DigitalUnix, FreeBSD, HPUX, IRIX, LiNUX, NetBSD, OS/2, ReliantUnix, Solaris, SUNOS y Win32.

En este texto veremos como instalar y configurar Apache en nuestro sistemas Linux tanto para un sólo usuario como para dar servicio a todos los usuarios de la máquina Linux con su propio dominio y espacio Web. Una información más completa está disponible en la Web de Apache (http://www.apache.org, como puede apreciarse en la figura 2) , en la publicación electrónica Apache Week (http://www.apacheweek.com) , o en alguno de los completos libros que se han publicado sobre Apache (ver títulos en la Web de Apache).


OBTENIENDO E INSTALANDO APACHE

Apache puede obtenerse directamente desde su página Web (www.apache.org) aunque normalmente estará incluido en el CD de nuestra distribución (por ejemplo, en el CD básico de Redhat 5.1 viene el rpm apache-1.2.6-4.i386.rpm). La versión estable actual de Apache es la 1.3.0, que podemos obtener allí en fuentes o ya compilada para diversos sistemas.

Otra posibilidad es acudir a los sitios FTP de las diferentes distribuciones (ftp.redhat.com, ftp.debian.org, ftp.suse.de, ftp.suse.com, etc.) o a mirrors o páginas Web de búsqueda de paquetes (www.redhat.com/mirrors.html o www.debian.org en la sección Search Debian Packages). Su compilación es muy sencilla aunque mucho más habitual es utilizar la versión ya compilada e instalarla, por ejemplo en formato rpm:


[sromero@compiler/sromero] rpm -i  apache-1.2.6-4.i386.rpm

Los binarios de Apache (httpd y compañía) se instalarán normalmente en /usr/local/bin o en usr/sbin, los ficheros de configuración en /etc/httpd/conf (aunque en algunas distribuciones se instala en /etc/apache), los logs en /etc/httpd/logs, y los manuales o documentación en /home/httpd/html/manual.


FICHEROS DE CONFIGURACIÓN

Los ficheros de configuración implicados en el mantenimiento y puesta en marcha inicial de Apache son /etc/httpd/conf/access.conf, /etc/httpd/conf/httpd.conf y /etc/httpd/conf/srm.conf (aunque como ya se ha comentado, según las distribuciones o nuestras elecciones durante la compilación pueden estar situados en /etc/apache o incluso en cualquier otro directorio).

El primero de ellos especifica las opciones básicas de acceso al servidor, como quién puede acceder y quién no, etc. El segundo fichero es el principal fichero de configuración, pudiendo especificar el tipo de servidor http, el puerto de acceso (normalmente 80), la dirección email del administrador del servidor, la dirección de los ficheros internos de Apache (normalmente /etc/httpd), los ficheros de logs a utilizar, número máximo de clientes simultáneos que se desean atender, la configuración de Caché-Proxy (que Apache también implementa), etc. El último de los ficheros de configuración permite especificar variables sobre las páginas en sí mismas y los directorios que las albergan, como la localización de las páginas, el nombre de directorios de usuarios (pronto veremos su utilidad), etc. En principio no necesitaremos modificar nada de dichos ficheros pues la configuración es muy sencilla y suele estar bajo las directrices ya marcadas por los ficheros de configuración.

Una de las cosas más básicas para utilizar el servidor Web es iniciarlo, pararlo, leer su estado o resetearlo, con el fin de poder realizar cambios en la configuración sin necesidad de reiniciar el sistema entero y dejar colgado durante unos minutos a todos los usuarios de la red. Para ello (en el caso de Redhat, por ejemplo) se debe arrancar o parar el daemon mediante alguno de los siguientes comandos:


/etc/rc.d/init.d/httpd start      -> Iniciar el daemon.
/etc/rc.d/init.d/httpd stop       -> Parar el daemon.
/etc/rc.d/init.d/httpd restart    -> Resetear el daemon.
/etc/rc.d/init.d/httpd status     -> Consultar estado.

Así pues, inmediatamente después de la instalación deberemos inicializar httpd mediante el primer comando (o mediante su equivalente si tenemos inet / httpd instalado en otro directorio) y posteriormente realizar una prueba para ver si la instalación ha sido correcta. Para ello una vez instalado e iniciado el daemon, dirigimos un navegador (Netscape, Lynx o similar) hacia nuestra propia máquina (hacia localhost, hacia nuestra IP o hacia el nombre de máquina que tengamos asociado), y comprobamos si nos aparece la página de prueba de Apache. (por ejemplo, dirigiendo Netscape a http://localhost, o a http://127.0.0.1). Si nos aparece dicha página, la instalación y configuración ha sido correcta y podemos empezar a modelar nuestro futuro servidor de Web.


SERVIDOR WEB BASICO

Si el anterior test fue un éxito, ya no será necesario realizar ningun otro cambio en la configuración, pues ya disponemos del servidor funcionando, y sólo deberemos incorporar al mismo las páginas que deseamos que aparezcan cuando alguien apunte su navegador hacia nuestra máquina. La manera de realizar esto es tan sencilla como copiar. Y es que todo aquello que cuelgue del directorio /home/httpd/html será visible mediante la IP de nuestra máquina. Es decir, si nosotros copiamos el fichero texto.html en /home/httpd/html, al escribir en Netscape la dirección http://localhost/texto.html, aparecerá en la pantalla del navegador el contenido de dicho documento.

Esto implica que si disponemos de una Web creada por nosotros con varios ficheros html, y directorios con imágenes, documentos o archivos, simplemente copiando todo ello al directorio /home/httpd/html habremos preparado nuestra Web para su acceso.

A título de ejemplo, supongamos el siguiente contenido de /home/httpd/html:

fichero      pagina.html
fichero      imagen.gif (usado por pagina.html)
directorio   linux
fichero      linux/linux.html

Con dichos ficheros, las siguientes direcciones Web serían válidas:


http://localhost/pagina.html
http://localhost/linux/linux.html
(etc.)
Los usuarios de otros equipos de la Red (o del resto de Internet) podrán acceder a nuestra página mediante nuestra IP o el nombre de nuestra máquina, como por ejemplo:


http://compiler.linux.es/pagina.html
http://195.123.222.1/linux/linux.html
http://compiler.dhis.org/pagina.html

Si preferimos que la Web cuelgue de otro directorio, tan sólo hay que cambiar la variable DocumentRoot en el fichero de configuración smr.conf (normalmente en /etc/httpd/conf).


# DocumentRoot: The directory out of which you will serve your
# documents. By default, all requests are taken from this directory, but
# symbolic links and aliases may be used to point to other locations.  
DocumentRoot    /home/httpd/html   

Normalmente el fichero inicial de nuestra Web (el que aparece cuando especificamos la dirección sin ningún html en ella) debe ser llamado index.html, index.htm o index.shtml, ya que cuando se acceda a http://localhost/ (sin especificar a qué fichero acceder, como se hace la figura 4, navegando con Lynx por nuestro propio server) se cargará automáticamente el fichero index, lo cual permite colocar ahi el índice o página de presentación de nuestra página.

Cabe decir que todos los ficheros que creemos deberán tener permisos de lectura para todo el mundo (chmod a+r) así como los directorios deberán tener permisos de ejecución (chmod +x) para su correcto acceso. Además es perfectamente posible el uso de enlaces simbólicos a ficheros o directorios (comando ln).

Otra de las grandes bazas de Apache es que gracias a su funcionamiento interno es ideal para aquellos que diseñan páginas Web o programan CGIs o ampliaciones para las mismas, pues permite probar instantáneamente y en tiempo real cualquier cambio realizado (accediendo a la propia máquina) sin necesidad de subir las páginas a un ISP para realizar la prueba desde el navegador. Simplemente copiando las páginas a este directorio y con un navegador siempre abierto, el desarrollo es mucho más rápido y permite testear el más mínimo cambio. Los scripts CGI se suelen colocar en el directorio cgi-bin, como el contador de ejemplo del listado 1 (disponible junto con otros scripts de muestra en el Web de Apache).

Listado 1: Contador Web con Apache:
----------------------------------------------------


/*
 * A simple WebPage counter
 *
 * Based on an original Perl script by Roman Czyborra
 * Script modified by Jim Jagielski (jim@jaguNET.com)
 *
 * Port to C by Jim Jagielski
 */

/*
 * Method of use:
 *   Assuming that 'count' is placed in /cgi-bin, the CGI "script"
 *   should be called as:
 *
 *        <IMG SRC="/cgi-bin/count/pathname-of-webpage"
 *         ALT="[some bitmapped number]">
 *
 *   Thus, a page in jim's directory would be refered to as:
 *
 *        <IMG SRC="/cgi-bin/count/~jim/page.html"
 *         ALT="[some bitmapped number]">
 *
 */

/*
 * Program methodology:
 *    o Open the lockfile (should exist first)
 *    o and FLOCK it
 *    o Now open and use the dbm file that contains the key and content
 *      where the 'key' is the pathname included in the URL
 *    o increment and store the counter
 *    o return the x-bitmap that is the count
 */

#include 
#include 
#include 
#include 
#include 
#include 
#include 

#define COUNT_DIR	"/staff/httpd/counter/data"
#define COUNT_LOCK	"Count"
#define COUNT_FILE	"Count"

main(argc, argv)
int argc;
char *argv[];
{
    datum key, content;
    int fd;
    char *path, *getenv();
    int count, i, j;
    char cntstr[10];
    char *iam;
    int bval;
    char reverse = 0;
    int bitmap[10][10] = {
	{ 0x3c, 0x10, 0x3c, 0x3c, 0x60, 0x7e, 0x3c, 0x7e, 0x3c, 0x3c },
	{ 0x42, 0x1c, 0x42, 0x42, 0x50, 0x02, 0x42, 0x40, 0x42, 0x42 },
	{ 0x42, 0x10, 0x42, 0x42, 0x48, 0x02, 0x02, 0x20, 0x42, 0x42 },
	{ 0x42, 0x10, 0x20, 0x40, 0x48, 0x02, 0x02, 0x20, 0x42, 0x42 },
	{ 0x42, 0x10, 0x10, 0x38, 0x44, 0x3e, 0x3a, 0x10, 0x3c, 0x42 },
	{ 0x42, 0x10, 0x08, 0x40, 0x42, 0x40, 0x46, 0x10, 0x42, 0x7c },
	{ 0x42, 0x10, 0x04, 0x40, 0xfe, 0x40, 0x42, 0x08, 0x42, 0x40 },
	{ 0x42, 0x10, 0x02, 0x42, 0x40, 0x42, 0x42, 0x08, 0x42, 0x42 },
	{ 0x42, 0x10, 0x02, 0x42, 0x40, 0x42, 0x42, 0x04, 0x42, 0x42 },
	{ 0x3c, 0x10, 0x7e, 0x3c, 0x40, 0x3c, 0x3c, 0x04, 0x3c, 0x3c }
    };

    if (!(iam = strrchr(argv[0], '/')))
	iam = argv[0];

    if (strcmp(iam, "ccount") == 0)
	reverse = 1;

    if ((path = getenv("PATH_INFO")) == NULL)
	exit(1);
 
    if (*path == '/')
	path++;
    key.dptr = path;
    key.dsize = strlen(path);

    if (chdir(COUNT_DIR) < 0)
	dodie("count chdir");

    if ((fd = open(COUNT_LOCK, O_RDWR|O_CREAT, 0644)) < 0)
	dodie("count open");

    if (flock(fd, LOCK_EX))
	dodie("count flock");

    if (dbminit(COUNT_FILE))
	dodie("count dbminit");

    content = fetch(key);
    if (!content.dptr) {
	count = 1;
	strcpy(cntstr, "1");
    } else {
	count = (content.dsize < 9) ? content.dsize : 9;
	strncpy(cntstr, content.dptr, count);
	cntstr[count] = '\0';
	count = atoi(cntstr);
	if (++count > 999999999)
	    count = 1;
	sprintf(cntstr, "%d", count);
    }
    content.dptr = cntstr;
    content.dsize = strlen(cntstr);

    if (store(key, content))
	dodie("count store");
    
    if (flock(fd, LOCK_UN))
	dodie("count unflock");

    if (close(fd))
	dodie("count close");

    /*
     * Okey dokey... Got the count, so let's generate the bitmap
     */
    count = strlen(cntstr);	/* for later */
    printf("Content-Type: image/x-xbitmap\n\n");
    printf("#define count_width %d\n", 8*count--);
    printf("#define count_height 10\n");
    printf("static char count_bits[] = {\n");
    for (i=0; i<=9; i++) {
	for(j=0; j<=count; j++) {
	    bval = bitmap[i][cntstr[j]-'0'];
	    if (reverse)
		bval = 0xff - bval;
	    printf(" 0x%02x,", bval);
	}
	printf("\n");
    }
    printf("};\n");
    exit(0);

}

dodie(what)
char *what;
{
    perror(what);
    exit(1);
}

----------------------------------------------------

Aparte de esto, si disponemos de nuestro propio sistema Linux (del que seamos también root) podremos servir nuestras páginas Web o ficheros a otros usuarios de Internet (dándoles nuestra IP o dominio) que en ocasiones puede ser más rápido que tomar datos desde algunos servidores lejanos o lentos, ya que nuestro servidor Web también estará accesible desde http://nuestra_direccion_ip/ (que podemos conocer consultando el /var/log/messages, por ejemplo).


SERVIDOR PARA MULTIPLES USUARIOS

Supongamos que disponemos de una máquina (o red) Linux con 2 usuarios (aunque para Apache podrían ser cientos de ellos, o incluso miles con una máquina medianamente potente, vamos a reducir nuestro ejemplo a sólo usuarios) llamados user1 y user2. Como usuarios, dispondrán de su propio directorio en /home/user1 y /home/user2 y normalmente no tendrán acceso a /home/httpd. Gracias a Apache estos 2 usuarios pueden disponer de servidor Web de sus propias páginas incluyendo éstas dentro de su propio directorio HOME sin necesidad de acceder a /home/httpd/html. El objetivo es que los usuarios creen un directorio dentro de su HOME donde introducir sus páginas de forma que cuando alguien acceda a http://el_servidor/~usuario, aparezcan las páginas de ese usuario leídas por Apache desde el directorio HOME del mismo, sin necesidad de que éstos accedan a su ISP o a /home/httpd (estando por lo tanto siempre actualizadas y pudiendo trabajar en ellas con los comandos habituales de Linux, via FTP, telnet o shell).

Para ello, los usuarios deben crear un directorio llamado public_html dentro de su directorio HOME (por ejemplo, user1 debe crear el directorio /home/user1/public_html) y copiar allí su página Web con el mismo formato en que las introducirían en el ISP o en /home/httpd (es decir, un fichero index.html, las imágenes y documentos, etc.). A continuación los usuarios deben dotar de permisos de lectura al directorio creado (chmod a+r) y a todos los ficheros que introduzcan en el mismo, y por último dotar de permisos de ejecución a su directorio HOME (chmod +x /home/usuario). Así, pues, tan sólo hay que realizar lo siguiente:


user1 ->
 cd 
 mkdir public_html
 chmod a+r public_html
 chmod +x /home/user1
 (e introducir la Web en public_html)
user2 ->
 cd 
 mkdir public_html
 chmod a+r public_html
 chmod +x /home/user2
 (e introducir la Web en public_html)

Al crear nuestra página Web (o copiarla) debemos dotar de permisos de lectura (chmod a+r) para todos a los ficheros que vayan a ser visibles (html, htm, tar.gz, imágenes, directorios) y de ejecución (chmod +x) a todos los directorios de la misma.

¿Los resultados? Si desde cualquier parte de nuestra red o de Internet se introduce la dirección http://el_servidor/~user1 se estará accediendo a /home/user1/public_html/index.html y por tanto se estará mostrando la página Web de user1 (ver figura 5, donde un cliente Windows95 accede a la página Web situada en http://compiler.linux.es/~sromero). Si por contra se accede a http://el_servidor/~user2, se estará accediendo a la Web del usuario user2. Esto permite que cada usuario disponga de su Web en su propio directorio y que mediante Apache demos servicio Web a todos los usuarios de nuestra máquina (tal y como realizan los Proveedores de Servicios de Internet cuando accedemos a direcciones como http://www.arrakis.es/~sromero). Estamos convirtiendo a nuestra máquina Linux en un verdadero servidor Web tan potente como lo permita los recursos de la misma, normalmente mucho mejor aprovechados que en otros Sistemas Operativos comerciales los cuales pueden llegar a necesitar hasta el GigaByte de RAM para poder compararse a Apache (sin contar el coste del propio servidor de Web). A título de ejemplo, es habitual encontrar sencillos ordenadores Pentium o K6 sirviendo a cientos de usuarios con apenas 64 Mb de RAM, al mismo tiempo que proporcionan también otros servicios (IRC, news, POP, SMTP, Samba para una red de usuarios Windows, DNS, etc.).

Si el nombre de public_html para el directorio de las páginas no nos convence totalmente, podemos cambiar el nombre del directorio de la Web de cada usuario acudiendo a /etc/httpd/conf/srm.conf y sustiyendo el nombre de directorio que aparezca en la opción UserDir:


# UserDir: The name of the directory which is appended onto a user's home
# directory if a ~user request is recieved.
UserDir 	    public_html

Esto nos permite modificar el directorio que el usuario debe crear conteniendo sus páginas a web, www, mi_web, o similar. Tras esto simplemente deberemos rearrancar apache (el daemon httpd) y los cambios se habrán realizado sin necesidad de reiniciar la máquina.

Si disponemos de un servicio de redirección de dominios a IP's dinámicas (como dhis.org), podremos referenciar nuestras páginas como http://nombre.dhis.org/~usuario siempre que editemos el fichero de configuración httpd.conf y modifiquemos la variable ServerName:


ServerName nombre.dhis.org
Si no se dispone de dicho servicio y nuestras IP's son dimánicas (no podemos usar ServerName), es recomendable dejar localhost.localdomain como ServerName y apuntar hacia nuestraWeb con la URL completa y la IP, como por ejemplo http://195.234.231.4/~sromero/index.html (path completo incluyendo el index para que Apache no compruebe el ServerName).


LOGS DE ACCESO Y ERRORES

En /etc/httpd/logs disponemos de 2 ficheros que nos informarán del estado de Apache y de los accesos al mismo. Por una parte disponemos del fichero error_log que nos informará de los errores (o señales/eventos importantes) que hayan ocurrido bajo el uso del programa, en un formato similar al siguiente:


[Sat May 21 17:17:16 1999] created shared memory segment #128
[Sat May 21 17:17:16 1999] Server configured -- resuming normal operations
[Sat May 21 17:18:06 1999] access to /home/httpd/html/sromero failed for 127.0.0.1, reason: File does not exist.
[Sat May 21 17:28:11 1999] httpd: caught SIGTERM, shutting down

De la misma forma, el fichero access_log nos indicará los accesos realizados al servidor, las fechas, IP de los mismos, acciones realizadas, bajo qué protocolo y las respuestas dadas por Apache:


127.0.0.1 - - [21/May/1999:07:54:06 +0200] "GET / HTTP/1.0" 200 1938
127.0.0.1 - - [21/May/1999:07:54:30 +0200] "GET /index.html HTTP/1.0" 200 1938
127.0.0.1 - - [21/May/1999:16:43:38 +0200] "GET /~sromero HTTP/1.0" 403 155
192.168.5.1 - - [21/May/1999:17:24:56 +0200] "GET /~sromero/ HTTP/1.0" 200 3552

Estos 2 ficheros tienen como finalidad ayudar al administrador del sistema a encontrar cualquier fallo en su servidor HTTP, así como controlar en todo momento los accesos a todos los elementos del servidor Web.


EN RESUMEN

Por supuesto, Apache tiene soporte para scripts CGI y otras muchas funcionalidades Web modernas, incluyendo la posibilidad de instalar sobre él las extensiones Microsoft FrontPage para Linux (si no importa disponer de la misma escasa seguridad que un sistema NT), así como muchas otras ventajas. Todo esto requiere un estudio más profundo que escapa de nuestro artículo introductorio que al menos nos permitirá hacer uso de Apache dentro de nuestro sistema como otro elemento más brindado por la comunidad Open Source Software.

Disponemos de clientes y servidores de correo entrante (POP), correo saliente (SMTP), news, IRC, DNS, FTP, shell, servidor Web, acceso a Internet, navegadores de gráficos y en modo texto, gestión de correo avanzado con procmail, redes LAN con múltiple acceso a Internet mediante una sola conexión, programas de telefonía IP por voz, así como muchos otros programas que hacen buen uso del protocolo TCP/IP para acercarnos realmente a la Red. Todo ello dentro de nuestro sistema, incluído como parte del mismo sin tener que pagar por cada licencia adicional o por cada parche (¿tal vez Service Pack?) que se le incluya, con posibilidad rápida de corrección de bugs y probados y testeados gratuitamente por millones de personas. Y todo ello a tu alcance en cualquier distribución de GNU/LiNUX.


Santiago Romero
Volver a la tabla de contenidos.