ApacheHi ha molts servidors de Web, però particularment i suposo que parlo em boca de la majoria, el que reuneix totes les millors qualitats pel que fa tant a seguretat com a fiabilitat, és sens dubte l'Apache. La versió que he instal·lat jo és la apache-1.2.5-0, quan el lector llegeixi aquest document, de ben segur que ja n'hauran sortit unes quantes més.
Si la instal·lació es realitza mitjançant el fitxer RPM, no caldrà fer cap comentari sobre la seva compilació i correcte instal·lació dins del sistema.
/etc/httpd/conf/access.confAquest ha estat el primer fitxer que he començat a configurar. A continuació detallo la modificació que cal fer per indicar-li al servidor Apache que la Web de FibraNet es localitza en un altre directori que el que ve per defecte:
Es canvia la línia que diu:
<Directory /home/httpd/html>
per la següent línia:
<Directory /home/httpd/fibranet>
En la majoria de les Webs de proveïdors d'accés a Internet (ISP), hi ha sempre una o més pàgines creades exclusivament pels clients. Dins d'aquestes planes hi ha utilitats que els ajuden a tenir un ordinador més ben configurat o faciliten la descàrrega de fitxers. Degut a això, es pretén que només els clients tinguin accés a aquestes pàgines i que ningú més hi pugui accedir.
Les següents línies mostren la manera per configurar el servidor Apache, especificant-li quina o quines pàgines són de servei exclusiu pels clients:
<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ó serà la de obligar al servidor Apache a resoldre totes les IPs que demanin accés a la Web de FibraNet, i les tradueixi a hostnames:
Modificar la línia on diu:
HostnameLookups off
per la línia:
HostnameLookups on
A continuació especifico quin usuari serà el receptor de tot el correu electrònic que es faci des de la pròpia Web. No cal que l'usuari estigui definit físicament al sistema, pot ser perfectament un alias.
Canvio la línia que diu:
ServerAdmin webmaster@localhost
per la línia:
ServerAdmin admin@fibranet.com
A continuació realitzo la mateixa modificació que en el fitxer anterior, per indicar-li a quin directori és localitzada la Web de FibraNet:
Canvio la línia que diu:
ServerRoot /home/httpd/html
per la línia:
ServerRoot /home/httpd/fibranet
Per defecte, el servidor Apache genera només dos tipus de logs. Per una banda el fitxer /var/log/httpd/access_log i per altre banda el /var/log/httpd/error_log. El primer enregistre tots els accessos a la Web i el segon s'en encarrega d'enregistrar els errors.
Ara bé, si vull obtenir una relació de browsers o navegadors, que em permetrà saber quin és el més utilitzat (de cara a realitzar la Web per un navegador específic), caldrà afegir la modificació següent:
Just després de la línia que diu:
TransferLog /var/log/httpd/access_log
s'hi afageixen les línies:
## AgentLog: The location of the agents log file
CustomLog /var/log/httpd/agent_log "%{user-agent}i"
D'aquesta manera, el servidor de Web generarà un tercer fitxer, destinat a enregistrar el tipus i versió del navegador que hagi sol·licitat l'accés.
Degut a que amb un únic ordinador es realitzen totes les tasques de servidor, el nom real d'aquest servidor és ns.fibranet.com, i la resta de noms (www, ftp, news, pop, etc.) són només alias del mateix ordinador. Qualsevol accés que es faci des d'un navegador a l'adreça http://www.fibranet.com el servidor de Web canviarà automàticament aquest nom i li mostrarà a la persona el nom real de l'ordinador.
Per evitar aquest problema tant molest, s'ha d'indicar al servidor de Web que quan hi hagi una petició de Web, el nom de l'ordinador serà www.fibranet.com. Per realitzar aquesta configuració, cal fer la següent modificació:
Es canvia la línia que diu:
ServerName new.host.name
per la línia:
ServerName www.fibranet.com
Finalment, només queda especificar quins dominis virtuals tindrà el servidor de Web. Durant tot aquest exemple, s'establirà que l'únic domini virtual serà macrobit.es.
Així doncs, cal afegir les següents línies a la part final del fitxer:
<VirtualHost www.macrobit.es>
ServerAdmin info@macrobit.es
DocumentRoot /mnt/empreses/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>
Amb un cop d'ull, es pot observar que se li han especificat els mateixos paràmetres que he configurat jo fins ara. És important saber que tots els dominis virtuals que es vulgui anar afegint hauràn de tenir el mateix format. O sigui que aquest paràgraf s'anirà repetint a mesura que es vagin incorporant nous dominis virtuals.
/etc/httpd/conf/srm.confAquest és l'ultim fitxer que caldrà configurar. La primera modificació serà la de tornar a informar al servidor Apache de quin és el directori on està localitzada la Web de FibraNet:
Canvio la línia que diu:
DocumentRoot /home/httpd/html
per la línia:
DocumentRoot /home/httpd/fibranet
Tal i com ja se sap, tant les empreses com els usuaris particulars podran disposar d'un espai per la seva Web. Aquest espai, residirà exactament en el seu propi directori. Ara bé, per defecte, el servidor de Web estableix que, per que la Web pugui ser accedida per tothom, caldrà posar-la dins del subdirectori anomenat public_html. Això comportaria moltes molèsties als usuaris.
Per solventar aquest problema, s'ha d'informar al servidor Apache que els fitxers de la Web residiran dins del propi directori de l'usuari. És a dir, sense haver de crear-ne cap altre d'adicional. Així doncs, la modificació que cal fer és la següent:
Canvio la línia que diu:
UserDir public_html
per la línia:
UserDir ./
En canvi, si que és interessant pels usuaris de nivell tipus opers, disposar d'un subdirectori on resideixin tots els fitxers de la Web. Així el directori principal quedaria més ordenat. Per poder realitzar aquesta distinció de necessitats, cal utilitzar un alias per cada usuari individual:
Afageixo la línia:
Alias /~mikaku /home/mikaku/public_html
Per fer la vida més senzilla als usuaris que vulguin tenir la seva pròpia Web, és necessari que el servidor Apache reconeixi els fitxers HTML amb qualsevol de les dues extensions. Per una banda la extensió .html i per altre banda la extensió .htm. Per defecte, la primera ja està contemplada. Ara només caldrà afegir la segona.
Així doncs, després de les següents línies:
# To use server-parsed HTML files
AddType text/html .shtml
AddHandler server-parsed .shtml
hi afegeixo aquestes:
## To use server-parsed HTM files
AddType text/html .htm
AddHandler server-parsed .htm
Diuen que errar és cosa dels humans, i perdonar és diví. Informar de l'error està per sobre d'aquestes dues coses i s'ha de poder contemplar.
Quan un usuari escriu una adreça (URL) en el seu navegador i per error la escriu malament, el servidor de Web està preparat per mostrar un missatge d'error. Naturalment però, per defecte, surt un missatge en anglès.
Per poder variar aquesta configuració "de fàbrica", i indicar al servidor de Web quina és la pàgina que ha de mostrar en cas de produir-se un error d'aquestes característiques, cal afegir la següent línia:
ErrorDocument 404 /error/missing.html
De la mateixa manera que tal i com s'ha dit abans qualsevol ISP disposa d'una pàgina reservada exclusivament pels seus clients, també s'ha d'estar preparat per si algún usuari d'una xarxa diferent intenta accedir a aquest espai reservat, i si és així mostrar-li el corresponent avís. Així doncs, per indicar al servidor de Web quina és la pàgina que ha de mostrar quan es produeixi una situació així, cal afegir la següent línia:
ErrorDocument 403 /error/noacces.html
Gairebé qualsevol ISP disposa d'un formulari dins de la seva Web. Mitjançant aquest formulari es permet que qualsevol usuari pugui donar-se d'alta electrònicament i de manera instantànea. És a dir, un cop l'usuari ha emplenat tots els camps del formulari, valida l'entrada prement el botó que normalment diu "Enviar formulari". A partir d'aquí, el servidor de Web envia totes aquestes dades a un programet que el que fa és verificar que el contingut sigui correcte, i seguidament enviar un correu electrònic a l'administrador del sistema notificant-li la nova alta. A continuació mostre una pàgina de benvinguda a l'usuari, i li informa que en uns moments serà notificat definitivament de la seva alta.
Per poder realitzar tot el procés que hi ha al darrera d'aquesta situació, cal endinsar-se en el món dels CGIs. Cada ISP fa aquest procés d'una manera diferent. N'hi ha que enlloc d'enviar un correu electrònic a l'administrador, les dades són enviades directament a la base de dades central de la empresa, on hi ha una persona encarregada de rebre aquestes peticions.
Particularment, he optat per enviar un correu directament a l'usuari admin, que no és res més que un alias del root. Així doncs, per poder generar un correu electrònic des d'un CGI escrit amb el llenguatge Perl, cal instal·lar el següent paquet:
MailTools.pm-1.06-1.i386.rpm
A continuació detallo el CGI escrit en Perl que faig servir per realitzar tot el procés d'alta. Cal recordar que aquest programa ha de residir dins del directori /home/httpd/cgi-bin. Per qüestió d'espai, he suprimit gairebé tota la part del llenguatge en HTML que genera les pàgines d'errors. Només hi he deixat la part 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');
# Es comprova que tots els camps de l'usuari estiguin emplenats
# -------------------------------------------------------------
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);
}
# Es comprova que tots els camps del banc estiguin emplenats
# ----------------------------------------------------------
if (($titcuenta eq '') || ($niftitular eq '') || ($banco eq '') ||
($codbanco eq '') || ($oficina eq '' ) || ($codoficina eq '') ||
($dc eq '') || ($numcuenta eq '') || ($dirbanco eq '') ||
($codpostbanco eq '')) {
&ERRBanco;
exit(1);
}
# Es comprova que tots els camps d'Internet estiguin emplenats
# ------------------------------------------------------------
if (($login eq '') || ($password eq '')) {
&ERRInternet;
exit(1);
}
# Converteix a minuscules
# -----------------------
$login =~ s/\b([a-z]+)/\L$1/gio;
my $msg = new Mail::Send
Subject=>'Formulari Altes',
To=>'Administracio';
$msg->to('admin@fibranet.com');
$msg->subject('formulari altes');
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);
############################## RUTINES GENERALS ###############################
# Es mostre la pantalla d'agraiment i es comunica l'alta a l'usuari
# -----------------------------------------------------------------
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
}
# Es mostre l'error per manca d'algunes dades en la part "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
}
# Es mostre l'error per manca d'algunes dades en la part "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
}
# Es mostre l'error per manca d'algunes dades en la part "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
}