Lighttpd : Installation et configuration d'une alternative d'Apache

From Deimos.fr / Bloc Notes Informatique
Jump to: navigation, search

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 :

Command apt-get
apt-get install lighttpd

2.1 Installation du module PHP

Command apt-get
apt-get install php5-cgi php5

Pour l'activer faites :

Command lighty-enable-mod
lighty-enable-mod fastcgi

A la fin du fichier de conf, on va ajouter ces quelques lignes également :

Configuration File /etc/lighttpd/lighttpd.conf
...
fastcgi.server = ( ".php" => ((
                     "bin-path" => "/usr/bin/php5-cgi",
                     "socket" => "/tmp/php.socket"
                 )))

Puis reloader Lighttpd :

Command
/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) :

Configuration File /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 :

Configuration File /etc/lighttpd/lighttpd.conf
...
# Deimos Domain
$HTTP["host"] =~ "deimos\.fr" {
    server.document-root = "/var/www/deimos.fr"
    # Default logs
    accesslog.filename = "/var/log/lighttpd/access-blog_and_co.log"
    # Wiki logs
    $HTTP["url"] =~ "^/blocnotesinfo/" {
        accesslog.filename = "/var/log/lighttpd/access-deimos-wiki.log"
    }   
}
...

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 :

Configuration File /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) :

Configuration File ie.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
        <title>Accès Interdit avec Internet Explorer</title>
</head>
<body>
 
Cher Internaute,<br>
<br>
Ce site n'est pas autorisé en accès par Internet Explorer que tu utilises.<br>
Tu dois maintenant être en mesure de comprendre que les temps changent.<br>
<br>
Tu es actuellement en train d'utiliser un navigateur (Internet Explorer) qui ne respecte<br>
pas les <a href="http://www.w3.org">normes</a> et qui détient le monopole, de part son omni présence obligatoire dans ton<br>
cher OS (Windows). Cela dit, tu es peut être au travail et n'a pas le choix de ton OS.<br>
<br>
Cependant, Internet Explorer ne doit plus être utilisé alors qu'il existe tout un tas<br>
d'autres navigateurs Internet libres, gratuit et respectant les normes !<br>
Mais puisque tu n'as pas l'air d'être au courant, ce n'est pas grave, laisse moi t'aider.<br>
<br>
Pour commencer, tu peux télécharger un navigateur propre tel que <a href="http://www.mozilla.org">Firefox</a>.<br>
Ceci t'aiderais déjà à rentrer dans le droit chemin et te permettra en plus d'accéder à<br>
mon site.<br>
<br>
Toujours dans ta nouvelle quête du côté clair de la force, il faudrait que tu passes sur<br>
un OS libre et gratuit (<a href="http://www.ubuntu.com">Ubuntu</a> par exemple) qui t'épanouira j'en suis sûr.<br>
<br>
Je t'invites donc à te prendre en main le plus rapidement possible.<br>
<br>
Cordialement,<br>
Pierre (alias Deimos)
</body>
</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 :

Command 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 :

Configuration File /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 :

Configuration File /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 :

Configuration File /etc/lighttpd/lighttpd.conf
server.modules = ( 
            "mod_alias",
            "mod_compress",
            "mod_rewrite",
            "mod_redirect",
            "mod_cgi",
#           "mod_usertrack",
#           "mod_expire",
#           "mod_flv_streaming",
#           "mod_evasive"
)
...
#### compress module
compress.cache-dir          = "/var/cache/lighttpd/compress/"
#compress.filetype           = ("text/plain", "text/html", "application/x-javascript", "text/css")
compress.filetype           = ("application/x-javascript", "application/javascript", "text/javascript", "text/x-js", "text/css", "text/html", "text/plain")
...

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" :

Configuration File /etc/php5/cli/php.ini
; Transparent output compression using the zlib library
; Valid values for this option are 'off', 'on', or a specific buffer size
; to be used for compression (default is 4KB)
; Note: Resulting chunk size may vary due to nature of compression. PHP
;   outputs chunks that are few hundreds bytes each as a result of
;   compression. If you prefer a larger chunk size for better
;   performance, enable output_buffering in addition.
; Note: You need to use zlib.output_handler instead of the standard
;   output_handler, or otherwise the output will be corrupted.
; http://php.net/zlib.output-compression
zlib.output_compression = on

Redémarrez ensuite votre serveur web pour que la configuration soit appliquée.

4 FAQ

4.1 Symbol `FamErrlist' has different size in shared object, consider re-linking

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 :

Command aptitude
aptitude install libfam0

et dans la configuration de Lighttpd, configurer ces lignes comme ceci :

Configuration File /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 :

Command 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 :

Configuration File /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 :

Configuration File /etc/lighttpd/lighttpd.conf
fastcgi.server = ( 
    ".php" => ((
        "bin-path" => "/usr/bin/php5-cgi",
        "socket" => "/tmp/php.socket",
        "max-procs" => 10,
        "bin-environment" => (
            "PHP_FCGI_CHILDREN" => "10",
             "PHP_FCGI_MAX_REQUESTS" => "500"
        )   
    )   
))

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