ApacheHay muchos servidores de Web, pero particularmente y supongo que hablo en boca de la mayoría, el que reune todas las mejores cualidades por lo que se refiere tanto a seguridad como fiabilidad, es sin duda el Apache. La versión que he instalado yo es la apache-1.2.5-0, cuando el lector lea este documento seguro que ya habrán salido unas cuantas más.
Si la instalación se realiza mediante el fichero RPM, no será necesario hacer ningún tipo de comentario sobre su compilación y correcta instalación dentro del sistema.
/etc/httpd/conf/access.confEste ha sido el primer fichero que he empezado a configurar. A continuación detallo la modificación que es necesario efectuar para indicar al servidor Apache que la Web de FibraNet está localizada en otro directorio que el que viene por defecto:
Se cambia la línea que dice:
<Directory /home/httpd/html>
por la siguiente línea:
<Directory /home/httpd/fibranet>
En la mayoría de las Web de proveedores de acceso a Internet (ISP), hay siempre una o más páginas creadas exclusivamente para los clientes. Dentro de estas páginas hay utilidades que ayudan a tener un ordenador mejor configurado o facilitan la descarga de ficheros. Gracias a ello, se pretende que sólo los clientes tengan acceso a estas páginas y que nadie más pueda acceder.
Las siguientes líneas muestran la manera de configurar el servidor Apache, especificándole qué páginas son de servicio exclusivo para los clientes:
<Directory /home/httpd/fibranet/espanol/soloclientes>
AllowOverride None
allow from .fibranet.com
deny from all
Options None
</Directory>
/etc/httpd/conf/httpd.confLa primera modificación será la de obligar al servidor Apache a resolver todas las IPs que pidan acceso a la Web de FibraNet, y traducirlas a hostnames:
Modificar la línea que dice:
HostnameLookups off
por la línea:
HostnameLookups on
A continuación especifico qué usuario será el receptor de todo el correo electrónico que se haga desde la propia Web. No es necesario que el usuario esté definido físicamente en el sistema, puede ser perfectamente un alias.
Cambio la línea que dice:
ServerAdmin webmaster@localhost
por la línea:
ServerAdmin admin@fibranet.com
A continuación realizo la misma modificación que en el fichero anterior para indicarle el directorio donde está localizada la Web de FibraNet:
Cambio la línea que dice:
ServerRoot /home/httpd/html
por la línea:
ServerRoot /home/httpd/fibranet
Por defecto el servidor Apache genera sólo dos tipos de logs. Por un lado el fichero /var/log/httpd/access_log y por otro el /var/log/httpd/error_log. El primero registra todos los accesos a la Web y el segundo se encarga de registrar los errores.
Ahora bien, si deseo obtener una relación de browsers o navegadores, que me permita saber cual es el más utilizado (de cara a crear la Web para un navegador específico), será necesario añadir la siguiente modificación:
Justo después de la línea que dice:
TransferLog /var/log/httpd/access_log
se añaden las líneas:
## AgentLog: The location of the agents log file
CustomLog /var/log/httpd/agent_log "%{user-agent}i"
De esta manera el servidor de Web generará un tercer fichero destinado a registrar el tipo y versión del navegador que haya solicitado el acceso.
Debido a que con un único ordenador se realizan todas las tareas de servidor, el nombre real de este servidor es ns.fibranet.com, y el resto de nombres (www, ftp, news, pop, etc.) son sólo alias del mismo ordenador. Cualquier acceso que se haga desde un navegador a la dirección http://www.fibranet.com el servidor de Web cambiará automáticamente este nombre y mostrará a la persona el nombre real del ordenador.
Para evitar este problema tan molesto, hay que indicar al servidor de Web que cuando haya una petición de Web, el nombre del ordenador será www.fibranet.com. Para realizar esta configuración es necesario hacer la siguiente modificación:
Se cambia la línea que dice:
ServerName new.host.name
por la línea:
ServerName www.fibranet.com
Finalmente sólo queda especificar qué dominios virtuales tendrá el servidor de Web. Durante todo este ejemplo, se establece que el único dominio virtual será macrobit.es.
Así pues, es necesario añadir las siguientes líneas en la parte final del fichero:
<VirtualHost www.macrobit.es>
ServerAdmin info@macrobit.es
DocumentRoot /mnt/empresas/macrobit
ServerName www.macrobit.es
ErrorLog /var/log/httpd/macrobit.es-error_log
TransferLog /var/log/httpd/macrobit.es-access_log
CustomLog /var/log/httpd/macrobit.es-agent_log "%{user-agent}i"
</VirtualHost>
Con una mirada, se oberva que se le han especificado los mismos parámetros que he configurado hasta ahora. Es importante saber que todos los dominios virtuales que se quieran añadir, deberán tener el mismo formato. O sea, que este párrafo se irá repitiendo a medida que se vayan incorporando nuevos dominios virtuales.
/etc/httpd/conf/srm.confEste es el último fichero que hará falta configurar. La primera modificación será la de volver a informar al servidor Apache de cual es el directorio donde está localizada la Web de FibraNet:
Cambio la línea que dice:
DocumentRoot /home/httpd/html
por la línea:
DocumentRoot /home/httpd/fibranet
Tal y como ya se sabe, tanto las empresas como los usuarios particulares podrán disponer de un espacio para su Web. Este espacio, residirá exactamente en su propio directorio. Ahora bien, por defecto el servidor de Web establece que para que la Web pueda ser accedida por todo el mundo, será necesario ponerla dentro del subdirectorio llamado public_html. Esto conllevaría muchas molestias a los usuarios.
Para resolver este problema, hay que informar al servidor Apache que los ficheros de la Web residirán dentro del propio directorio del usuario. Es decir, sin tener que crear otro adicional. Así pues, la modificación que hay que hacer es la siguiente:
Cambio la línea que dice:
UserDir public_html
por la línea:
UserDir ./
En cambio, si que es interesante para los usuarios de nivel tipo opers, disponer de un subdirectorio donde residan todos los ficheros de la Web. De este modo, el directorio principal quedará más ordenado. Para poder realizar esta distinción de necesidades, es necesario utilizar un alias para cada usuario individual:
Añado la linea:
Alias /~mikaku /home/mikaku/public_html
Para hacer la vida más sencilla a los usuarios que quieran disponer de su propia Web, es necesario que el servidor Apache reconozca los ficheros HTML en cualquiera de sus dos extensiones. Por un lado la extensión .html y por otro lado la extensión .htm. Por defecto la primera ya está contemplada. Ahora sólo queda añadir la segunda:
Después de las siguientes líneas:
# To use server-parsed HTML files
AddType text/html .shtml
AddHandler server-parsed .shtml
añado estas:
## To use server-parsed HTM files
AddType text/html .htm
AddHandler server-parsed .htm
Dicen que errar es cosa de los humanos y perdonar es divino. Informar del error está por encima de estas dos cosas y hay que poderlo contemplar.
Cuando un usuario escribe una dirección (URL) en su navegador y por error la escribe mal, el servidor de Web debe estar preparado para mostrar un mensaje de error. Sin embargo y como es natural, por defecto el mensaje aparece en inglés.
Para poder variar esta configuración "de fábrica", e indicar al servidor de Web cuál es la página que debe mostrar en caso de producirse un error de estas características, es necesario añadir la siguiente línea:
ErrorDocument 404 /error/missing.html
De la misma manera que tal y como se ha dicho antes cualquier ISP dispone de una página reservada exclusivamente para sus clientes, también debe estar preparado por si alguien de una red diferente intenta acceder a este espacio reservado, y si es así mostrar el correspondiente aviso. Así pues, para indicar al servidor de Web cuál es la página que debe mostrar cuando se produzca una situación así, es necesario añadir la siguiente línea:
ErrorDocument 403 /error/noacceso.html
Casi cualquier ISP dispone de un formulario dentro de su propia Web. Mediante este formulario se permite que cualquier usuario pueda darse de alta electrónicamente y de manera instantánea. Es decir, una vez el usuario ha rellenado todos los campos del formulario, valida la entrada pulsando el botón que normalmente dice "Enviar formulario". A partir de aquí, el servidor de Web envía todos estos datos a un programa que lo que hace es verificar que el contenido sea correcto, y seguidamente, enviar un correo electrónico al administrador del sistema notificándole la nueva alta. A continuación muestra una página de bienvenida al usuario, y le informa que en breves momentos será notificado de su alta definitiva.
Para poder realizar todo este proceso que hay detrás de esta situación, es necesario adentrarse en el mundo de los CGIs. Cada ISP hace este proceso de una manera diferente. Hay quien en lugar de enviar un correo electrónico al administrador, prefiere que los datos sean enviados directamente a la base de datos central de la empresa, donde ahí hay una persona encargada de recibir todas estas peticiones.
Particularmente he optado por enviar un correo electrónico al usuario admin, que no es más que un alias del root. Así pues, para poder generar un correo electrónico desde un CGI escrito con el lenguaje Perl, es necesario instalar el siguiente paquete:
MailTools.pm-1.06-1.i386.rpm
A continuación detallo el CGI escrito en Perl que utilizo para realizar todo el proceso de altas. Se recuerda que este programa debe residir dentro del directorio /home/httpd/cgi-bin. Por cuestiones de espacio, he suprimido casi toda la parte del lenguaje HTML que genera las páginas de errores. Sólo he dejado la sección del TITLE.
#!/usr/bin/perl
use strict;
use CGI;
require Mail::Send;
my $query = new CGI;
my $nombre = $query->param('NOMBRE');
my $apellidos = $query->param('APELLIDOS');
my $nif = $query->param('NIF');
my $usuario = $query->param('Usuario');
my $nomempresa = $query->param('NOMEMPRESA');
my $telefono = $query->param('TELEFONO');
my $domicilio = $query->param('DOMICILIO');
my $poblacion = $query->param('POBLACION');
my $codpostal = $query->param('CODPOSTAL');
my $provincia = $query->param('PROVINCIA');
my $tipocuota = $query->param('Tipo_cuota');
my $conexion = $query->param('Tipo_conexion');
my $titcuenta = $query->param('TITCUENTA');
my $niftitular = $query->param('NIFTITULAR');
my $banco = $query->param('BANCO');
my $codbanco = $query->param('CODBANCO');
my $oficina = $query->param('OFICINA');
my $codoficina = $query->param('CODOFICINA');
my $dc = $query->param('DC');
my $numcuenta = $query->param('NUMCUENTA');
my $dirbanco = $query->param('DIRBANCO');
my $codpostbanco = $query->param('CODPOSTBANCO');
my $login = $query->param('LOGIN');
my $password = $query->param('PASSWORD');
# Se comprueba que todos los campos del usuario esten rellenados
# ---------------------------------------------------------------
if (($nombre eq '') || ($apellidos eq '') || ($nif eq '') ||
(($usuario eq '') && ($nomempresa eq '')) || ($telefono eq '') ||
($domicilio eq '') || ($poblacion eq '') || ($codpostal eq '') ||
($provincia eq '') || ($tipocuota eq '') || ($conexion eq '')) {
&ERRUsuario;
exit(1);
}
# Se comprueba que todos los campos del banco esten rellenados
# ------------------------------------------------------------
if (($titcuenta eq '') || ($niftitular eq '') || ($banco eq '') ||
($codbanco eq '') || ($oficina eq '' ) || ($codoficina eq '') ||
($dc eq '') || ($numcuenta eq '') || ($dirbanco eq '') ||
($codpostbanco eq '')) {
&ERRBanco;
exit(1);
}
# Se comprueba que todos los campos de Internet esten relleandos
# --------------------------------------------------------------
if (($login eq '') || ($password eq '')) {
&ERRInternet;
exit(1);
}
# Convierte a minusculas
# ----------------------
$login =~ s/\b([a-z]+)/\L$1/gio;
my $msg = new Mail::Send
Subject=>'Formulario Altas',
To=>'Administracion';
$msg->to('admin@fibranet.com');
$msg->subject('formulario altas');
my $fh = $msg->open;
print $fh
"ATENCION!! NUEVA ALTA\n",
"*********************\n\n",
"Nombre ........: $nombre\n",
"Apellidos .....: $apellidos\n",
"NIF ...........: $nif\n",
"Usuario/Empresa: $usuario\n",
"Nombre Empresa.: $nomempresa\n",
"Telefono ......: $telefono\n",
"Domicilio .....: $domicilio\n",
"Poblacion .....: $poblacion\n",
"Codigo Postal .: $codpostal\n",
"Provincia .....: $provincia\n\n",
"Tipo de Cuota\n",
"-------------\n",
"Cuota .........: $tipocuota\n\n",
"Tipo de Conexion\n",
"----------------\n",
"Conexion ......: $conexion\n\n",
"Datos de la Domiciliacion Bancaria\n",
"----------------------------------\n",
"Titular Cuenta.: $titcuenta\n",
"NIF del Titular: $niftitular\n",
"Nombre Banco ..: $banco\n",
"Codigo Banco ..: $codbanco\n",
"Oficina .......: $oficina\n",
"Codigo Oficina.: $codoficina\n",
"Digito Control.: $dc\n",
"Numero Cuenta .: $numcuenta\n",
"Direccion .....: $dirbanco\n",
"Codigo Postal .: $codpostbanco\n\n",
"Datos Internet\n",
"--------------\n",
"Nombre Usuario.: $login\n",
"Clave Acceso ..: $password\n\n",
"Datos Remotos (informativo)\n",
"---------------------------\n",
"Remote Host ...: $ENV{ REMOTE_HOST }\n",
"User Browser ..: $ENV{ HTTP_USER_AGENT }\n\n";
$fh->close;
&ok;
exit(0);
############################## RUTINAS GENERALES ##############################
# Se muestra la pantalla de agradecimiento y se comunica el alta al usuario
# -------------------------------------------------------------------------
sub ok {
print $query->header('text/html');
print <<HTML;
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
<TITLE>Enhorabuena!</TITLE>
</HEAD>
</HTML>
HTML
}
# Se muestra el error por falta de algunos datos en la parte "DATOS USUARIO"
# --------------------------------------------------------------------------
sub ERRUsuario {
print $query->header('text/html');
print <<HTML;
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
<TITLE>Error en el apartado DATOS USUARIO!</TITLE>
</HEAD>
</HTML>
HTML
}
# Se muestra el error por falta de algunos datos en la parte "DATOS BANCARIOS"
# ----------------------------------------------------------------------------
sub ERRBanco {
print $query->header('text/html');
print <<HTML;
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
<TITLE>Error en el apartado DATOS BANCARIOS </TITLE>
</HEAD>
</HTML>
HTML
}
# Se muestra el error por falta de algunos datos en la parte "DATOS INTERNET"
# ---------------------------------------------------------------------------
sub ERRInternet {
print $query->header('text/html');
print <<HTML;
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
<TITLE>Error en el apartado DATOS INTERNET</TITLE>
</HEAD>
</HTML>
HTML
}