Lighttpd : Installation et configuration d'une alternative d'Apache
1 Introduction
LigHTTPd (ou "lighty") est un serveur HTTP sécurisé, rapide et flexible.
Sa rapidité vient du fait qu'il a une plus petite empreinte mémoire que d'autres serveurs HTTP ainsi qu'une gestion intelligente de la charge CPU.
Beaucoup de langages, comme PHP, Perl, Ruby, Python sont supportés via FastCGI.
Le principal désavantage de LigHTTPd est qu'il n'a qu'un seul fichier de configuration et qu'il ne supporte pas les fichiers .htaccess (mais une alternative) : les directives doivent être dans le fichier de configuration. Ceci est aussi un avantage, car le serveur et l'administrateur n'a qu'un seul fichier à gérer.
En avril 2007, LigHTTPd est entré dans le Top 5 des serveurs Web les plus utilisés.
2 Installation
Pour l'installer, c'est simple :
apt-get |
apt-get install lighttpd |
2.1 Installation du module PHP
apt-get |
apt-get install php5-cgi php5 |
Pour l'activer faites :
lighty-enable-mod |
lighty-enable-mod fastcgi |
A la fin du fichier de conf, on va ajouter ces quelques lignes également :
/etc/lighttpd/lighttpd.conf |
... fastcgi.server = ( ".php" => (( "bin-path" => "/usr/bin/php5-cgi", "socket" => "/tmp/php.socket" ))) |
Puis reloader Lighttpd :
/etc/init.d/lighttpd force-reload |
3 Configuration
3.1 Forcer des redirections SSL
Il peut s'avérer pratique de vouloir rediriger une partie de son traffic en SSL. C'est mon cas pour mediawiki qui ne prends pas en compte le SSL lors de l'authentification (ou je ne sais pas comment faire, mais c'est pas grave, l'idée ici est d'avoir un petit exercice) :
/etc/lighttpd/conf-available/50-mediawiki.conf |
# Mediawiki secure auth $SERVER["socket"] == ":80" { $HTTP["host"] =~ "(.*)" { url.redirect = ( "^/(.*Connexion\&returnto.*)" => "https://%1/$1" ) } } |
Ici, je viens donc lui dire :
- Tout ce qui rentre sur le port 80
- De n'importe quel hôte
- Si il arrive sur une page contenant 'Connexion&returnto'
- Alors il est redirigé en https sur le même endroit que le précédent
3.2 Différentier des logs
Je souhaites par exemple différencier les logs de mon blog ainsi que le reste de mon domaine et de mon wiki pour pouvoir les traiter correctement avec awstats par exemple. Voici la marche à suivre :
3.3 Interdire l'accès à son site via Internet Explorer
Il est possible d'interdire l'accès à tout un tas de navigateur. Si comme moi, vous n'êtes pas copain copain avec IE qui vous flingue vos PNG en version 6, qui ne respecte pas les normes, qui flingue les CSS, etc... il peut être pratique de le bloquer et d'indiquer gentillement à l'internaute en question d'aller télécharger au plus vite Firefox.
Je l'avais fait sous Apache et là je ne pouvais pas passer à côté de ça pour Lighttpd alors voilà la solution :
/etc/lighttpd/lighttpd.conf |
$HTTP["useragent"] =~ ".*(MSIE|Opera).*" { $HTTP["url"] !~ "^/ie.html" { url.redirect = ( "" => "/ie.html" ) } } |
Il ne reste plus qu'a créer le fichier ie.html et mettre son jolie texte dedans (vous pouvez également faire un simple fichier texte). Voici ce que j'utilise (/var/www/ie.html) :
3.4 Restriction d'accès par login et mot de passe
Les htaccess n'existent pas sous Lighttpd, mais il y a un équivalent de taille. Vérifiez avant de commencer que le module mod_auth est bien chargé.
Nous allons dans un premier temps générer (avec -c pour la première fois, comme un htaccess) un fichier contenant les identifiants pour être autoriser à consulter tel ou tel site :
htdigest |
htdigest -c /etc/lighttpd/.passwd 'Authorized users only' deimos |
Je créer ici l'utilisateur deimos. Le realm (ici 'Authorized users only') va nous permettre de différencier les différents fichiers de login/mot de passe que nous allons pouvoir avoir car nous ne pouvons en spécifier qu'un seul pour tout le serveur.
Ensuite on rajoute ces lignes dans la configuration global de lighttpd :
/etc/lighttpd/lighttpd.conf |
auth.backend = "htdigest" auth.backend.htdigest.userfile = "/etc/lighttpd/.passwd" auth.debug = 2 |
Puis je rajoute à l'endroit qui m'intéresse la protection :
/etc/lighttpd/lighttpd.conf |
auth.require = ( "/docs/" => ( "method" => "digest", "realm" => "Authorized users only", "require" => "valid-user" ) ) |
On redémarre lighty et c'est bon.
3.5 Ajouter de la compression
Pour accélérer l'affichage de votre site web, il est recommandé d'activer la compression. Par défaut, il n'y a pas suffisamment d'éléments qui sont compressés, il va donc falloir en définir plus dans la configuration standard. Note : L'activation de la compression va charger un peu plus en CPU/RAM votre serveur.
Éditez la configuration de votre lighty pour y configurer le module compress :
La compression PHP5 va nous faire gagner de précieuses secondes sur l'affichage d'une page. Pour l'activer, éditez le fichier suivant et passez le paramètre en "on" :
Redémarrez ensuite votre serveur web pour que la configuration soit appliquée.
4 FAQ
Si vous avez ce genre d'erreur au reboot de Lighttpd :
Stopping web server: lighttpd. Starting web server: lighttpd/usr/sbin/lighttpd: Symbol `FamErrlist' has different size in shared object, consider re-linking 2010-08-20 21:58:02: (network.c.345) can't bind to port: :: 80 Address already in use failed!
C'est du à un bug qui traine avec l'IPv6 sur Debian. Pour résoudrel e problème, il faut installer libfam0 qui entraine aussi ce genre de bugs :
aptitude |
aptitude install libfam0 |
et dans la configuration de Lighttpd, configurer ces lignes comme ceci :
/etc/lighttpd/lighttpd.conf |
#include_shell "/usr/share/lighttpd/use-ipv6.pl" server.socket = "[::]:80" |
Il ne vous reste plus qu'a redémarrer Lighttpd :-)
4.2 sockets disabled, connection limit reached
Si votre serveur s’arrête brutalement et que vous obtenez ce type de message :
2011-05-06 14:18:24: (server.c.1398) [note] sockets disabled, connection limit reached 2011-05-06 14:19:27: (server.c.1512) server stopped by UID = 0 PID = 19214
C'est tout simplement que vous avez dépasser le nombre maximum de file descriptor. Il suffit donc d'augmenter la valeur actuelle. Pour savoir laquelle est appliquée en ce moment (par défaut 1024), il suffit de lancer cette commande :
cat |
> cat /proc/`ps ax | grep lighttpd | grep -v grep | awk -F " " '{print $1}'`/limits |grep "Max open files" Max open files 1024 1024 files |
Ici c'est donc limité à 1024. Pour augmenter cette valeur, éditez le fichier de conf lighty et augmentez la valeur :
/etc/lighttpd/lighttpd.conf |
server.max-fds = 2048 |
Il ne reste plus qu'a relancer lighty.
4.3 backend is overloaded; we'll disable it for 1 seconds and send the request to another backend instead: reconnects
Si vous avez ce genre de message avec une belle erreur 500 :
2011-05-09 09:06:07: (mod_fastcgi.c.2764) fcgi-server re-enabled: 0 /tmp/php.socket 2011-05-09 09:06:07: (mod_fastcgi.c.2764) fcgi-server re-enabled: 0 /tmp/php.socket 2011-05-09 09:06:07: (mod_fastcgi.c.2764) fcgi-server re-enabled: 0 /tmp/php.socket 2011-05-09 09:06:07: (mod_fastcgi.c.2764) fcgi-server re-enabled: 0 /tmp/php.socket 2011-05-09 09:06:10: (mod_fastcgi.c.3001) backend is overloaded; we'll disable it for 1 seconds and send the request to another backend instead: reconnects: 0 load: 521 2011-05-09 09:06:10: (mod_fastcgi.c.3001) backend is overloaded; we'll disable it for 1 seconds and send the request to another backend instead: reconnects: 1 load: 521 2011-05-09 09:06:10: (mod_fastcgi.c.3001) backend is overloaded; we'll disable it for 1 seconds and send the request to another backend instead: reconnects: 2 load: 521 2011-05-09 09:06:10: (mod_fastcgi.c.3001) backend is overloaded; we'll disable it for 1 seconds and send the request to another backend instead: reconnects: 3 load: 521
C'est que les limites de votre fastcgi ont été dépassées. Pour régler le problème, voici la configuration à modifier :
Ensuite adaptez les lignes ci dessus pour que celà prenne en compte le nombre maximum de client que vous souhaitez, ainsi que le nombre d'instances. Vous pouvez tester avec la commande "ab" votre nouvelle configuration.
Plus d'infos sur cette page : http://redmine.lighttpd.net/wiki/1/Docs:PerformanceFastCGI
5 Ressources
Documentation on installing Lighttpd With PHP5 And MySQL Support
Documentation on reducing Apache's load with lighttpd
Optimiser la charge de son serveur Lighttpd
http://redmine.lighttpd.net/wiki/lighttpd/Docs
http://redmine.lighttpd.net/wiki/lighttpd/Docs:ConfigurationOptions
Installing Lighttpd With PHP5 And MySQL Support On Debian Lenny