Ces serveurs web n'ont bien sûr rien à voir avec apache mais il peut-être intéressant de les utiliser pour des petits sites statiques (voire dynamiques mais pas trop). L'avantage étant la charge considérablement réduite et donc parfaitement adaptée à un environnement virtualisé (isolé dans le cas de vserver).

Je n'ai pas utilisé lighttpd dans ces tests, celui-ci ayant déjà fait l'objet d'un autre article


Environnement

Tous les tests ont été réalisés dans un vserver ( technologie : http://linux-vserver.org ) configuré comme suit et installé comme décrit dans ce billet:

Je me connecte depuis mon desktop sur le serveur maitre puis entre dans le vserver:

pme@p733:~$ ssh root@192.168.0.16
Linux raid 2.6.28.1-vs2.3.0.36.4 #1 SMP Sun Jan 25 15:25:25 CET 2009 x86_64
Last login: Sat Jun 13 11:13:57 2009 from p733.net.caen

raid:~# vserver-stat
CTX   PROC    VSZ    RSS  userTIME   sysTIME    UPTIME NAME
40006   16 280.7M  25.4M   0m13s14   0m20s42   2h21m46 raidvs1

raid:~# vserver raidvs1 enter

raidvs1:/# ps ax
  PID TTY      STAT   TIME COMMAND
    1 ?        Ss     0:00 init [2] 
 2581 ?        R+     0:00 login                                                                                               
 2609 pts/1    Ss     0:00 /bin/bash -login
 4468 ?        Sl     0:00 /usr/sbin/rsyslogd -c3
 4522 pts/1    R+     0:00 ps ax

raidvs1:/# df -hT
Sys. de fich. Type     Tail. Occ. Disp. %Occ. Monté sur
/dev/hdv1      ufs    2,0G  385M  1,5G  21% /
none         tmpfs     16M     0   16M   0% /tmp

raidvs1:/# uname -a
Linux raidvs1.net.caen 2.6.28.1-vs2.3.0.36.4 #1 SMP Sun Jan 25 15:25:25 CET 2009 x86_64 GNU/Linux

raidvs1:/# ifconfig|grep 192
          inet adr:192.168.0.17  Bcast:192.168.0.255  Masque:255.255.255.0

raidvs1:/# cat /etc/issue.net
Debian GNU/Linux 5.0


I. webfs

Extrait de /usr/share/doc/webfs/README.gz

This is a simple http server for pure static content.  You
can use it to serve the content of a ftp server via http for
example.  It is also nice to export some files the quick way
by starting a http server in a few seconds, without editing
some config file first.

raidvs1:/# apt-cache search webfs
webfs - lightweight http server for static content

raidvs1:/# apt-get install webfs
Lecture des listes de paquets... Fait
Construction de l'arbre des dépendances      
Lecture des informations d'état... Fait
Les NOUVEAUX paquets suivants seront installés :
  webfs
0 mis à jour, 1 nouvellement installés, 0 à enlever et 0 non mis à jour.
Il est nécessaire de prendre 52,6ko dans les archives.
Après cette opération, 188ko d'espace disque supplémentaires seront utilisés.
Réception de : 1 http://192.168.0.63 lenny/main webfs 1.21-5.1 [52,6kB]
52,6ko réceptionnés en 0s (186ko/s)
Préconfiguration des paquets...
Sélection du paquet webfs précédemment désélectionné.
(Lecture de la base de données... 11515 fichiers et répertoires déjà installés.)
Dépaquetage de webfs (à partir de .../webfs_1.21-5.1_amd64.deb) ...
Traitement des actions différées (« triggers ») pour « man-db »...
Paramétrage de webfs (1.21-5.1) ...
Starting httpd daemon: webfsd.

raidvs1:/# ps ax
  PID TTY      STAT   TIME COMMAND
    1 ?        Ss     0:00 init [2] 
 2581 ?        R+     0:00 login                                                                                               
 2609 pts/1    Rs     0:00 /bin/bash -login
 4468 ?        Sl     0:00 /usr/sbin/rsyslogd -c3
 4639 ?        Ss     0:00 /usr/bin/webfsd -k /var/run/webfs/webfsd.pid -r /var/ftp -u www-data -g www-data
 4640 pts/1    R+     0:00 ps ax

raidvs1:/# netstat -tpan
Connexions Internet actives (serveurs et établies)
Proto Recv-Q Send-Q Adresse locale          Adresse distante        Etat        PID/Program name
tcp        0      0 0.0.0.0:8000            0.0.0.0:*               LISTEN      4639/webfsd    
tcp        0      0 192.168.0.17:32992      192.168.0.63:3142       TIME_WAIT   -  

raidvs1:/var/ftp# memstat |grep webfs
     44k: /usr/bin/webfsd 4741

Le fichier de config est simplissime mais on voit qu'il est tout de même possible de jouer avec des vhosts.

raidvs1:/# cat /etc/webfsd.conf | egrep -v '^$|^#'
web_root=/var/ftp
web_host=
web_ip=
web_port=
web_virtual=false
web_timeout=
web_conn=
web_index=
web_dircache=
web_accesslog=
web_syslog=false
web_user=www-data
web_group=www-data

Je crée rapidement un index.html et je teste depuis mon desktop:

raidvs1:/var/ftp# echo "<html><body><br>Page index de webfs</body></html>" > index.html

webfs

Je modifie le fichier de config en renseignant la valeur web_index:

# index file for directories (default: none, webfsd will send listings)
web_index=index.html

webfs

Terminé: temps d'install et de config < 5mn.

Lien: http://linux.bytesex.org/misc/webfs.html

II. thttpd

Extrait du man:
DESCRIPTION
       thttpd is a simple, small, fast, and secure HTTP server.  It doesn’t have a lot of special features, but it suffices for most uses of  the
       web,  it’s about as fast as the best full-featured servers (Apache, NCSA, Netscape), and it has one extremely useful feature (URL-traffic-
       based throttling) that no other server currently has.


raidvs1:/var/ftp# apt-get install thttpd
Lecture des listes de paquets... Fait
Construction de l'arbre des dépendances      
Lecture des informations d'état... Fait
Paquets suggérés :
  thttpd-util
Les NOUVEAUX paquets suivants seront installés :
  thttpd
0 mis à jour, 1 nouvellement installés, 0 à enlever et 0 non mis à jour.
Il est nécessaire de prendre 63,1ko dans les archives.
Après cette opération, 250ko d'espace disque supplémentaires seront utilisés.
Réception de : 1 http://192.168.0.63 lenny/main thttpd 2.25b-6 [63,1kB]
63,1ko réceptionnés en 0s (243ko/s)
Sélection du paquet thttpd précédemment désélectionné.
(Lecture de la base de données... 11530 fichiers et répertoires déjà installés.)
Dépaquetage de thttpd (à partir de .../thttpd_2.25b-6_amd64.deb) ...
Traitement des actions différées (« triggers ») pour « man-db »...
Paramétrage de thttpd (2.25b-6) ...
Starting web server: thttpd.

raidvs1:~# ps ax
  PID TTY      STAT   TIME COMMAND
    1 ?        Ss     0:00 init [2] 
 2581 ?        S+     0:00 login                                                                                               
 2609 pts/1    Ss     0:00 /bin/bash -login
 4468 ?        Sl     0:00 /usr/sbin/rsyslogd -c3
 4807 ?        Ss     0:01 /usr/sbin/thttpd -C /etc/thttpd/thttpd.conf -i /var/run/thttpd.pid
 4809 pts/1    R+     0:00 ps ax

raidvs1:~# netstat -tpan
Connexions Internet actives (serveurs et établies)
Proto Recv-Q Send-Q Adresse locale          Adresse distante        Etat        PID/Program name
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      4807/thttpd    

raidvs1:/etc/thttpd# ../init.d/thttpd stop

Là encore le serveur écoute par défaut sur toutes les interfaces, ce que je ne souahite pas pour un vserver. Petite modif dans le fichier de config:

raidvs1:/etc/thttpd# cat thttpd.conf |egrep -v '^$|^#'
port=80
dir=/var/www
chroot
user=www-data
cgipat=/cgi-bin/*
throttles=/etc/thttpd/throttle.conf
host=192.168.0.17
logfile=/var/log/thttpd.log

raidvs1:/etc/thttpd# netstat -tpan
Connexions Internet actives (serveurs et établies)
Proto Recv-Q Send-Q Adresse locale          Adresse distante        Etat        PID/Program name
tcp        0      0 192.168.0.17:80         0.0.0.0:*               LISTEN      4929/thttpd    
tcp        0      0 192.168.0.17:80         192.168.0.22:59660      TIME_WAIT   -              

thttpd

Terminé : temps d'install et de config < 5mn. On note qu'avec ce serveur il est théoriquement possible d'utiliser des cgi mais je n'ai pas réussi à en afficher un seul.
Quelques recherches sur google m'ont confirmé qu'il y avait effectivement un problème de ce côté mais les soluces....

thttpd probleme cgi


Lien: http://acme.com/software/thttpd/

III. boa

Extrait du man
DESCRIPTION
       Boa  is  a  single-tasking HTTP server. That means that unlike traditional web servers, it does not fork for each incoming connection, nor
       does it fork many copies of itself to handle multiple connections. It internally multiplexes all of  the  ongoing  HTTP  connections,  and
       forks only for CGI programs (which must be separate processes.) Preliminary tests show Boa is more than twice as fast as Apache.

       The  primary  design  goals  of  Boa are speed and security. Security, in the sense of "can’t be subverted by a malicious user", not "fine
       grained access control and encrypted communications". Boa is not intended as a feature-packed server; if you want one of those, check  out
       WN  from  John  Franks. Modifications to Boa that improve its speed, security, robustness, and portability, are eagerly sought. Other fea‐
       tures may be added if they can be achieved without hurting the primary goals.


raidvs1:~# apt-get install boa
Lecture des listes de paquets... Fait
Construction de l'arbre des dépendances      
Lecture des informations d'état... Fait
Les NOUVEAUX paquets suivants seront installés :
  boa
0 mis à jour, 1 nouvellement installés, 0 à enlever et 0 non mis à jour.
Il est nécessaire de prendre 123ko dans les archives.
Après cette opération, 360ko d'espace disque supplémentaires seront utilisés.
Réception de : 1 http://192.168.0.63 lenny/main boa 0.94.14rc21-3 [123kB]
123ko réceptionnés en 0s (216ko/s)
Sélection du paquet boa précédemment désélectionné.
(Lecture de la base de données... 11851 fichiers et répertoires déjà installés.)
Dépaquetage de boa (à partir de .../boa_0.94.14rc21-3_amd64.deb) ...
Traitement des actions différées (« triggers ») pour « man-db »...
Paramétrage de boa (0.94.14rc21-3) ...
Starting HTTP server: boa.

raidvs1:~# netstat -tpan
Connexions Internet actives (serveurs et établies)
Proto Recv-Q Send-Q Adresse locale          Adresse distante        Etat        PID/Program name
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      6414/boa       
tcp        0      0 192.168.0.17:33466      192.168.0.63:3142       TIME_WAIT   -              

raidvs1:/etc/boa# /etc/init.d/boa stop
Stopping HTTP server: boa.


Toujours l'histoire du bind sur les interfaces que l'on corrige via le fichier de config:

raidvs1:/etc/boa# cat boa.conf | egrep -v '^$|^#'
Port 80
Listen 192.168.0.17
User www-data
Group www-data
ErrorLog /var/log/boa/error_log
AccessLog /var/log/boa/access_log
DocumentRoot /var/www
UserDir public_html
DirectoryIndex index.html
DirectoryMaker /usr/lib/boa/boa_indexer
KeepAliveMax 1000
KeepAliveTimeout 10
MimeTypes /etc/mime.types
DefaultType text/plain
CGIPath /bin:/usr/bin:/usr/local/bin
Alias /doc /usr/share/doc
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/

raidvs1:/etc/boa# /etc/init.d/boa start
Starting HTTP server: boaraidvs1:/etc/boa#
raidvs1:/etc/boa#

raidvs1:/etc/boa# netstat -tpan
Connexions Internet actives (serveurs et établies)
Proto Recv-Q Send-Q Adresse locale          Adresse distante        Etat        PID/Program name
tcp        0      0 192.168.0.17:80         0.0.0.0:*               LISTEN      6441/boa    

boa

Terminé: Temps d'install et de config < 5mn. On remarque là encore le support des cgi-bin. J'ai testé rapidement et ça fonctionne mais par exemple pour un script php
il faut ajouter quelques données et le formattage est un peu olé olé.

Exemple:
raidvs1:/var/www/cgi-bin# cat php.cgi
#!/usr/bin/php5
<?
print "content-type: text/html \n\n";
phpinfo();
?>

boa et cgi

Il doit être toutefois possible d'éviter le shebang et de passer par la vieillle méthode du binfmt_misc mais dans un vserver il faudra modifier certains paramètres (bcaps notamment):

mount -t binfmt_misc none /proc/sys/fs/binfmt_misc
echo ":PHP:E::php::/usr/bin/php5-cgi:" > /proc/sys/fs/binfmt_misc/register

Lien: http://www.boa.org/

IV. yaws

yaws (yet another web server). Des paquets supplémentaires permettent d'utiliser un chat, un wiki et même un webmail.

Extrait du man:
DESCRIPTION
       Yaws  is  fast  lightweight webserver. It can run as daemon or in interactive mode where it is possible to directly interact with the web‐
       server. Yaws is particularly good at generating dynamic content. See the user docs for more information on that topic.


raidvs1:/usr/sbin# apt-get install yaws yaws-chat yaws-mail yaws-wiki yaws-yapp
Lecture des listes de paquets... Fait
Construction de l'arbre des dépendances      
Lecture des informations d'état... Fait
Les paquets supplémentaires suivants seront installés :
  erlang-base erlang-nox libltdl3 libsctp1 lksctp-tools odbcinst1debian1 unixodbc
Paquets suggérés :
  erlang-x11 erlang erlang-manpages erlang-doc-html libmyodbc odbc-postgresql libct1 erlang-dev
Les NOUVEAUX paquets suivants seront installés :
  erlang-base erlang-nox libltdl3 libsctp1 lksctp-tools odbcinst1debian1 unixodbc yaws yaws-chat yaws-mail yaws-wiki yaws-yapp
0 mis à jour, 12 nouvellement installés, 0 à enlever et 0 non mis à jour.
Il est nécessaire de prendre 29,1Mo dans les archives.
Après cette opération, 49,4Mo d'espace disque supplémentaires seront utilisés.
Souhaitez-vous continuer [O/n] ?
......
......
Searching for services which depend on erlang and should be started...none found.
Paramétrage de libltdl3 (1.5.26-4) ...
Paramétrage de odbcinst1debian1 (2.2.11-16) ...
Paramétrage de unixodbc (2.2.11-16) ...
Paramétrage de erlang-nox (1:12.b.3-dfsg-4) ...
Paramétrage de lksctp-tools (1.0.9.dfsg-1) ...
Paramétrage de yaws (1.77-3+lenny1) ...
Creating config symlink /etc/yaws/conf.d/localhost.conf
Creating config symlink /etc/yaws/conf.d/localhost-ssl.conf
Created /etc/yaws/yaws-cert.pem and /etc/yaws/yaws-key.pem for localhost ONLY
Starting yaws: yaws web server.
Paramétrage de yaws-chat (1.77-3+lenny1) ...
Creating config symlink /etc/yaws/conf.d/yaws-chat.conf
Restarting yaws: yaws web server.
Paramétrage de yaws-mail (1.77-3+lenny1) ...
Creating config symlink /etc/yaws/conf.d/yaws-mail.conf
Restarting yaws: yaws web server.
Paramétrage de yaws-wiki (1.77-3+lenny1) ...
Creating config symlink /etc/yaws/conf.d/yaws-wiki.conf
Restarting yaws: yaws web server.
Paramétrage de yaws-yapp (1.77-3+lenny1) ...
Creating config symlink /etc/yaws/conf.d/yaws-yapp.conf
Restarting yaws: yaws web server.


raidvs1:/usr/sbin# netstat -tpan
Connexions Internet actives (serveurs et établies)
Proto Recv-Q Send-Q Adresse locale          Adresse distante        Etat        PID/Program name
tcp        0      0 127.0.0.1:49952         0.0.0.0:*               LISTEN      7139/beam.smp  
tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN      7139/beam.smp  
tcp        0      0 127.0.0.1:50744         0.0.0.0:*               LISTEN      7163/ssl_esock 
tcp        0      0 0.0.0.0:8443            0.0.0.0:*               LISTEN      7163/ssl_esock 

raidvs1:/usr/sbin# ps ax
  PID TTY      STAT   TIME COMMAND
    1 ?        Ss     0:00 init [2] 
 5985 ?        Sl     0:00 /usr/sbin/rsyslogd -c3
 6017 ?        S+     0:00 login                                                                                               
 6045 pts/1    Ss+    0:00 /bin/bash -login
 6088 ?        S+     0:00 login                                                                                               
 6116 pts/5    Ss     0:00 /bin/bash -login
 7139 ?        Sl     0:00 /usr/lib/erlang/erts-5.6.3/bin/beam.smp -- -root /usr/lib/erlang -progname erl -- -home /var/cache/yaws -noshell -noinput
 7148 ?        Ss     0:00 heart -pid 7139
 7163 ?        Ss     0:00 /usr/lib/erlang/lib/ssl-3.9/priv/bin/ssl_esock
 7170 pts/5    R+     0:00 ps ax


Je fais le tour des fichiers de config et je paramètre comme suit:

Tout d'abord je renseigne le fichier hosts de mon desktop (par flemme :) car je pourrais les entrer dans le dns local).

root@p733:~# grep 0.17 /etc/hosts
192.168.0.17    chat mail yapp wiki

raidvs1:/etc/yaws/conf.d# cat localhost.conf |egrep -v '^$|^#'
<server localhost>
    port = 8080
    listen = 192.168.0.17
    docroot = /usr/share/yaws
    dir_listings = true
</server>


raidvs1:/etc/yaws/conf.d# cat yaws-chat.conf|egrep -v '^$|^#'
ebin_dir = /usr/lib/yaws/chat/ebin
<server chat>
 port = 8080
 listen = 192.168.0.17
 docroot = /usr/share/yaws-chat
</server>


raidvs1:/etc/yaws/conf.d# cat yaws-mail.conf|egrep -v '^$|^#'
ebin_dir = /usr/lib/yaws/mail/ebin
<server mail>
 port = 8080
 listen = 192.168.0.17
 docroot = /usr/share/yaws-mail
</server>

Pour le webmail il y a un autre fichier de config à renseigner dans lequel on va renseigner les paramètres du serveur pop et smtp à joindre.
J'utilise une autre machine sur laquelle j'avais déjà d'installé ces services. Le domaine obm.grp est géré par le dns local.

raidvs1:/etc/yaws/conf.d# cat /etc/mail/yaws-webmail.conf|egrep -v '^$|^#'
ttl = 1800
popserver = 192.168.0.21
smtpserver = 192.168.0.21
maildomain = obm.grp
sendtimeout = 15000

raidvs1:/etc/yaws/conf.d# cat yaws-wiki.conf|egrep -v '^$|^#'
ebin_dir = /usr/lib/yaws/wiki/ebin
<server wiki>
 port = 8080
 listen = 192.168.0.17
 docroot = /var/lib/yaws-wiki
</server>

raidvs1:/etc/yaws/conf.d# cat yaws-yapp.conf|egrep -v '^$|^#'
ebin_dir = /usr/lib/yaws/yapp/ebin
 
runmod = yapp
<server yapp>
    port = 8080
    listen = 192.168.0.17
    docroot = /usr/share/yaws-yapp
    dir_listings = true
    arg_rewrite_mod = yapp   
    <opaque>
      yapp_server_id = yappexample
      bootstrap_yapps = yapp
    </opaque>
</server>

J'ai laissé le port 8080 dans la mesure où je ne fais que tester.

Je redémarre ensuite yaws et vais tester les différents "domaines"  (les noms renseignés dans mon fichier hosts). On va voir que c'est vraiment du léger mais l'utilisation d'un tel serveur est fait dans cette optique.

Le serveur web
yaws web


Le serveur chat
yaws chat    yaws chat


Le wiki
yaws wiki    yaws wiki


Le webmail
yaws webmail    yaws webmail

Les yaws apps
yaws apps


Lien: http://yaws.hyber.org/

V. cherokee

DESCRIPTION
       cherokee is an extremely fast, flexible and embedable web server.


Celui-là est prêt à l'emploi pour le php en mode cgi/fcgi.

Il suffit d'installer php5-cgi.

Un petit index.php dans /var/www (qui est le répertoire par défaut) et le tour est joué.

raidvs1:/var/www# cat index.php
<?
phpinfo();
?>

cherokee


Les fichiers de config sont dans /etc/cherokee:

raidvs1:/etc/cherokee# ll
total 32
drwxr-xr-x  3 root root  4096 jun 14 15:05 .
drwxr-xr-x 60 root root  4096 jun 14 15:05 ..
-rw-r--r--  1 root root 15538 sep  1  2008 cherokee.conf
-rw-r--r--  1 root root   559 sep  1  2008 cherokee.conf.perf_sample
drwxr-xr-x  2 root root  4096 sep  1  2008 ssl

Extrait du cherokee.conf:

vserver!default!rule!99999!match = extensions
vserver!default!rule!99999!match!extensions = php
vserver!default!rule!99999!handler = fcgi
vserver!default!rule!99999!handler!balancer = round_robin
vserver!default!rule!99999!handler!balancer!type = interpreter
vserver!default!rule!99999!handler!balancer!local1!host = localhost:1234
vserver!default!rule!99999!handler!balancer!local1!env!PHP_FCGI_CHILDREN = 5
vserver!default!rule!99999!handler!balancer!local1!interpreter = php-cgi -b 1234

Une interface d'administration peut-être lancée à la demande: il suffit de taper dans une console sur le serveur:

raidvs1:/etc/cherokee# cherokee-admin -b &
[1] 11975
raidvs1:/etc/cherokee# Cherokee Web Server 0.7.2 (Sep  1 2008): Listening on port 9090, TLS disabled
 IPv6 disabled, using epoll, 1024 fds system limit, max. 502 connections
 10 threads, 105 fds per thread, standard scheduling policy

raidvs1:/etc/cherokee# ps ax
  PID TTY      STAT   TIME COMMAND
    1 ?        Ss     0:00 init [2] 
10933 ?        Sl     0:00 /usr/sbin/rsyslogd -c3
11671 ?        S+     0:00 login                                                                                               
11699 pts/0    Ss     0:00 /bin/bash -login
11936 ?        S      0:00 /usr/sbin/cherokee-guardian
11937 ?        Sl     0:00 /usr/sbin/cherokee
11975 pts/0    Sl     0:00 cherokee-admin -b
11985 pts/0    R+     0:00 ps ax

raidvs1:/etc/cherokee# netstat -tpan
Connexions Internet actives (serveurs et établies)
Proto Recv-Q Send-Q Adresse locale          Adresse distante        Etat        PID/Program name
tcp        0      0 0.0.0.0:9090            0.0.0.0:*               LISTEN      11975/cherokee-admi
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      11937/cherokee 

On accède au web UI sur le port 9090:

cherokee web admin    cherokee web admin

Lien: www.cherokee-project.com




Conclusion: on constate que bien qu'Apache soit vraiment la référence indiscutable, dans certains cas il peut-être judicieux de penser à autre chose ne serait-ce que pour répartir la charge. En effet on peut imaginer le scénario suivant:

un serveur apache en front qui sert le html et le php et un serveur dépouillé qui ne servirait que les images économisant ainsi de la bande passant sur le serveur apache.

Une petite règle de réécriture dans le vhost apache devrait suffire:

RewriteEngine On
RewriteCond %{REQUEST_URI} .*\.(jpg|gif|png)$
RewriteRule ^/(.*) http://serveur-depouille/$1 [P]