Introduzione:
Apache, il cui sviluppo (ricordiamo che il team è formato da volontari,
noti come l'Apache Group) è arrivato alla versione 1.3.12, è nato come
rimpiazzo per il webserver httpd 1.3 sviluppato dal NCSA (National Center for
Supercomputing Applications), inglobandone le carrateristiche,
risolvendone i problemi ed implementando nuove features.
Come sopra accennato, Apache è un webserver per il protocollo HTTP,
designato per poter girare come un processo standalone, senza ciò
chiedere l'appoggio ad altre applicazioni o direttamente all'utente.
Per poter fare ciò, Apache, una volta che sia stato avviato, crea dei
sottoprocessi (comunemente e meglio detti "children processes") per poter
gestire le richieste: questi processi, comunque, non potranno mai
interferire con il processo maggiore, ma può succedere l'opposto:
mandando un segnale di stop a questo, anche i children saranno
terminati.
Un tipico albero dei processi di Apace potrebbe essere qualcosa di
simile a:
USER |
PID |
%CPU |
%MEM |
SIZE |
RSS |
TTY |
STAT |
START |
TIME |
COMMAND |
root |
203 |
0.01 |
1.01 |
4952 |
720 |
? |
S |
17.20 |
0.03 |
/usr/sbin/apache |
user |
212 |
0.00 |
2.03 |
5012 |
1456 |
? |
S |
17.20 |
0.00 |
\_ /usr/sbin/apache |
user |
213 |
0.00 |
2.02 |
5008 |
1424 |
? |
S |
17.20 |
0.00 |
\_ /usr/sbin/apache |
user |
214 |
0.00 |
0.00 |
4976 |
0 |
? |
SW |
17.20 |
0.00 |
\_ (apache) |
user |
216 |
0.00 |
0.00 |
4976 |
0 |
? |
SW |
17.20 |
0.00 |
\_ (apache) |
user |
473 |
0.00 |
1.06 |
4976 |
1072 |
? |
S |
18.05 |
0.00 |
\_ /usr/sbin/apache |
user |
477 |
0.00 |
1.07 |
4976 |
1076 |
? |
S |
18.05 |
0.00 |
\_ /usr/sbin/apache |
user |
478 |
0.00 |
2.04 |
5012 |
1544 |
? |
S |
18.05 |
0.00 |
\_ /usr/sbin/apache |
Ricordiamo inoltre che Apache è distribuito come free software, per
esplicito desiderio del team che lo sviluppa: questi, infatti, ritengono
che strumenti di questo genere debbano essere accessibili a tutti, e che
le software house debbano guadagnarci solo producendo addons o simili di
valore, o magari personalizzati per alcune categorie di utenti. Inoltre,
lasciando il software in mano di chiunque nonchè completo di sorgenti, è
possibile che costoro contribuiscano, sia tramite feedback sia tramite vere e
proprie patch, a migliorare il prodotto finale. Date le loro premesse, come
dare loro torto?
Vediamo brevemente alcune tra le moltissime modifiche introdotte nella
versione 1.3 rispetto alla 1.2:
- Supporto DSO (Dynamic shared objects): i moduli possono essere
caricati si richiesta, in modo da utilizzare una minore quantità di
memoria. Questa caratteristica è supportata su: FreeBSD, OpenBSD,
NetBSD, Linux, Solaris, SunOS, Digital UNIX, IRIX, HP/UX, UnixWare,
AIX, ReliantUnix e le altre piattaforme SVR4.
- Supporto per Windows 9x/NT: le versioni precedenti non potevano infatti essere installate su questi sistemi. Al momento, il supporto è sperimentale ma, dalle prove effettuate, si comporta assai bene sebbene non sia ancora in grado di garantire performances pari a quelle riscontrabili su sistemi Unix.
- Migliore gestione dei VirtualHost.
- Miglior gestione dei proxy server.
- Migliore gestione degli script CGI.
- Compatibilità con l'anno 2000 (è un po' tardi per dirlo, ma gli autori se n'erano ricordati per tempo!)
Ovviamente non è tutto qui; quelle qui riportate sono le modifiche
"umanamente intelleggibili", ossia quelle che un utente medio capisce
senza troppi problemi. Per chi voglia approfondire l'argomento,
consiglio la pagina "new_features_1_3.html" presente nella
documentazione di Apache stesso.
Per coloro che non l'abbiano ancora fatto, ricordo che l'argomento è stato precedentemente affrontato nella guida ai CGI nonchè in un articolo a parte per quanto riguarda l'installazione su piattaforma Win32. Inoltre, moltissima documentazione la potete trovare nei vostri hard-disk dopo avere installato Apache sulle vostre macchine o ancora alla pagina http://www.apache.org, sito ufficiale del progetto Apache.
Per chi intenda installare o comunque approfondire le proprie conoscienze su Apache in relazione a sistemi Windows, ricordo la pagina "windows.html" presente nel manuale HTML che vi verrà installato a supporto del server.
Porte:
Iniziamo con la porta su cui mettere in listening il webserver (non nel caso in cui esso sia chiamato da inet): il numero specificabile per la porta varia da un range da 0 a 65535, di cui le prime 1024 sono riservate per determinati protocolli; la porta riservata per il protocollo http è comunque, di efault, la 80. Per chi volesse saperne di più sulle porte ed il relativo protocollo associato, maggiori informazioni possono essere trovate nel file /etc/services (sistemi Unix). Un'altra particolarità della porta 80 ed in generale delle porte al di sotto della 1024 è che sono "di sistema", nel senso che i normali utenti non possono farne uso. Quindi, è necessario che apache sia fatto partire dall'utente root nel caso si utilizzi la porta 80 (che è comunque consigliato); in seguito, prima di essere pronto ad accettare le richieste, l'esecuzione di Apache sarà "spostata" all'utente definito poco oltre nel file httpd.conf (lo vedremo in seguito): in questo modo, tutti i processi children saranno su porte il cui numero è maggiore di 1024.
Utenti:
Abbiamo parlato poco sopra degli utenti con i privilegi dei quali Apache è fatto girare: la direttiva che ci interessa è "User".
Per utilizzare tale direttiva, è necessario che l'utente che ha avviato Apache SIA root. Il nome dell'utente può essere specificato come il nome a caratteri (ad esempio, nome_utente) oppure tramite il suo ID numerico preceduto dal simbolo # (ad esempio, # 1002).
Questo utente non dovrebbe avere troppi provilegi sul sistema, come ad esempio la possibilità di leggere importanti file di sistema, lanciare eseguibili che non hanno a che fare con httpd e simili. La cosa migliore da fare è quella di creare un nuovo utente ad hoc per l'esecuzione di Apache, visto che anche scegliere l'utente "nobody" può non essere la scelta migliore.
Ovviamente, inoltre, è fortemente sconsigliato specificare "root" nella direttiva "User". Il perchè mi sembra chiarissimo.
Assieme ad "User", inoltre, dovrete specificare anche un nome di gruppo per la direttiva "Group": se avete creato un nuovo utente (supponiamo "prova") per far girare Apache, potrete inserire "prova" anche per il gruppo, a meno che abbiate la necessità di utilizzare un Group differente.
Directory:
Vediamo qui le directory che interesseranno Apache: parleremo qui sia delle directory di configurazione sia di quelle utilizzate per contenere le pagine che daranno forma ad uno o più siti web.
Scorrendo il file httpd.conf, ci imbatteremo presto nella direttiva "ServerRoot": in questa directory saranno contenuti i file di configurazione di Apache, gli errori ed i log, se non specificato differentemente. Evitate che tale directory sia visibile dal web, piuttosto scegliete una directory come /etc/apache oppure /var/log/apache. Bisognerà anche fare attenzione ai permessi da dare a questa directory: i file che essa contiene, infatti, sono alquanto importanti e possono modificare radicalmente il comportamento del server: evitate quindi che altri utenti al di fuori dell'amministratore possano leggere e scrivere al suo interno. Inoltre, per lo stesso discorso, fate lo stesso anche con le directory ed i file di log.
Passiamo poi alla direttiva "DocumentRoot": in questa directory saranno presenti i documenti visualizzabili dal web, in poche parole il sito principale associato al webserver. Per essere ancora più chiaro, se il nome del vostro host è "www.server.it", se un utente digiterà dal browser l'indirizzo "www.server.it" appariranno proprio le pagine presenti in "DocumentRoot".
Poco sotto a DocumentRoot c'è la direttiva "DirectoryIndex": a cosa serve è presto detto. Provate a digitare nel browser l'indirizzo di un qualsiasi server e notate che non inserite alcun nome del file che abbia estensione html, eppure il 90% dei file visibili in rete sono in html! Se questo accade, è grazie alla direttiva "DirectoryIndex": specificando ad esempio "index.html" come valore della direttiva, saremo sicuri che, se in una directory è presente un file chiamato "index.html", Apache farà in modo che non sia necessario digitare nomedirectory/index.html perchè sia visualizzato tale file, ma solamente nomedirectory. Facciamo un esempio: sul server "www.server.com" è presente una directory chiamata, ad esempio, prova, nella quale è presente un file chiamato index.html: per vedere tale file, non sarà necessario digitare "www.server.com/prova/index.html" ma soltanto "www.server.com/prova". Avrete capito così perchè quando si chiama dal browser qualcosa come "www.html.it" non è mai necessario inserire anche "index.html": in fondo, anche www.html.it è una directory su un server! Un'ultima cosa relativa a DirectoryIndex è il fatto di poter indicare diversi nomi di pagine, non solo index.html: i più significativi possono essere "index.shtml", "index.htm" ecc, l'importante è che questi siano separati da spazi.
Veniamo ora alla directory UserDir, impostata di default su /home/*/public_html. Già quel "public_html" dovrebbe avervi fatto capire qualcosa: infatti, i file presenti nella directory /home/nomeutente/public_html sono visualizzati quando, dopo il nome di dominio, sia specificato anche ~nomeutente: se ad esempio sulla macchina "www.server.com" è presente un utente "test", la cui home directory è "/home/test" contenente una sottodirectory chiamata "public_html", se dal browser sarà digitato "www.server.com/~test" appariranno proprio i file presenti nella directory "/home/test/public_html".
Ovviamente, ogni utente deve avere un account sulla macchina.
E avete capito così per sommi capi anche come funzionano le comunità virtuali su internet.
Avvio su Unix:
L'avvio di Apache puù essere fatto in due modi: al boot della macchina oppure tramite il demone inetd ogni volta che ci sia la richiesta di una connessione HTTP. La seconda possibilità è comunque poco raccomandata, in quanto è sempre meglio avere il server attivo e pronto a ricevere le richieste.
Quindi ipotizzeremo qui che Apache sia avviato al boot della macchina e terminato al suo spegnimento: se parliamo di un server web, capirete che tra i due momenti passerà molto tempo (visto l'uptime di questi tipi di macchine), e quindi Apache resterà attivo per tutto il tempo durante il quale la macchina è accesa e, ovviamente, connessa in rete, locale o remota che sia.
L'avvio al boot è determinato da un semplice script presente in /etc/init.d : il nome dello script è, fantasiosamente, apache! Leggendolo, molti si potebbero spaventare: sapendo scremare tutto quanto è superfluo ai nostri scopi, possiamo ridurci a considerare solo le chiamate che ci interessano, senza curarci di cosa effettivamente avviene per ognuna.
La prima è "start": come apparirà chiaro, con questa chiamata Apache viene attivato, in modo che si crei il processo padre che sarà seguito dai processi children per gestire le chiamate. La chiamata start è quella che viene fatta al boot della macchina e, per accertarcene, sarà sufficiente controllare che, al boot, appaia una riga simile a:
Starting web server: apache.
Se ciò avviene, possiamo stare sicuri che Apache sia già in ascolto sulla porta 80 del server ma, se proprio vogliamo essere pignoli, possiamo controllare tra la lista dei processi se appare (e deve apparire) anche Apache con i suoi processi children. Per la prova del nove, se l'avete già configurato anche sommariamente, potete digitare dal browser l'indirizzo "http://localhost" per controllare che Apache vi risponda.
Riavvio e stop su Unix:
Il riavvio ha un ruolo alquanto importante: supponete di avere una macchina impiegata a tempo pieno come server, e di effettuare alcune modifiche alla configurazione dell'Apache che gira su di essa; cosa fareste per rendere attive le modifiche?
Coloro che, ricordando che Apache viene avviato all'avvio e pensando che sia necessario riavviare la macchina perchè le modifiche abbiano effetto si sbagliano: come esiste la chiamata "start", esiste anche la chiamata "restart", solo che questa deve essere data a mano tramite il comando:
/etc/init.d/apache restart
Ma a cosa serve il riavvio di Apache?
Ipotizzate di gestire un server e che decidiate di includere il supporto per lo scripting PHP: dovrete fare in modo che apache riconosca questi tipi di script, caricando l'apposito modulo (libphp3.so).
Come fare è presto detto: nel file httpd.conf, basterà decommentare la linea:
#LoadModule php3_module /usr/lib/apache/1.3/libphp3.so
Ricordiamo però che, essendo questa una modifica in run-time, Apache non potrà attuare la modifica a meno che sia riavviato. E la chiamata restart serve proprio a questo: se dovessimo riavviare il server completamente (senza dubbio anche questa soluzione funzionerebbe), rischieremmo un downtime del server troppo lungo: non stiamo parlando solamente di Apache, ma di tutte le funzioni a cui il server è preposto: servizi FTP, POP, SMTP ecc.
Con la chiamata restart, invece, andremo a riavviare solamente Apache, limitando il downtime al solo server HTTP, e tra l'altro il downtime risulterà molto più breve di un reboot della macchina, sull'ordine di una decina di secondi.
Capirete quindi l'utilità della chiamata restart.
L'ultima chiamata è stop: sarà senza dubbio chiaro che tramite stop fermeremo Apache del tutto.
La chiamata di stop può essere fatta in due modi: il primo è in automatico, allo spegnimento della macchina, quando cioè init manderà un SIGTERM a tutti i procesi attivi; per Apache, dovremmo veder comparire qualcosa del tipo:
Stopping web server: apache.
Se per qualche motivo abbiate bisogno di fermare apache a mano, ad esempio in caso di problemi non risolvibili all'istante, oppure di upgrade del pacchetto stesso (magari con un altro server in clustering per tenere attive le richieste!), la procedura sarà sempre la solita: basterà lanciare:
/etc/init.d/apache stop
e sarete sicuri che apache dopo pochi istanti smetterà di girare.
Avvio, riavvio e stop su NT:
Per questa breve sezione ci baseremo fortemente su NT, visto che far girare un webserver su un sistema win9x è impresa ardua, mancando a questo molte delle caratteristiche proprie di NT.
I modi per avviare Apache sono due:
- il primo è come servizio (solo per WinNT): questo è il metodo migliore per assicurarci che Apache venga avviato al boot della macchina e continui ad essere attivo anche in caso di logoff;
- da una console, peraltro unica opzione con Win9x.
Per avviare Apache come un servizio, è prima becessario che questo sia effettivamente installato come un servizio sula macchina: dal menu
d'avvio, scegliete l'opzione "Install Apache as Service"; fatto questo, apache potrà essere avviato aprendo la finestra dei servizi (dal
pannello di controllo), scegliendo Apache e successivamente su "start". Nel caso si volesse fermarlo, ovviamente, basterà cliccare su "stop".
In alternativa, Apache può essere avviato dalla linea di comando tramite i comandi:
NET START APACHE
NET STOP APACHE
rispettivamente per avviarlo e fermarlo.
Per avviare invece Apache da console, e non come un servizio, basterà cliccare l'opzione "Apache Server" dal menu d'avvio: verrà quindi aperta
una finestra dos che restarà aperta durante tutto il funzionamento del webserver.
Per il restart o lo stop, sarà sufficiente aprire un'altra finestra e digitare, rispettivamente:
apache -k restart
oppure:
apache -k shutdown
Entrambe sono altamente preferibili ad un brutale "Ctrl+c", che chiuderebbe Apache invece di arrestarlo, con tutte le conseguenze del caso.
Apache per Windows:
Come avviene per i sistemi Unix, anche una normale installazione sotto Windows comprende una directory nella quale è presente una ricca documentazione per il webserver; questa è, solitamente, ./htdocs/manual, sottodirectory della directory principale definita durante l'installazione. Tutto il manuale è in formato HTML, ed è a grandi linee l'equivalente del manuale online leggibile all'indirizzo http://www.apache.org. In questo sito, è inoltre possibile leggere delle note specifiche alla distribuzione Windows alla pagina http://www.apache.org/docs/windows.html
Essendo Apache un webserver sviluppato su piattaforma Unix, ed essendo la versione per Windows un porting, apparirà chiaro che la versione di Apache per Windows non è completamente ottimizzata per offrire le migliori performances, come avviene invece per la versione Unix. Per dire ciò, l'Apache Group si basa su prove comparative del software su differenti piattaforme.
Il risultato del lavoro di porting, come loro stessi dicono, è un "ottimo codice ancora in beta", visto che il funzionamento è garantito per differenti gradi di utenza ma non è ancora al livello raggiunto sulle piattaforme per le quali Apache è stato originariamente pensato. Quindi funzionamento e performances garantite, anche se non ai massimi livelli.
Vediamo ora una rapida carrellata dei maggiori problemi (noti) di Apache
utilizzato sotto Windows.
- La direttiva "User" non è ancora sopportata (questa direttiva, insieme
a "Group", specifica l'utente che fa partire il servizio httpd).
- Nel caso di server carico di richieste, quando un processo children
esce, qualunque richiesta fatta a quel processo che non sia stata
precedentemente accettata non viene eseguita.
- Le password, nel file htpasswd, sono conservate in un file di testo e
non crittate, mancando in Windows una funziona crypt().
- Il "suexec" non funziona; il suexec è la funzione che permette ad
Apache di eseguire script CGI e SSI con un UID (User ID) differente
dall'ID dell'utente sotto i permessi del quale Apache gira.
- La direttiva "IdentityCheck" non funziona; tale direttiva permette il
logging nel file access.log dei nomi degli utenti remoti per ogni
richiesta.
Messaggi d'errore personalizzati:
Vedremo in queste pagine come personalizzare i messaggi d'errore di Apache. I responsi personalizzati del webserver possono servire ai webmaster per far meglio capire agli utenti ciò che succede quando il loro browser esce con un messaggio d'errore in seguito ad una richiesta impossibile da soddisfare per i più svariati motivi (errori nell'esecuzione di script, richiesta id pagine inesistenti ecc.). I risultati della peronsonalizzazione possono essere fondamentalmente di due tipi: semplici messaggi di testo che spiegano sommariamente l'accaduto e redirezioni verso URL interne o esterne al nostro host.
Per impostare Apache in modo che riesca a produrre dei messaggi d'errore
personalizzati bisognerà andare ad agire sul file srm.conf nella rootdir
del webserver; in esso leggeremo infatti qualcosa del tipo:
# Customizable error response (Apache style)
# these come in three flavors
#
# 1) plain text
#ErrorDocument 500 "The server made a boo boo.
# n.b. the (") marks it as text, it does not get output
#
# 2) local redirects
#ErrorDocument 404 /missing.html
# to redirect to local url /missing.html
#ErrorDocument 404 /cgi-bin/missing_handler.pl
# n.b. can redirect to a script or a document using
# server-side-includes.
#
# 3) external redirects
#ErrorDocument 402 http://some.other_server.com/subscription_info.html
La sintassi base per i messaggi d'errore personalizzati è quindi:
ErrorDocument XXX azione
dove "ErrorDocument" è la direttiva, XXX è un numero di tre cifre
corrispondente al codice d'errore del server (ad esempio 404, 500 ecc.)
e "azione" è quello che il server deve fare in caso si riscontrino
questi errori.
Soffermiamoci su "azione" prima di vedere alcuni esempi: questa può
essere:
- del semplice testo da visualizzare, preceduto dallle virgolette (") ma
non dalle stesse chiuso; queste, inoltre, non verranno visualizzate
nel messaggio d'errore (primo caso riportato dal file srm.conf);
- un'URL locale (secondo caso riportato);
- un'URL esterna a cui redirigere il visitatore (terzo caso).
E' consigiato non abusare troppo delle redirezioni, soprattutto di quelle esterne: a molti potrebbe dare fastidio trovarsi inspiegabilmente
in un sito differente dal vostro per motivi che non si riescono a spiegare.
Vediamo ora qualche esempio per chiarire le cose:
- ErrorDocument 500 "Lo script richiesto non ha potuto essere eseguito per problemi interni.
In questo caso, in presenza di un "Error 500" avverte il visitatore che lo script chiamato dal suo browser ha avuto dei problemi
nell'esecuzione e l'output non può essere visualizzato. Questo è un tipico esempio di messaggio d'errore in forma semplicemente testuale.
- ErrorDocument 500 http://www.altro_server/cgi-bin/script.cgi
In questo secondo caso ci troviamo di fronte ad una redirezione esterna, che porterà il visitatore (in maniera totalmente trasparente, a parte
l'indirizzo nel browser) ad un host esterno dove verrà eseguito lo stesso script che questi avrebbe voluto veder eseguito sull'host
originario. Questo esempio può essere utile per dimostrare come può essere fatto un uso intelligiente delle redirezioni esterne: sarebbe
buona norma, però, controllare (a livello di codice dello script CGI) l'URL dalla quale proviene il visitatore e, nel caso questa combaci con
quella dell'host originario (quello in cui egli ha tentato di eseguire lo script) mandare in output un messaggio che lo avverta di cosa è
avvenuto e del perchè la sua richiesta è stata spostata su un diverso host. Questioni di cortesia verso gli utenti smarriti.
- ErrorDocument 404 /missing.html
Se preparate una pagina chiamata "missing.html", per ogni errore 404 (Url not found) verrà visualizzata questa pagina, dove potrete personalizzare
nel modo che vi sembra più opportuno. E' chiaro che siamo anche qui di fronte ad una redirezione interna. E' da notare, inoltre, che è possibile
redirigere il visitatore a qualsiasi tipo di pagina, sia un plain text che in html, sia contenete uno script che contenente degli includes: se la pagina
predefinita (missing.html) è corretamente scritta, non ci sarà alcun problema per il server ad interpretarla in quanto essa è vista come una
semplice pagina da inviare al browser dell'utente.
Impostazione dei files di LOG:
Prima di tutto, è necessario istruire Apache sulla locazione dove conservare i file di log. Una buona idea è quella di creare una sottodirectory di /var/log chiamata "apache", nella quale esso potrà scrivere quanto necessario. Ma come indirizzare i log di apache in tale directory? Ancora una volta, ci viene incontro il file httpd.conf, vero fulcro di Apache.
Scorriamo il file fino a giungere alla riga
# ErrorLog: The location of the error log file
Come essa stessa specifica, la locazione sotto indicata è quella in cui
Apache terrà i suoi logs; nelle ipotesi fatte sopra, la specificazione
della directory deve essere fatta come:
ErrorLog /var/log/apache/error.log
in modo da essere sicuri che il log degli errori sia proprio all'interno della directory /var/log/apache con il nome (arbitrario) di error.log
Oltre che agli errori, ci interesseremo anche degli accessi, loggato nel file access.log. Qui valgono tutte le considerazioni fatte sopra: la directory sarà la stessa (/var/log/apache) ma il file si chiamerà access.log. Per specificarlo, basterà avere una riga simile a:
CustomLog /var/log/apache/access.log
Se non l'avete già fatto, avviate Apache, giocateci un po' ed andate a vedere i file appena creati: se non avete sbagliato niente, in /var/log/apache avrete due nuovi file che vedremo in seguito come leggere.
Tipologia dei files di LOG:
Oltre a impostare quali debbano essere i file di log di Apache, possiamo anche determinare come devono essere composti, che informazioni devono contenere, quanto completi devono essere ecc. Vediamo come.
Continuando a scorrere il file httpd.conf, noteremo una serie di righe (sotto a ErrorLog) che iniziano con
# LogLevel: Control the number of messages logged to the error_log.
Tramite questa direttiva, possiamo decidere il livello di verbosity dei messaggi che vengono scritti nei file error_log; abbiamo diverse possibilità:
- debug: messaggi utili al debug;
- info: informazioni generali;
- notice: condizioni normali ma significative;
- warn: warning;
- error: errori generali (del tipo "Premature end of script headers",
utili per il debugging degli script CGI);
- crit: condizioni critiche;
- alert: bisogna provvedere immediatamente;
- emerg: emergenze, il sistema è inutilizzabile.
Le possibilità sopraelencate sono riportate in ordine di importanza crescente: quindi un LogLevel impostato su "debug" darà molte meno informazioni che non settato su "emerg". Inolte, se scegliete un livello di verbosity elevato, anche i livelli inferiori saranno in esso inclusi: ad esempio, scegliendo il livello "crit", anche i messaggi normalmente riportati in "debug", "info", "notice", warn" ed "error" saranno riportati nel file di log.
Sta a voi decidere il livello di importanza dei mesaggi di log, sebbene una scelta abbastanza standard potrebbe essere "error" oppure "crit".
Scorrendo di qualche riga il file, noterete anche la direttiva "LogFormat", che specifica i formati dei file. Vediamo quali possono essere i più significativi:
%b --> Byte inviati, esclusi gli headers HTTP;
%f --> Il Filename
%{VAR}e --> Il contenuto della variabile d'ambiente {VAR}
%h --> L'host remoto
%a --> L'indirizzo IP remoto
%l --> Il logname remoto, se specificato
%p --> La porta dalla quale il server esegue la richiesta
%P --> L'ID del processo che esegue la richiesta
%r --> La prima riga della richiesta
%s --> Lo stato della richiesta
%t --> L'orario delle richiesta
%T --> Il tempo in secondi per eseguire la richiesta
%u --> Il nome dell'utente remoto
%U --> L'url richiesta
Una riga standard per determinare i tipi di log potrebbe comunque essere:
"%h %l %u %t \"%r\" %s %b";
Leggere dei files di LOG:
Saper leggere i log, specialmente se si stanno sperimentando nuove soluzioni, può essere molto utile per la risoluzione di alcuni problemi, nonchè per altri controlli che un buon sysadmin deve saper fare.
Ad esempio, in access.log potremo andare a controllare gli accessi in un determinato giorno ad un deterninato script o ad una determinata pagina: prendete ad esempio la righe:
127.0.0.1 - - [17/Feb/2000:17:07:38 +0100] "POST /cgi-bin/ml/mail-admin.pl HTTP/1.0" 200 1522
127.0.0.1 - - [17/Feb/2000:17:08:41 +0100] "GET /cgi-bin/ml/subscribe.html HTTP/1.0" 403 223
127.0.0.1 - - [17/Feb/2000:17:08:48 +0100] "GET /cgi-bin/ml/subscribe.html HTTP/1.0" 500 514
127.0.0.1 - - [17/Feb/2000:17:09:15 +0100] "GET /cgi-bin/ml/subscribe.html HTTP/1.0" 500 514
Il primo campo è l'indirizzo del server (è un server standalone, quindi con indirizzo 127.0.0.1!), viene poi la data, il metodo di richiesta, il nome della pagina o dello sciript richiesto ed il protocollo utilizzato per la richiesta; seguono poi i PID dei processi.
Andiamo a vedere invece come si può presentare error.log:
[Thu Feb 17 17:08:41 2000] [error] [client 127.0.0.1] file permissions
deny server execution: /usr/lib/cgi-bin/ml/admin.pl
[Thu Feb 17 18:05:40 2000] [notice] httpd: child pid 215 exit signal Segmentation fault (11)
[Fri Feb 18 10:39:18 2000] [error] [client 127.0.0.1] File does not exist: /var/www/pino
[Fri Feb 18 10:41:49 2000] [notice] httpd: caught SIGTERM, shutting down
Ho qui preso quattro righe per poter evidenziare vari casi (che comunque non sono i soli).
La prima indica un errore nei permessi di un file, e l'incapacità del server di eseguirlo: probabilmente (anzi, sicuramente visto che l'ho
fatto apposta!!) si tratta di uno script CGI con i permessi non impostati correttamente.
La seconda è una semplice notizia: un child process è andato in Segmentation fault, lasciando insoddisfatta una richiesta. La terza è un errore che mi avverte che la directory /var/www/pino non esiste: avevo infatti cercato di raggiungere la directory "www.mio_server.it/pino". La quarta invece è il risultato di un restart di Apache (mentre facevo delle prove): al riavvio, vengo avvertito che Apache ha ripreso la normale attività.
Il consiglio, a questo punto, è semplice: se volete imparare a leggere correttamente i file di log, oltre ad un certo intuito e ad una conoscienza del proprio sistema, è necessario fare delle prove, magari compiendo di proposito degli errori per vedere come il server risponde.
Con questo breve testo analizzaremo qualcosa che a molti sembrerà impensabile: vedremo come utilizzare documenti ASP con Apache.
Le active Server Pages (ASP) sono un'applicazione che ha avuto origine con l'introduzione del server IIS di Microsoft, e che normalmente non si trovano nei sistemi Unix che fanno girare un webserver differente da IIS.
Ma se è vero che a tutto c'è una soluzione, ebbene ... qui presentiamo la migliore per coloro che vogliano utilizzare documenti scritti in ASP anche con Apache. Basterà solamente avere un po' di pazienza nella fase di configurazione di Apache per l'interazione con il modulo, non immediata ma ben documentata.
Vista poi la grande diffusione di questa tecnologia, è certamente interessante il progetto di rendere questa tecnologia indipendente dalla piattaforma utilizzata
Come fare con ASP:
Molto semplicemente, basterà procurarsi un modulo, Apache::ASP, reperibile come tutti gli altri su CPAN.
Non spiegheremo certo in questa sede come si programma in ASP, anche perchè molto probabilmente coloro che stanno leggendo queste righe lo sapranno già fare: in caso contrario, vi consigliamo di leggere la documentazione presentata su www.html.it. Vedremo invece come utilizzare il modulo affinchè ci permetta di utilizzare la tecnoligia ASP su un webserver Apache.
Continuiamo con la descrizione del modulo di cui qui ci occuperemo; Apache::ASP, dicevamo, è la soluzione ideale per chi abbia la necessità di utilizzare pagine scritte in ASP anche sotto Apache, ad esempio per un cambio di server o occasioni simili, oppure per semplice curiosità! Il risultato sarà di massima equivalente a quello che si ottiene caricando una pagina ASP direttamente da IIS, sebbene si lavori ancora sul modulo perchè i risultati siano del tutto identici a quelli che si possono ottenere con IIS.
Tramite il modulo, in pratica, Apache opportunamente istruito interpreterà il documento ASP e visualizzerà il normale output HTML. Con quell' "opportunamente istruito" intendiamo che bisognerà configurare Apache con determinate direttive affinchè interagisca con il modulo e dia a questo la possibilità di interpretare correttamente i documenti ASP. Per la configurazione, rimandiamo alla documentazione del modulo Apache::ASP, che presenta una lista di direttive da includere nel file "access.conf" nella root directory di Apache: questa è alquanto dettagliata e spiegata fin nei minimi particolari.
Vediamo ora gli oggetti utilizzabili tramite il modulo: per chi conosca già la programmazione ASP, questi non saranno una novità e si potrà inoltre notare l'analogia con quelli utilizzabili tramite IIS; insomma, sebbene il modulo abbia dei lati negativi che vedremo in seguito, la mancanza di compatibilità con gli strumenti di IIS non è certo uno di questi.
In breve, gli oggetti sono:
$Session
$Response
$Request
$Application
$Server
Ognuno di essi, poi, ha dei metodi che possono essere utilizzati dal programmatore a seconda delle sue esigenze; anche per essi, non mancherà una nutrita lista con tanto di esempi su come utilizzare ogni metodo.
Ci sono però dei piccoli problemi:
Ebbene sì, dobbiamo qui ridimensionare il discorso lodevole fatto a proposito del modulo: non comunque a livello di potenzialità dello stesso che, come abbiamo visto poco sopra, permette una piena utilizzazione di documenti scritti con tecnologia ASP in modo completamente trasparente per l'utente che li richiami.
Le "pecche" a cui faremo qui riferimento sono fondamentalmente due.
La prima è una certa difficoltà di installazione e, soprattutto, di configurazione del webserver per l'interazione con il modulo: sebbene la documentazione cerchi di venire incontro quanto più possibile all'utente, con tanto di esempi, essa non è particolarmente indicata per coloro che non abbiano troppa familiarità con il webserver Apache: saranno infatti necessarie pesanti modifiche al file access.conf affinchè l'interazione fra webserver, modulo e pagine ASP sia efficiente: cito comunque dalla documentazione che "(a proposito delle direttive da impostare) Don't set the optional ones if you don't want, the defaults are fine...". Certamente, quindi, basterà molto poco perchè il tutto funzioni, ma per una completa e minuziosa ottimizzazione bisigna sapere cosa impostare e come impostarlo: ma specialmente per macchine utilizzate come server web con carichi di lavoro elevati l'ottimizzazione globale del sistema non è solo una cosa consigliata, ma una vera e propria necessità.
Il secondo lato negativo su cui ci dobbiamo fermare è l'alta richiesta di risorse di sistema utilizzate dal modulo: capirete che con IIS il webserver va direttamente ad interpretare i documenti ASP, su una macchina Unix invece le parti in causa non sono più solamente due, ma al webserver ed ai documenti si frappongono il modulo Apache::ASP e, ovviamente, l'interprete Perl; se questo vi sembra ancora poco, riporto le prime righe del modulo:
use Apache();
use MLDBM;
use SDBM_File;
use Data::Dumper;
use File::stat;
use File::Basename;
use FileHandle;
use Fcntl qw( O_RDWR O_CREAT );
use MD5;
use HTTP::Date;
Un'altra decina di moduli che Apache: ASP deve andarsi a leggere per poter interpretare i documenti ASP e visualizzarne l'output.
E' da sperare che, con le prossime releases del modulo, siano apportati miglioramenti anche in fatto di leggerezza dello stesso, evitando così carichi troppo elevati per le macchine.
In questo tutorial ci occuperemo di un problema che a molti è caro: rendere protette alcune pagine del nostro sito: la presenza di documenti riservati, aree ristrette ai soli membri, zone a pagamento ... tutti questi possono essere buoni motivi per vietare ad occhi indiscreti la visione di determinate pagine.
Questo si svolgerà in due fasi: nella prima, vedremo come configurare Apache perchè riesca a limitare l'accesso alle directory che ci interessano; nella seconda, come automatizzare l'operazione della creazione degli account tramite l'uso di script o delle utility scritte apposta per questo scopo
Configurare Apache:
Solitamente Apache, così com'è, non è configurato affinchè possa
proibire o permettere l'accesso alle directory: avremo quindi bisogno di
tre strumenti: due modifiche ad altrettanti file di configurazione ed un
file .htaccess.
La prima modifica che dobbiamo fare è nel file "srm.conf": scorriamolo
fino ad arrivare alla linea che inizia con "AccessFileName": questa
direttiva indica il nome del file da utilizzare per leggere gli
attributi che dobbiamo dare alle directory nelle quali tale file è
presente. Teoricamente, la direttiva dovrebbe essere seguita da
".htaccess", che è un nome standard (ma utilizzabilissimo!) per i server
Apache. Forse qualcuno si chiederà a cosa serva il puntino prima del
nome: ebbene, negli Unix tutti i file che iniziano con un punto sono dei
file nascosti, che non sono visibili tramite il comando "ls", equivalente
del "dir" del dos. Rendere nascosto un file così importante può sempre
essere utile.
Vediamo come Apache interpreta tale direttiva: una volta che avrete
deciso il nome del file che conterrà le istruzioni e che avrete
riavviato Apache per rendere efettive le modifiche, Apache andrà a
cercare per ogni directory richiamata da un browser questo file, dal
quale leggerà le istruzioni. Ovviamente, se questo non è presente,
Apache agirà come di norma; se invece il file esiste, Apache lo leggerà
e agirà di conseguenza: se abbiamo impostato delle protezioni tramite
password, Apache farà in modo che il browser visualizzi una maschera
nella quale vengono richiesti username e password, tramite i quali
Apache può verificare o meno l'autenticità del richiedente.
La seconda modifica da attuare è nel file access.conf: scorrete anche
questo file fino ad arrivare alla riga "AllowOverride": inserendo un
"AuthConfig" Apache richiederà l'autentificazione. Le possibilità, oltre a
questa sono molte, in modo da poter affinare il processo di protezione:
se volete saperne di più, leggete il file
manual/mod/core.html#allowoverride, presente nella directory locale della
documentazione di Apache.
Riavviato Apache, saremo pronti a preparare il file che servirà a
proteggere le directory che ci interessano, che supporremo essere
".htaccess".
Immaginiamo di voler proteggere la directory remota
"http://localhost/prova", corrispondente alla directory locale
"/var/www".
Prima di tutto, creiamo un file ".htaccess" all'interno di questa
directory, e scriviamoci:
AuthName "prova"
AuthType Basic
AuthUserFile /etc/apache/passwd
require valid-user
Vediamo le caratteristiche del file:
La prima riga indica il nome della protezione: nella maschera che il browser
ci mostrerà leggeremo infatti: "Enter username for prova at localhost". Il
discorso, a dire la verità, sarebbe molto più ampio: sappiate comunque che,
qualsiasi altro file o directory protetto con lo stesso nome in AuthName sarà
accessibile senza la necessità di eseguire ulteriori autorizzazioni.
La seconda riga indica il tipo di autorizzazione da eseguire: al
momento, solamente l'autorizzazione del tipo "Basic" è implementata,
sebbene sia già in lavorazione un'autorizzazione "digest".
La terza riga indica il file che Apache andrà a leggere per verificare
se l'username e la password inseriti sono corretti: approfondiremo a
breve questo discorso.
La quarta riga, infine, controlla gli username: con "require valid-user"
Apache accetterà qualsiasi username presente nel file specificato in
AuthUserFile. Si potrebbe invece limitare maggiormente l'accesso,
inserendo gli username ai quali (e solo ai quali, indipendentemente
dalle entries presenti in AuthUserFile) l'accesso è consentito: quindi
potrete scrivere
require user nome1 nome2 nome3 ecc.
E' possibile inoltre far riferimento ai gruppi, specialmente quando il
numero di utenti cresce troppo. I gruppi funzionano come quelli dei
sistemi Unix ed ogni utente può far parte di più gruppi. Si potrà quindi
scrivere qualcosa del tipo:
require group nome_del_gruppo
Come con gli utenti, anche in questo caso possono essere specificati più
nomi di gruppo da utilizzare. Se invece si usa "require group" insieme a
"require user" succede una cosa del genere: qualunque utente membro di
uno dei gruppi indicati può avere accesso, così come ogni utente
esplicitamente specificato.
Come per gli utenti avevamo creato il file /etc/apache/passwd, dovremo
creare anche un file per i gruppi: questo, semplicemente, sarà formato
da linee del tipo:
nome_del_gruppo:nome1 nome2
Ancora, come con il file passwd, dovremo specificare ad Apache dove
andare a leggere i gruppi ed i suoi appartenenti: utilizzeremo
AuthGroupFile /etc/apache/group
In definitiva, quindi, il file .htaccess completo potrebbe essere:
AuthName "prova"
AuthType Basic
AuthUserFile /etc/apache/passwd
AuthGroupFile /etc/apache/group
require valid-user
require group admin
Creazione degli utenti:
Adesso che sappiamo come concedere e vietare l'accesso a determinate
directory nei server, preoccupiamoci di come creare il file. Questo, a
differenza del file dei gruppi, conterrà delle righe nella quali è
specificato l'username e la password crittata, nella forma:
username:password
Ma come creare le coppie utente-password? I metodi sono due.
Il primo nonchè il più complesso è quello di creare uno script del tipo:
#!/usr/bin/perl
print "Inserisci un username:\n";
chomp($name=<STDIN>);
print "\nInserisci la password per $name:\n";
chomp($pwd=<STDIN>);
print "\nConferma la password per $name\n";
chomp($pwd_confirm=<STDIN>);
if ($pwd ne $pwd_confirm) {
# Le due password digitate non sono uguali
print "Conferma password per $nome non riuscita\n";
exit;
} else {
open(PASSWD, ">> /etc/apache/passwd")
|| die "Non riesco ad aprire il file. $!\n";
# Critta la passord
$crypted_pwd = crypt($pwd,'aa');
#Scrive la coppia username:pwd nel file
print PASSWD "$name:$crypted_pwd";
close PASSWD;
print "\nOperazione riuscita!\n";
}
Vediamo in dettaglio cosa fa lo script: dopo aver chiesto un nome e la
password, chiede conferma per la password: se la conferma ha esito
negativo, avverte della differenza fra le password digitate ed esce; in
caso contrario, apre il file che contiene le coppie username-password,
critta la password inserita e scrive nel file "nomeutente-password". Ad
operazione conclusa, chiude il file e avverte del successo
dell'operazione.
Lo script, soprattutto per chi si intende di programmazione, non è certo
un gioiello ma serve a svolgere il suo lavoro: se volete utilizzarlo,
sappiate che è necessario apportargli alcune modifiche come ad esempio
il controllo che un username non sia già presente nel file,
un'istruzione che in caso di fallimento della conferma della password
faccia in modo che lo script riparta dall'inizio ecc.
Il secondo metodo, invece, è quello di utilizzare l'utility htpasswd,
che crea ed aggiorna i file di autentificazione utilizzati da Apache.
La sintassi è assai semplice:
htpasswd -c file username password
Il flag "-c" dice all'utility di creare il file delle password nel caso
questo non esista; ATTENZIONE che se il file esiste, verrà sovrascritto
con la conseguente perdita dei dati precedenti.
Vediamo un paio di esempi:
htpasswd -c /etc/apache/passwd user
creerà il file "/etc/apache/passwd" ed inserirà l'username "user" e
chiederà la password (con conferma, anche in questo caso) per l'utente
htpasswd /etc/apache/passwd user
si può comportare in due modi: se l'utente non esiste, inserisce
l'username e chiede la password; se invece l'utente esiste, htpasswd
capirà che vogliamo cambiare la password all'utente specificato,
chiedendocela.
E con questo, spero, avrete capito come utilizzare le autorizzazioni di
accesso con Apache per vietare ai non addetti l'accesso a determinate
directory del server della vostra rete o del server remoto.
Meglio Linux o Nt?
I benchmark sono test di confronto che intendono mostrare le performance di un prodotto con software e hardware. Diversi produttori e riviste si sono avventurati in benchmark su Linux ed NT, creando non poca confusione. HTML.it tenta di fare luce mettendo a confronto gli stessi benchmark
Scegliere NT o Unix?
I due webserver maggiormente diffusi sulla rete sono, senza dubbio alcuno, IIS della Microsoft e l'avversario Apache, sviluppato sulle ceneri di un precedente progetto e da un team di volontari.
La differenza principale fra i due applicativi è la piattaforma per la quale sono stati pensati: IIS per server basati su sistemi Windows, Apache per la grande famiglia degli Unix; un punto a favore di Apache può comunque essere lo sforzo (in parte anche riuscito) di portare il webserver su piattaforme non native, quali ad esempio i sistemi Windows: ovviamente, le migliori performances si ottengono su piattaforma nativa, anche se, si mormora, Apache sulle altre piattaforme non si comporta poi male.
La "lotta" fra questi due webserver è sempre stata aperta, facendo conseguire anche un forte dualismo fra i due sistemi operativi che li supportano: Windows da una parte, gli Unix dall'altra. E, come tutti i dualismi, ognuno afferma, dati alla mano, che il proprio prodotto è migliore del concorrente.
Ma ci si può fidare dei dati che ci vengono, per così dire, propinati? Se la Microsoft dicesse che IIS supera Apache in performances in tutti i campi, ci credereste a priori? E se avvenisse il contrario? Spesso, poi, anche degli esterni ai progetti si sono lanciati in selvaggi benchmark, con risultati a volte accettabili altre assolutamente inaccettabili: se un applicativo è testato su un sistema dell'ultima generazione e l'altro su una vecchia macchina da soffitta, chi credete che possa vincere l'ipotetica sfida?
La rete, questa sorta bacheca di informazioni, mette a disposizione moltissime pagine con i risultati dei benchmark fra IIS e Apache: nella stragrande maggioranza dei casi, comunque, questi risultano fortemente di parte.
Vedendo i risultati dei test nella pagine delle compagnia "x" che si dichiara partner di Microsoft, oppure quelli della compagnia "y" partner di Apache, sareste disposti a credere che i risultati siano veritieri? Magari lo sono, ed i dati risultanti non sono stati manipolati, ma chi ci assicura che un test è stato fatto su un 486 e l'altro su una macchina quadriprocessore? Ad esempio, Netcraft afferma che la coppia Linux/Apache è la più utilizzata come server web; Mindcraft, invece, afferma che è esattamente il contrario, anche per il fatto che NT/IIS è circa tre volte più veloce di Linux/Apache ...
Insomma, anche qui ci sarebbe molto da discutere senza, purtroppo, arrivare ad alcuna conclusione. A meno di volersi fare i test in casa da soli, a qualcuno bisognerà pur credere.
Navigando per l'intricata rete, mi sono imbattuto in due pagine con gli amati-odiati benchmark, che sembrano essere stati condotti con sufficiente serietà e senza voler portare l'acqua al mulino di nessuno: ovviamente mi posso sbagliare, ma fa anche questo parte del gioco.
Inoltre, non aspettatevi alcun tipo di commento personale : quello che leggerete è solo un estratto delle due pagine.
Prima di passare ai benchmark, ricordo che si sentirà spesso parlare di NT e Linux, che stanno ad indicare il comportamento, rispettivamente, fra NT/IIS e Linux/Apache.
Alcuni test:
Questa pagina mi ha subito stupito per una frase: "Server benchmarks comparing Linux and NT are in. Mostly, however, they try to make headlines by breaking records in unrealistic benchmark scenarios. In c't's test lab, a comparison between NT/IIS and the freeware duo Linux/Apache focused on practice-oriented tasks."
Insomma, si afferma che moltissimi test di benchmark sono condotti senza criterio; quelli condotti da loro, invece, sono basati sulla pratica.
Vero o no, facciamo finta che lo sia.
Intanto, le parti in gioco:
1) windows NT con service pack 4 e IIS 4;
2) linux suse 6.1, kernel 2.2.9 e apache 1.3.6
Entrambi, ovviamente sulle stesse macchine. I client invece erano macchine di fascia bassa (i server erano equipaggiati con quattro
processori Pentium II Xeon a 450 Mhz, due Gb di RAM ed una scheda di rete), alcuni Linux altri Windows (9x e NT), simulando così qualcosa come 1024 richieste in simultanea.
Il primo test è stato effettuato facendo richiedere a tutti i client la stessa pagina HTML da 4Kb: il risultato è una sostanziale parità di performances fra i due webserver.
Il secondo, invece, si basa su una richiesta casuale da parte dei client di una pagina fra le 10.000 (ovviamente della stessa grandezza) presenti in una directory del server. In questo test, Linux/Apache è risultato circa il 15% più veloce.
Il terzo test, che inizia ad essere impegnativo per le macchine, si basa sulla richiesta di una quantità di file di due volte superiore a quella della RAM dei server (quindi qualcosa come 4 GB di pagine richieste). NT/IIS sembra non riuscire a sopportare più di 30 richieste al secondo, mentre Linux/Apache arriva a 166. La differenza, si commenta, può essere principalmente dovuta la tipo di partizione utilizzata dai sistemi (in termine di grandezza dei cluster o inode) che non alle capacità degli stessi.
Il quarto test si basa non più su pagine statiche come nei precedenti tre test, ma su pagine dinamiche: la scelta è ricaduta sui CGI, non essendo le tecnologie ASP e VBscript direttamente portabli ad altri sistemi. Su NT è stato installato ApcivePerl 517.3, equivalente al Perl 5.005_3
presente sul server Linux. Il risultato è palese: NT/IIS soffrono della "non-natività" del linguaggio Perl utilizzato per l'interpretazione dei CGI, riscontrabile come un'eccessiva lentezza nell'invio delle pagine create dinamicamente. Ma per questo test, avvertono, il risultato era scontato dall'inizio, e quindi poco significativo. Ricordiamo infatti che il Perl, linguaggio più largamente utilizzato per scrivere script
CGI, è nato in ambiente Unix e, sebbene il porting di Activestate per le piattaforme Windows sembra essere molto ben riuscito, ancora una volta
la non-natività del linguaggio di interpretazione si fa sentire.
L'ultimo test è quello di servire sedici macchine tramite due schede di rete. Qui NT/IIS riesce a prevalere sull'avversario Linux/Apache anche con una potenza di calcolo minore, ossia con un processore in meno. La velocità con cui NT/IIS invia le pagine ai client ha fatto
addirittura pensare che le performances non sarebbero peggiorate significativamente neanche con quattro schede di rete al posto di due.
Questo dimostra che NT, quando ci si attiene alle sue "regole", può essere veramente veloce.
Le conclusioni degli autori del test sono le seguenti: per una rete mista, formata cioè da richieste differenti ed indipendentemente dal volume delle stesse, l'accoppiata Linux/Apache risulta migliore. Per un server con più schede di rete e con prestazioni medio-alte, NT/IIS è
l'accoppiata ideale.
Ovviamente, poi, sottolineano il fatto che le necessità possono essere anche altre, ad esempio il linguaggio di scripting da adottare (CGI, ASP, VBscript ecc.), la potenza della macchina da utilizzare (sembra infatti che Linux/Apache riesca a "spremere" maggiormente le CPU, sebbene NT/IIS
appaia sempre più performante per ogni CPU aggiunta) ecc.
Insomma, tennisticamente parlando il risultato è un "40-30" a favore di Linux/Apache: la non netta supremazia dell'uno o dell'altro mi ha fatto scegliere questa pagina, considerata imparziale nei giudizi.
Conclusioni:
Avevo detto all'inizio che non mi sarei sbilanciato su conclusioni che
potrebbero (anzi, sarebbero state!!) personali: ebbene, non mi rimangio
tutto ma voglio solo fare alcune considerazioni che considero oggettive.
In primo luogo, l'hardware utilizzato per le prove è determinante per gli
esiti dei benchmark: ovviamente si parla a parità di macchine, ma è
ovvio che se un sistema è ottimizzato per avere le migliori prestazioni
su una macchina configurata in un determinato modo e con determinato
hardware installato, per le altre c'è poco scampo.
Se NT è ottimizzato per lavorare con il processore1 sulla scheda
Ethernet1 , il processore2 sulla 2 e via dicendo, ovviamente le
prestazioni a confronto con quelle di Linux che non impiega un procesore
per ogni scheda sono migliori; inoltre, in un caso come quello appena
visto, non impegnando direttamente Linux un processore per ogni scheda, si
sarebbe dovuta (o almeno potuta!) misurare la capacità dei due sistemi, a
parità di carico, di gestire altre applicazioni. Così come Linux su sistemi
"poveri" si comporta meglio di NT, visto il minor impiego di risorse di questo
sistema. E questi sono solo due casi che si possono ipotizzare.
Inoltre, per quanto riguarda sia Linux che NT, c'è un discorso da fare a
livello di software:
1) per Linux, la versione del kernel c'entra molto: ogni nuova versione è un miglioramento della precedente, ed è quindi matematico che una versione del kernel più aggiornata garantisca migliori prestazioni di una vecchia versione;
2) Per NT è la stessa cosa a livello di Service Pack: purtroppo non tutti i benchmark riportano la versione di SP utilizzata, ma anche qui è ovvio che una versione aggiornata comporta una crescita di prestazioni; altrimenti, a cosa servirebbero le patch??
A questo punto ognuno può pensare quello che vuole, i dati sono questi e sono forniti da società presumibilmente serie. Le differenze ci sono, ed ho cercato anche di motivarle per quanto mi fosse possibile: sta ad ognuno, se interessato, provare se questi siano veritieri o meno.
Ricordatevi sempre che, comunque, un tecnico windows riuscirà sempre a far prevalere (anche in buona fede) un sistema NT su un sistema Linux e viceversa! Credo che anche le competenze software siano un buon elemento per poter giudicare i test proposti!
Il protocollo HTTPS
Quello che qui tratteremo sarà il rapporto fra il webserver Apache ed il protocollo HTTPS, ossia il protocollo HTTP con il supporto SSL. Vedremo quindi dove reperire i sorgenti, come compilarli, come creare dei certificati e come configurare al meglio il server per abilitare il supporto HTTPS.
Quello di cui tratteremo in queste pagine sarà riferito ai soli sistemi Unix, visto che l'implementazione del protocollo SSL su altre piattaforme non è ancora stata realizzata
Il codice sorgente:
Ovviamente, prima di iniziare abbiamo bisogno del giusto codice sorgente
di Apache, reperibile all'homepage del progetto Apache-SSL,
http://www.apache-ssl.org/. Alternativamente, è possibile trovare una
versione di Apache con supporto SSL già nei pacchetti del proprio
sistema: ad esempio, nella Debian 2.2 che sto al momento utilizzando è
presente il pacchetto "apache-ssl-1.3.9.12+1.deb" che, una volta installato,
ci farà avere un webserver Apache già compilato con il supporto SSL built-in.
Per chi non abbia tale pacchetto, il download dei sorgenti da compilare
è l'unica strada da seguire.
A questo punto, ci servirà anche una libreria per la crittatura dei dati
da utilizzare per il "secure HTTP": stiamo parlando di "SSLeay",
reperibile via FTP al sito ftp://ftp.psy.uq.oz.au/pub/Crypto/SSL/;
scaricata e spostata in qualche directory come, ad esempio, /usr/local,
non ci resterà che decomprimerla ed entrare nella risultante
sottodirectory SSLeay-xxx (dove "xxx" è il numero di versione della
libreria). Dopo aver letto il file INSTALL, siamo pronti per installare
la libreria: lanciando ./Configure ci verrà fornita una serie di sistemi
operativi fra cui scegliere: troviamo il nostro e lanciamo nuovamente
"./Configure nostrosistema".
Fatto questo, potremo scaricare dal sito FTP
ftp://ftp.ox.ac.uk/pub/crypto/SSL/ la patch per Apache: applichiamola ai
sorgenti come descritto nel file README.SSL ed iniziamo a compilare
Apache: se il processo di patching è andato a buon fine, dovremo vedere,
nei sorgenti di Apache, che la riga
SSL_BASE=
punti esattamente alla directory dove è presente la libreria SSLeay, nel
nostro caso /usr/local/SSLeay-xxx. Se tutto è a posto, non ci resta che
lanciare lo script "./configure" che creerà il Makefile seguito da un
"make" per compilare i sorgenti. Se tutto va per il verso giusto,
dovremo veder apparire l'eseguibile "httpsd", che sarà proprio il demone
che supporterà il protocollo HTTPS.
Il primo certificato:
Adesso che abbiamo il demone httpsd, possiamo creare il nostro
certificato: le informazioni che servono sono tutte contenute nel
Makefile creato dal "./configure" lanciato dalla directory dei sorgenti
di Apache, quindi potremo lanciare il comando
make certificate
che compilerà quello che serve, creando la chiave RSA a 1024 bit e
ponendoci alcune domande sul nostro server, ad esempio:
- Country Name (2 letter code);
- State or Province Name;
- Locality Name (eg, city);
- Organization Name;
- Organization Unit Name;
- Common Name (eg, ssl.domain.com; required!);
- Email Address;
Fornendo tali informazioni, verrà creata la nostra chiave privata RSA ed
il nostro certificato: è da notare che la maggior parte delle domande che
ci verranno fatte sono opzionali, e che solo "Common Name" è richiesta, per
ovvie ragioni.
La chiave RSA che risulterà sarà qualcosa di simile a:
-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQDBpDjpJQxvcPRdhNOflTOCyQp1Dhg0kBruGAHiwxYYHdlM/z6k
pi8EJFvvkoYdesTVzM+6iABQbk9fzvnG5apxy8aB+byoKZ575ce2Rg43i3KNTXY+
...
C5VTb4CUF7d6ukDVMT2d0/SiAVHBEI2dR8Vw0G7hJPY=
-----END RSA PRIVATE KEY-----
mentre il certificato sarà qualcosa tipo:
-----BEGIN CERTIFICATE-----
MIICvTCCAiYCAQAwDQYJKoZIhvcNAQEEBQAwgaYxCzAJBgNVBAYTAlVTMQ8wDQYD
VQQIEwZOZXZhZGExFTATBgNVBAcTDEhvcGVmdWwgQ2l0eTEZMBcGA1UEChMQQnV0
...
7kM1LoxQjZL0bg61Av3WG/TtuGqYshpE09eu77ANLngp
-----END CERTIFICATE-----
Ovviamente, per non riportare inutili linee piene di simboli, non è
stato riportato il certificato per intero, ma è stato "virtualmente"
tagliato con l'uso dei "..."; ovviamente, quando creerete la vostra
chiave ed il certificato non vedrete i puntini ma una serie di righe
formate da una sequenza di caratteri. Ricordiamo, inoltre, che l'output
di tutto il lavoro fatto per la creazione della chiave RSA e del
certificato è nel file "httpsd.pem".
Il file di configurazione:
A questo punto siamo a posto per quanto riguarda il demone httpds, la
chiave RSA ed il nostro certificato: quello che ci manca è un file di
configurazione che dica al webserver come comportarsi quando è stabilita
una connessione SSL; un esempio di file di configurazione è reperibile,
sempre fra i sorgenti di Apache, alla directory ../apache/SSLconf/conf.
Tale file si occupa di creare due "siti", uno sicuro sulla porta 8888 ed
uno "normale" (semplice protocollo HTTP) sulla porta 8887. Vediamo le
voci del file che ci interessano: noterete che molte sono simili a
quelle incontrate per i normali file di configurazione di Apache.
User webuser
Group webgroup
# L'utente ed il gruppo, come per il file httpd.conf
Loglevel debug
# Il livello di dettaglio dei file di log
ServerType standalone
# A differenza di httpd.conf, in una connessione SSL il server deve
# essere di tipo standalone, e non lanciato da inetd.
Port 8887
# La porta nella quale il server è in ascolto: di default, questa
# sarebbe la 443 (da /etc/services:
# https 443/udp)
# ma scegliamo la 8888 per non dover essere root.
Listen 8887
Listen 8888
# Le porte nelle quali il server è messo in listen: notate che ne
# abbiamo specificate due, una per il normale protocollo HTTP l'altra per
# il protocollo HTTPS.
DocumentRoot /usr/www/site.ssl/htdocs
# La document root
SSLRequireSSL
# Questa direttiva serve a proteggere una directory negando l'accesso
# quando non si è connessi con protocollo SSL: l'utilità delle direttiva
# è quella di non permettere a chiunque di accedere ai documenti ai
# quali normalmente si accederebbe con SSL
TransferLog logs/transfer_log
# Il file di log.
SSLDisable
# Con questa direttiva disabiliteremo il protocollo SSL per i
# virtualhosts; se si vuole fare il contrario, sarà necessario
# sostituire "SSLDisable" con "SSLEnable".
SSLCACertificateFile /usr/www/site.ssl/conf/thawte.cert
# Il path per il certificato CA
SSLVerifyClient 0
# Se impostata su "0", non si richiede un certificato; su "1" il client
# può presentare un certificato valido; su "2" il client deve presentare
# un certificato valido; su "3" il client può presentare un certificato
# valido anche se questo non è richiesto per il certificato CA. Un
# tipico messaggio del server quando un client non presenta un
# certificato potrebbe essere:
# "No User Certificate.
# The site 'www.sito.com' has requested client
# authentication, but you don't have a Personal Certificate
# to autenthicate yourself. The site may choose not to give you access
# without one."
SSLCACertificateFile /usr/www/site.ssl/conf/cert.pem
# Il path per il certificato che abbiamo creato all'inizio del capitolo.
CustomLoglogs/ssl_log "%t %{version}c %{cipher}c %{clientcert}c"
# Il file di log "custom", come quello visto per Apache senza supporto
# SSL.
Virtualhosts
Quello di cui ci occuperemo in questa guida saranno i virtualhosts. Cosa sono i virtualhosts? Supponete di avere due hosts sulla stessa macchina: il primo è quello che siamo abituati a chiamare "il server", il secondo è il virtual host. In pratica, quindi, due o più server sulla stessa macchina, come www.server1.com, www.server2.com ecc. Entrambi, comunque, saranno visto come veri e propri "server separati".
I virtualhost, come potrete benissimo immaginare, sono altamente utilizzati nel webhosting, quando un utente, oltre ad acquistare dello spazio sul server, registra anche un nome di dominio, al quale il server deve rispondere.
Apache, dalla versione 1.1, supporta sia i virtualhosts basati sul numero di IP sia quelli basati sul nome; questi ultimi vengono anche chiamati "basati sull' host" (host-based) oppure "non-IP virtual hosts".
Vedremo nei prossimi capitoli come creare e configurare entrambi
IP-Based Virtual Hosts:
Il primo tipo di configurazione che vedremo è quello basato sull'IP:
ovviamente, per rendere il tutto possibile, avrete necessariamente
bisogno di più di un IP, rispettivamente uno per ogni host virtuale.
Sicuri di avere quanto necessario, si pone davanti a noi un'altra
scelta: configurare Apache in modo che un singolo processo httpd sia
eseguito per ogni singolo host, oppure utilizzare un solo processo httpd
per tutti gli host.
Scegliere fra queste due possibilità non sarà comunque un problema: se
avete problemi di memoria RAM, utilizzate un singolo processo, se invece
avete bisogno di differenti configurazioni per ogni host e sulla vostra
macchina la RAM abbonda, utilizzate più processi.
1. Utilizzazione di più processi httpd.
per lavorare con più demoni httpd, basterà semplicemente utilizzare una
direttiva "listen" per ognuno, ad esempio:
Listen www.sito1.com:80 (oppure Listen 123.456.7.8:80)
Listen www.sito2.com:81
e via dicendo.
2. Utilizzare un solo processo con i virtual hosts.
In questo caso, utilizzeremo un solo processo httpd per tutti gli host
virtuali; la configurazione di ogni host può partire dall'esempio
riportato nel file httpd.conf:
<VirtualHost host.some_domain.com>
ServerAdmin webmaster@host.some_domain.com
DocumentRoot /var/www/host.some_domain.com
ServerName host.some_domain.com
ErrorLog /var/log/apache/host.some_domain.com-error.log
TransferLog /var/log/apache/host.some_domain.com-access.log
</VirtualHost>
Poniamo di voler creare l'host virtuale www.virtuale.com, la cui
DocumentRoot sia /www/virtuale ed il file di log degli errori in
/var/log/virtuale/error.log; quello che dovremo scrivere sarà:
<VirtualHost www.virtuale.com>
ServerAdmin admin@virtuale.com
DocumentRoot /www/virtuale
ErrorLog /var/log/virtuale/error.log
</VirtualHost>
Per ogni host virtuale che vorremo creare, ovviamente, sarà necessario inserire
un altro blocco di istruzioni fra i "tags" <VirtualHost> e </VirtualHost>
Name-based virtual hosts:
Utilizzare una configurazione del genere per i virtual hosts è un'ottima
maniera di implementare un bel numero di host su un solo server. Il
piccolo contro, è che i browser devono supportare il protocollo HTTP/1.1,
che praticamente tutti i browser recenti supportano.
Configurare degli host in questo modo non è troppo dissimile dalla
configurazione degli IP-based virtual hosts: l'unica differenza è
l'utilizzo della direttiva NameVirtualHost.
Se ad esempio www.server1.com e www.server2.com sono legati
all'indirizzo IP 123.456.7.8, possiamo impostare due virtual host come
segue:
NameVirtualHost 123.456.7.8
<VirtualHost 123.456.7.8>
ServerName www.server1.com
DocumentRoot /www/server1
</VirtualHost>
<VirtualHost 123.456.7.8>
ServerName www.server2.com
DocumentRoot /www/server2
</VirtualHost>
Quindi, sulla macchina con IP 123.456.7.8, saranno presenti due host,
ognuno con le proprie caratteristiche e, soprattutto, nome. Ricordate
inoltre che fra <VirtualHost> e </VirtualHost> potrete inserire tutte le
istruzioni che vi servono, differenti per l'uno e per l'altro host: in
questo caso abbiamo cercato di semplificare al massimo la configurazione
degli host ma, per un esempio, potete rifarvi all'esempio riportato poco
sopra.
Prima di chiudere:
Prima di terminare, poniamo l'accento su una cosa che per alcuni
potrebbe essere utile: ad esempio, volete che a "http://server.it"
corrisponda anche "www.server.it". Questo può essere fatto con semplicità
tramite:
ServerAlias server.it www.server.it
oppure
ServerAlias server.it *.server.it
Per chi volesse approfondire l'argomento dei virtual hosts, soprattutto
per quanto riguarda le differenti configurazioni, consiglio una lettura
degli esempi forniti con la documentazione di Apache, presenti nella
directory ../apache/manual/vhosts/examples.html
Un server sicuro
Sappiamo tutti l'importanza di un servizio di webserver, specialmente in questi ultimi periodi nei quali sembra che la rete sia un nuovo Eldorado; un servizio del genere, comunque, non può che implicare dei rischi, vista la potenziale insicurezza dei webserver; se poi a questi, oltre al normale onere di inviare pagine web, diamo anche altre mansioni come ad esempio eseguire file (soprattutto script) e cose del genere, il potenziale rischio di creare un servizio non solo poco efficiente ma anche pericoloso cresce esponenzialmente.
Un webserver ben configurato, da mani esperte con anni di esperienza alle spalle e miriadi di macchine preparate a questo scopo, è certamente un ottimo punto di partenza; l'altra faccia della medaglia è, comunque, la possibilità purtroppo non così remota di compiere degli errori anche banali in fase di configurazione che si possono trasformare in veri e propri eventi drammatici. Un esempio su tutti è un errore di assegnazione di qualche permesso, in modo che qualcuno senza autorizzazione si veda avere accesso a zone vietate della macchina.
Vedremo qui le cose più importanti da non tralasciare quando si configura un server web, nella fattispecie, ovviamente, Apache.
5 cose da tenere sotto controllo:
- Disabilitare i SSI (Server Side Includes) ogni volta che questi non
siano strettamente necessari; si utilizzi la direttiva "Options" in ogni
directory oppure in ogni file .htaccess per abilitarli dove serva;
inoltre, sarebbe da disailitare la funzione "exec", potenzialmente
dannosa se utilizzata per secondi fini.
- Si utilizzi la direttiva "AllowOverride None" ogni volta che questo
sia possibile. Tale direttiva serve a questo: se il webserver trova, ad
esempio, un file ".htaccess" o comunque un file il cui nome sia
specificato nella direttiva "AccessFileName", deve sapere quali valori
presenti in questo file possono bypassare quelli di default del server.
Quindi, potenzialmente, un file ".htaccess" potrebbe far comportare il
webserver in maniera totalmente differente da quella definita nel suo
file di configurazione. Ovviamente, con la direttiva "AllowOverride
None" non si corrono di questi rischi: a monte di tutto c'è, comunque,
un solido e curato file di configurazione principale di Apache.
- Proteggete le home directory degli utenti, specialmente nel caso in
cui facciate dell'hosting remoto. Questo può essere fatto tramite la
direttiva "<Directory> </Directory>", che specifica delle direttiva da
applicare ad una determinata directory ed alle sue sottodirectory. Ad
esempio, supponendo che tutti i vostri utenti abbiano le loro home in
/usr/home, il minimo che potete scrivere è:
<Directory /usr/home>
AllowOverride None
Options Indexes
SymLinksIfOwnerMatch
</Directory>
Ovviamente, potrete poi specificare altre opzioni che ritenete utili per
ognuno dei vostri utenti separatamente o, perchè no, tutti.
- Non abusate della direttiva "AddHandler". Sebbene questa possa essere
utile a farci perdere meno tempo in configurazioni, copia dei file in
determinate directory ecc, può essere pericolosa per il semplice fatto
che qualsiasi estensione passata alla direttiva può diventare uno script
eseguibile sul server con conseguenza imprevedibili. Puntate piuttosto
su una cgi-bin di sistema ed, eventualmente, su una directory cgi-bin
per ogni utente (che dev'essere comunque controllata) senza specificare,
ad esempio, che qualsiasi file con estensione .pl o .cgi sia eseguito
dal server.
E' senza dubbio migliore perdere qualche minuto a spostare gli script nella
directory cgi-bin che non lasciare che qualsiasi file sia
indiscriminatamente eseguito da qualunque posizione (ovviamente
"web-visible").
- Fate attenzione all'assegnazione dei permessi: di regola, un utente,
specialmente in hosting, non dovrebbe mai avere la possibilità di uscire
dalla propria home directory, sia in lettura che soprattutto in
scrittura; questo per diversi motivi: intanto, per non andare a leggere
o modificare lavori di altri utenti e, in secondo luogo, per non andare
a zonzo nel sistema trovando magari qualche eseguibile da lanciare o
dati riservati da leggere.
LA cosa migliore sarebbe quella di creare un gruppo (potrebbe essere
"users" o "remote_users" o qualunque cosa vogliate) nel quale ogni nuovo
utente viene inserito, in modo che si veda già alla creazione limitato
nelle azioni da compiere sul sistema ospitante.
|