Sinistra <- Monitoraggio di sistemi in rete - parte 1 - Indice Generale - Copertina - Samba 3 come PDC di una rete Windows -> Destra

Sistemi Liberi


Piccoli server web

Piccoli server web

di Tito Rizzo

L'articolo

Se si trova che Apache sia troppo pesante o complicato, perché non sostituirlo con un programma più semplice e leggero?



Introduzione

"Sulla maggior parte dei siti web, impiegare Apache è un po' come usare un maglio per rompere una noce". Questa affermazione, ripresa dal sito del progetto dhttpd, riflette l'opinione diffusa che Apache, il server web più utilizzato in Internet, sia troppo complesso e sovradimensionato per la maggior parte delle esigenze.

Su Apache non c'è molto da dire. È un programma troppo diffuso a collaudato perché gli si possano avanzare delle critiche realmente fondate.

In molti casi potrebbe comunque risultare utile, se non necessario, affidarsi a un server web più leggero e meno impegnativo. Nell'ambito del software libero e open-source le proposte in questo senso non mancano e nel seguito dell'articolo ne verranno esaminate alcune.

La regola della semplicità

Si può cominciare con micro_httpd, forse il più piccolo server web al mondo. In 150 righe di codice C offre le funzionalità di base di un server HTTP.

Viene avviato da inetd, quindi le sue prestazioni sono scarse. In compenso evita il problema di predisporre uno script di avvio. È sufficiente inserire nel file /etc/inetd.conf una riga come questa, adattando opportunamente il percorso dell'eseguibile micro_httpd e sostituendo dir con la directory che si intende servire:

micro_http stream tcp nowait nobody /usr/local/sbin/micro_httpd micro_httpd dir

Quindi si aggiunga a /etc/services una riga come questa:

micro_http port/tcp #Micro HTTP server

Si sostituisca port con il numero di porta su cui si desidera che il server stia in ascolto (80, 8080, o quello che sia). Dopodiché si riavvii inetd lanciandogli un segnale di HUP.

Il fratello maggiore di micro_httpd mini_httpd offre qualcosa in più: supporto ai metodi GET, HEAD, POST, supporto CGI, hosting virtuale, ecc.

Tra i programmi che vantano caratteristiche grosso modo equivalenti si possono citare:

Questi programmi possono essere indicati per i sistemi "embedded". Su dispositivi come modem/router, alcuni modelli di stampanti, ecc., grazie a un piccolo server web si può rendere disponibile una comoda interfaccia web per la configurazione del dispositivo e per controllarne lo stato di funzionamento.

In ambito embedded è particolarmente apprezzato boa, altro server web piccolo ma di elevate prestazioni. Boa viene utilizzato, per fare un esempio, da uClinux, una versione di Linux per CPU senza memoria virtuale o MMU (Memory Management Unit), tipo le Motorola 68000 usate da certi PDA.

PHP senza Apache

I programmi esaminati finora sono più che adeguati nel caso di contenuti statici in HTML. I contenuti dinamici possono essere in molti casi implementati tramite i CGI o usando un linguaggio lato client, come il JavaScript.

Può essere comunque interessante valutare se e come questi piccoli server web siano in grado di supportare il linguaggio PHP, una tecnologia libera di importanza fondamentale nello sviluppo web.

La prima condizione è che il proprio interprete PHP sia stato compilato come programma CGI. Da un terminale si digiti php -v e si osservi il relativo output, che potrebbe presentarsi così:

localhost:/home/ciccio$ php -v
PHP 4.4.0 (cli) (built: Jul 16 2005 21:45:10)
Copyright (c) 1997-2004 The PHP Group
Zend Engine v1.3.0, Copyright (c) 1998-2004 Zend Technologies

Si noti quel (cli) , che sta per "command line interface". Questo interprete è stato presumibilmente compilato come modulo DSO (Dynamic Shared Object) per Apache ed è comunque inefficace per l'impiego con un diverso server web.

Alcune distribuzioni GNU/Linux (Debian, Gentoo) e anche FreeBSD forniscono una versione di PHP compilata come interprete CGI. Nel caso di Debian, il pacchetto si chiama php4-cgi_4.X.X-X_i386.deb e l'interprete viene installato come /usr/bin/php4-cgi.

Nel caso si abbia necessità di compilare PHP da sorgenti, ecco come eseguire lo script configure, accodando eventuali altre opzioni :

$ ./configure \
   --enable-fastcgi \
   --enable-discard-path \
   --enable-force-redirect

Ad installazione terminata, se si esegue l'interprete PHP come visto sopra si ottiene questo risultato:

localhost:/home/ciccio$ /usr/local/bin/php-cgi -v
PHP 4.4.0 (cgi-fcgi) (built: Aug 13 2005 17:16:04)
Copyright (c) 1997-2004 The PHP Group
Zend Engine v1.3.0, Copyright (c) 1998-2004 Zend Technologies

Questo è un esempio di script CGI in PHP (non è troppo complesso, vero?):

#!/usr/bin/php4-cgi -q
<?php
  echo "Ciao, Ciccio!\n";
?>

L'opzione -q sopprime l'output dell'intestazione HTTP.

Lo script, che deve essere eseguibile (chmod +x ciccio.cgi), va collocato all'interno della directory riservata ai programmi CGI (per esempio /var/www/cgi-bin). Lo script funziona bene se richiamato da linea di comando. Il tentativo di visualizzarlo tramite un server web come boa, mini_httpd, ecc., invece fallisce.

È tipico ricevere l'errore di "No input file specified". Questo messaggio può indicare che si sta usando una versione CLI di PHP, oppure una versione CGI compilata senza l'opzione --enable-discard-path.

Il problema tuttavia persiste anche se la versione di PHP è quella giusta. La causa del problema risiede nell'incapacità di questi server di definire la variabile SCRIPT_FILENAME, richiesta da PHP.

Una soluzione (ripresa da questo post) consiste nel richiamare lo script php da uno script di shell in questo modo:

#!/bin/sh -
export SCRIPT_FILENAME=/var/www/cgi-bin/ciccio.cgi
/usr/local/bin/php-cgi -f $SCRIPT_FILENAME

Il metodo funziona ma è certamente poco pratico.

In conclusione, l'utilizzo di PHP come programma CGI in connessione con server web che forniscano solo un generico supporto CGI non è realmente consigliabile.

Esistono tuttavia alcuni server web di piccola taglia che includono un effettivo e funzionale supporto per PHP. Anche con essi è necessaria una versione CGI o fast-cgi di PHP.

Qui di seguito ne vengono esaminati brevemente alcuni.

Mathopd

Mathopd è un progetto particolarmente interessante. È un server HTTP piccolo (56k di sorgenti) e molto veloce, con un insieme di funzionalità piuttosto completo. Non supporta (ancora) l'SSl, se non attraverso stunnel.

Mathopd è altamente configurabile tramite le sue circa 80 variabili o "Keyword". Il listato che segue mostra come definire un host virtuale nel file di configurazione. L'ultima delle sezioni Control mostra come impostare il supporto per PHP:

Virtual {
	Host www.ciccio.home
	NoHost
	Control {
		Alias /
		Location /home/ciccio/public_html
	}
	Control {
		Alias /cgi-bin
		Location /home/ciccio/public_html/cgi-bin
		Specials {
			CGI { .cgi } }
		}
	Control {
		Alias /PHP
		Location /home/ciccio/public_html/PHP
		PutEnv { REDIRECT_STATUS = 1 }
		External { /usr/bin/php4-cgi { .php } }
		}
	}

Il noto D.J. Bernstein ( http://cr.yp.to/djb.html), papà di qmail e autorevole esperto di sicurezza informatica, afferma di non avere mai sentito di falle di sicurezza in mathopd (si veda http://cr.yp.to/publicfile.html).

Thttpd

Thttpd è un altro prodotto di quegli "Acme Labs" da cui sono usciti micro_httpd e mini_httpd.

Thttpd è noto per una particolare funzionalità detta "throttling" ("strozzamento"), che permette di definire la massima (volendo anche la minima) quantità di banda a disposizione di un determinato URL.

PHP può essere compilato come modulo statico di thttpd, anche se questa possibilità è limitata alla versione 2.21b di thttpd ( http://www.acme.com/software/thttpd/thttpd-2.21b.tar.gz).

La procedura prevede che si scompattino i sorgenti sia di PHP che di thttpd. Si entri quindi all'interno dell'albero dei sorgenti di PHP e si proceda alla sua compilazione e installazione. È necessario indicare allo script configure la presenza dei sorgenti di thttpd in questo modo:

$ cd php-4.4.0
$ ./configure \
> --with-thttpd=../thttpd-2.21b \
> <ulteriori opzioni>

$ make

$ make install

Ci si sposti quindi all'interno dei sorgenti di thttpd e si proceda alla sua installazione nel modo consueto.

Lighttpd

Lighttpd sembra avere molto da offrire: un ricco insieme di funzionalità abbinato a elevate prestazioni e ridotto carico sul sistema.

Oltre che PHP, lighttpd supporta anche Ruby, un notevole linguaggio di scripting totalmente orientato agli oggetti.

Sul sito ufficiale del progetto, è disponibile una ricca documentazione, in particolare il Wiki, alla quale si consiglia di fare riferimento.

Nanoweb

Nanoweb ha la particolarità di essere scritto esso stesso in PHP. La scelta può apparire eccentrica, ma il risultato non è disprezzabile. L'uso di PHP permette tra l'altro di estendere facilmente le funzionalità di nanoweb tramite moduli scritti ad hoc.

Per installare e far funzionare nanoweb in maniera ottimale, è richiesta una versione di PHP compilata con queste opzioni:

--enable-cli (compila l'interprete a linea di comando, opzione predefinita con PHP>=4.3)
--enable-sockets (per manipolare i socket)
--enable-pcntl (per il fork dei processi e la gestione dei segnali)
--enable-mime-magic (opzionale)
--with-zlib (opzionale, usato da mod_gzip)
--with-mysql (opzionale, usato da mod_mysqllog, mod_auth_mysql)
--with-ldap (opzionale, usato da mod mod_auth_ldap)

Se si compila una versione di PHP>=4.3 si usi make install-cli per installarla.

Per installare nanoweb si può lanciare lo script install.sh e seguire le istruzioni fornite a video tramite una comoda interfaccia grafica. Nel programma è compreso anche un manuale utente consultabile in locale all'indirizzo http://localhost/manual/.

Altri server web con un efficiente supporto per PHP sono cherokee e monkey.

Conclusioni

Come già detto, il campo d'impiego più interessante di questi server è costituito dai sistemi "embedded". Possono comunque costituire una scelta intelligente e funzionale nel caso si abbiano a disposizione risorse hardware limitate. Un esempio tipico è quello del "trashware".

In molti casi, si tratta di progetti di ottimo livello, gestiti con grande serietà e con un ottimo supporto in termini di documentazione, mailing list dedicate, ecc.

La loro semplicità e leggerezza li renderà certamente simpatici a tutti coloro che credono nei principi base della filosofia progettuale dei sistemi Unix, riassumibile nella famosa frase "Keep it simple, stupid!"

Riferimenti bibliografici

Un articolo dedicato a micro_httpd:
http://www.linuxgazette.com/issue74/arndt.html

Documentazione relativa a boa:
http://www.boa.org/documentation/
http://www.linuxjournal.com/article/4773
http://a2.pluto.it/a2274.htm#almltitle2631
http://www.osnews.com/story.php?news_id=2217

Documentazione per fnord:
http://www.fbunet.de/fnord.shtml

Uso di PHP per lo scripting di shell:
http://www.phpbuilder.com/columns/darrell20000319.php3?print_mode=1

Materiale su thttpd:
http://halplant.com:88/server/thttpd_FAQ.txt
http://xoomer.virgilio.it/adefacc/httpd/thttpd/
http://www.dilnetpc.com/emblinx12e.PDF



L'autore

Tito Rizzo trova nell'utilizzo di GNU/Linux (ma anche di NetBSD) e del Software Libero un sacco di ottime occasioni per capire, non solo l'informatica, ma più in generale il mondo.


Sinistra <- Monitoraggio di sistemi in rete - parte 1 - Indice Generale - Copertina - Samba 3 come PDC di una rete Windows -> Destra