Créer un serveur Web avec Lighttpd sur Raspberry Pi

Dans un article précédent, l'installation d'un serveur Web Apache sur un Raspberry Pi avait été présentée. Or il existe une version allégée de serveur Web beaucoup plus adaptée aux ressources techniques d'un nano-ordinateur : Lighttpd.
Le présent article reprend le plan de l'article précédent pour décrire l'installation et la configuration d'un serveur Web Lighttpd sur RaspberryPi. Globalement, le principe est le même à quelques différence près.

Installer Lighttpd

L'installation du logiciel Lighttpd se fait par la commande apt.
pi@raspi01:~ $ sudo apt update
. . .
pi@raspi01:~ $ sudo apt upgrade
. . .
pi@raspi01:~ $ sudo apt install lighttpd
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 :
  libfam0 libmariadb3 lighttpd-modules-ldap lighttpd-modules-mysql
  mariadb-common mysql-common spawn-fcgi
Paquets suggérés :
  fam rrdtool php-cgi apache2-utils lighttpd-doc
Les NOUVEAUX paquets suivants seront installés :
  libfam0 libmariadb3 lighttpd lighttpd-modules-ldap lighttpd-modules-mysql
  mariadb-common mysql-common spawn-fcgi
0 mis à jour, 8 nouvellement installés, 0 à enlever et 0 non mis à jour.
Il est nécessaire de prendre 546 ko dans les archives.
Après cette opération, 1 663 ko d'espace disque supplémentaires seront utilisés.
Souhaitez-vous continuer ? [O/n] O
. . .
Traitement des actions différées (« triggers ») pour systemd (241-7~deb10u3+rpi1) ...
Traitement des actions différées (« triggers ») pour man-db (2.8.5-2) ...
Traitement des actions différées (« triggers ») pour libc-bin (2.28-10+rpi1) ...
pi@raspi01:~ $

Configurer Lighttpd

Fichier de configuration de Lighttpd

Lighttpd est configuré dans le fichier /etc/lighttpd/lighttpd.conf dont voici le contenu  :
server.modules = (
        "mod_indexfile",
        "mod_access",
        "mod_alias",
        "mod_redirect",
)

server.document-root        = "/var/www/html"
server.upload-dirs          = ( "/var/cache/lighttpd/uploads" )
server.errorlog             = "/var/log/lighttpd/error.log"
server.pid-file             = "/var/run/lighttpd.pid"
server.username             = "www-data"
server.groupname            = "www-data"
server.port                 = 80

# strict parsing and normalization of URL for consistency and security
# https://redmine.lighttpd.net/projects/lighttpd/wiki/Server_http-parseoptsDetails
# (might need to explicitly set "url-path-2f-decode" = "disable"
#  if a specific application is encoding URLs inside url-path)
server.http-parseopts = (
  "header-strict"           => "enable",# default
  "host-strict"             => "enable",# default
  "host-normalize"          => "enable",# default
  "url-normalize-unreserved"=> "enable",# recommended highly
  "url-normalize-required"  => "enable",# recommended
  "url-ctrls-reject"        => "enable",# recommended
  "url-path-2f-decode"      => "enable",# recommended highly (unless breaks app)
 #"url-path-2f-reject"      => "enable",
  "url-path-dotseg-remove"  => "enable",# recommended highly (unless breaks app)
 #"url-path-dotseg-reject"  => "enable",
 #"url-query-20-plus"       => "enable",# consistency in query string
)

index-file.names            = ( "index.php", "index.html" )
url.access-deny             = ( "~", ".inc" )
static-file.exclude-extensions = ( ".php", ".pl", ".fcgi" )

compress.cache-dir          = "/var/cache/lighttpd/compress/"
compress.filetype           = ( "application/javascript", "text/css", "text/html", "text/plain" )

# default listening port for IPv6 falls back to the IPv4 port
include_shell "/usr/share/lighttpd/use-ipv6.pl " + server.port
include_shell "/usr/share/lighttpd/create-mime.conf.pl"
include "/etc/lighttpd/conf-enabled/*.conf"

#server.compat-module-load   = "disable"
server.modules += (
        "mod_compress",
        "mod_dirlisting",
        "mod_staticfile",
)
Il est fortement déconseillé de modifier ce fichier directement. La configuration par défaut convient dans la majorité des cas.
Mais ce fichier donne des indications importantes :
  • Les pages Web consultables à distance doivent être rangées dans le dossier /var/www/html
  • Le service Lighttpd fonctionne en tâche de fond dans le compte Linux www-data et dans le groupe d'utilisateurs du même nom.
  • Le serveur Web Lighttpd écoute sur le port 80. Ce port est le port standard pour les protocole Web HTTP.

Les modules de Lighttpd

Il existe plusieurs module d'extension pour Lighttpd. La configuration de ces modules sont contenus dans le dossier /etc/lighttpd/conf-available.

pi@raspi01:~ $ ls -l /etc/lighttpd/conf-available
total 104
-rw-r--r-- 1 root root 839 janv. 28  2019 05-auth.conf
-rw-r--r-- 1 root root  91 janv. 28  2019 10-accesslog.conf
-rw-r--r-- 1 root root 396 janv. 28  2019 10-cgi.conf
-rw-r--r-- 1 root root  63 janv. 28  2019 10-dir-listing.conf
-rw-r--r-- 1 root root  36 janv. 28  2019 10-evasive.conf
-rw-r--r-- 1 root root 128 janv. 28  2019 10-evhost.conf
-rw-r--r-- 1 root root 104 janv. 28  2019 10-expire.conf
-rw-r--r-- 1 root root 177 janv. 28  2019 10-fastcgi.conf
-rw-r--r-- 1 root root  42 janv. 28  2019 10-flv-streaming.conf
-rw-r--r-- 1 root root  82 janv. 28  2019 10-no-www.conf
-rw-r--r-- 1 root root 849 janv. 28  2019 10-proxy.conf
-rw-r--r-- 1 root root 176 janv. 28  2019 10-rewrite.conf
-rw-r--r-- 1 root root 253 janv. 28  2019 10-rrdtool.conf
-rw-r--r-- 1 root root 398 janv. 28  2019 10-simple-vhost.conf
-rw-r--r-- 1 root root 449 janv. 28  2019 10-sockproxy.conf
-rw-r--r-- 1 root root  99 janv. 28  2019 10-ssi.conf
-rw-r--r-- 1 root root 203 févr. 23  2019 10-ssl.conf
-rw-r--r-- 1 root root 460 janv. 28  2019 10-status.conf
-rw-r--r-- 1 root root 450 janv. 28  2019 10-userdir.conf
-rw-r--r-- 1 root root  38 janv. 28  2019 10-usertrack.conf
-rw-r--r-- 1 root root 168 janv. 28  2019 11-extforward.conf
-rw-r--r-- 1 root root 575 janv. 28  2019 15-fastcgi-php.conf
-rw-r--r-- 1 root root 508 janv. 28  2019 90-debian-doc.conf
-rw-r--r-- 1 root root  56 juil. 28  2013 90-javascript-alias.conf
-rw-r--r-- 1 root root 162 janv. 28  2019 99-unconfigured.conf
-rw-r--r-- 1 root root 843 janv. 28  2019 README
pi@raspi01:~ $
Le fichier README explique ce qu'il est possible de faire.
Ces modules sont activés par la commande lighty-enable-mod et peuvent être désactivés par lighty-disable-mod. La modification de la configuration Lighttpd passera par la modification de ces fichiers de configuration.

Modification des droits sur le répertoire /var/www/html

Comme configuré dans le fichier lighttpd.conf vu ci-dessus, le contenu du site web, consultable à distance avec un navigateur Web, se situe dans le dossier /var/www/html. Ce répertoire a été créé automatiquement à l'installation de Lighttpd.  Par défaut il a pour propriétaire root.  Ce qui est problématique pour le service Lighttpd qui fonctionne avec l'utilisateur www-data et pour les utilisateurs de Linux qui doivent passer par sudo pour en modifier le contenu. Aussi est-il nécessaire lancer quelques commandes de configuration pour accorder les autorisations qui conviennent à son usage.
pi@raspi01:~ $ sudo chown -R www-data:www-data /var/www
pi@raspi01:~ $ sudo usermod -a -G www-data pi
pi@raspi01:~ $ groups pi
pi : pi adm dialout cdrom sudo audio www-data video plugdev games users input netdev spi i2c gpio
pi@raspi01:~ $ sudo chmod -R g+ws /var/www
pi@raspi01:~ $ ls -l /var/www
total 4
drwxrwsr-x 2 www-data www-data 4096 mai    9 14:06 html
pi@raspi01:~ $ ls -l /var/www/html
total 4
-rw-rwSr-- 1 www-data www-data 66 mai    9 14:06 index.html
pi@raspi01:~ $
  • La première commande modifie le propriétaire du répertoire /var/www et de tout son contenu (option –R) pour que ce soit le groupe www-data.
  • La deuxième affecte le groupe www-data à l’utilisateur pi (pi est l'utilisateur par défaut du Raspberry Pi) 
  • La troisième commande permet de vérifier que l’utilisateur pi est bien membre du groupe www-data.
  • La quatrième commande modifie les droits sur le répertoire /var/www pour que les membres du groupe www-data puisse en modifier, voir en exécuter (dans le cas de PHP ou de Python), le contenu.
  • La cinquième et la sixième commande permet de vérifier que les droits sont bien accordés au groupe www-data.

Créer la page d'accueil

La page d'accueil d'un site web est la page web qui est appelée par défaut lorsque aucune page n'est mentionnée dans l'url de la requête. Pour Apache, c'est la page index.html. Par exemple, lorsque l'internaute tape l'url http://192.168.1.102 (c'est l'adresse IP accordée par le DHCP au Raspberry Pi utilisé pour l'exemple dans cet article), le serveur Web comprend http://192.168.1.102:80/index.html. C'est à dire que la requête HTTP de la ressource index.html (qui est la page d'accueil du serveur Web) est envoyée sur le serveur dont l'adresse IP 192.168.1.102 sur le port 80 (qui est le port par défaut du protocole HTTP).
Le fichier index.html peut être créé avec nano, vi ou  Geany (n'importe quel éditeur de texte fait l'affaire) dans le répertoire /var/www/html. Le code HTML à taper figure ci-dessous :
<html>
        <head>
        </head>
        <body>
                <h1>Ça marche !</h1>
        </body>
</html>

Tester l'installation

Pour tester si l’installation est correcte, il suffit de taper http://192.168.1.102 (l'adresse IP du Raspberry Pi attribuée par le serveur HTTP peut être différente)  dans la barre de navigation d'un navigateur Web sur un ordinateur distant connecté au même réseau (l'ordinateur doit donc avoir lui aussi une adresse 192.168.1.x). Si tout se passe bien, la page doit s'afficher comme ci-dessous :

Contrôler le serveur Web

Activer ou désactiver le service lighttpd

Le service lighttpd utilise des ressources sur le Raspberry Pi. Ce qui peut être gênant pour un projet gourmand en ressources, mais pour lequel point n'est besoin d'un serveur Web. Pour ne pas avoir à désinstaller puis à réinstaller le service ligghttp en fonction des besoins, il est plus simple de l'arrêter, ou de le redémarrer à volonté. Ceci se fait grâce à la commande service de Linux.
La commande Linux service --status-all permet de connaitre l'état de tous les services installés :
robotpi@raspi01:~ $ sudo service --status-all
 [ - ]  alsa-utils
 [ - ]  apparmor
 [ + ]  avahi-daemon
 [ + ]  bluetooth
 [ - ]  console-setup.sh
 [ + ]  cron
 [ + ]  dbus
 [ + ]  dhcpcd
 [ + ]  dphys-swapfile
 [ + ]  fake-hwclock
 [ - ]  hwclock.sh
 [ - ]  keyboard-setup.sh
 [ + ]  kmod
 [ + ]  lightdm
 [ + ]  lighttpd
 [ + ]  networking
 [ - ]  nfs-common
 [ - ]  paxctld
 [ - ]  plymouth
 [ - ]  plymouth-log
 [ + ]  procps
 [ + ]  raspi-config
 [ ? ]  rng-tools
 [ - ]  rpcbind
 [ - ]  rsync
 [ + ]  rsyslog
 [ + ]  ssh
 [ - ]  sudo
 [ + ]  triggerhappy
 [ + ]  udev
 [ - ]  x11-common
pi@raspi01:~ $
La présence de lighttpd dans cette liste prouve que le service a bien été installé. S'il est activé, il y a un [ + ] devant. S'il est arrêté, il y a un [ - ].
Pour arrêter le service lighttpd, on utilise la commande Linux service lighttpd stop.
pi@raspi01:~ $ sudo service lighttpd stop
pi@raspi01:~ $ sudo service --status-all
 [ - ]  alsa-utils
 [ - ]  apparmor
 [ + ]  avahi-daemon
 [ + ]  bluetooth
 [ - ]  console-setup.sh
 [ + ]  cron
 [ + ]  dbus
 [ + ]  dhcpcd
 [ + ]  dphys-swapfile
 [ + ]  fake-hwclock
 [ - ]  hwclock.sh
 [ - ]  keyboard-setup.sh
 [ + ]  kmod
 [ + ]  lightdm
 [ - ]  lighttpd
 [ + ]  networking
 [ - ]  nfs-common
 [ - ]  paxctld
 [ - ]  plymouth
 [ - ]  plymouth-log
 [ + ]  procps
 [ + ]  raspi-config
 [ ? ]  rng-tools
 [ - ]  rpcbind
 [ - ]  rsync
 [ + ]  rsyslog
 [ + ]  ssh
 [ - ]  sudo
 [ + ]  triggerhappy
 [ + ]  udev
 [ - ]  x11-common
pi@raspi01:~ $
Pour redémarrer le service lighttpd, on utilise la commande Linux service lighttpd start.
pi@raspi01:~ $ sudo service lighttpd start
pi@raspi01:~ $ sudo service --status-all
 [ - ]  alsa-utils
 [ - ]  apparmor
 [ + ]  avahi-daemon
 [ + ]  bluetooth
 [ - ]  console-setup.sh
 [ + ]  cron
 [ + ]  dbus
 [ + ]  dhcpcd
 [ + ]  dphys-swapfile
 [ + ]  fake-hwclock
 [ - ]  hwclock.sh
 [ - ]  keyboard-setup.sh
 [ + ]  kmod
 [ + ]  lightdm
 [ + ]  lighttpd
 [ + ]  networking
 [ - ]  nfs-common
 [ - ]  paxctld
 [ - ]  plymouth
 [ - ]  plymouth-log
 [ + ]  procps
 [ + ]  raspi-config
 [ ? ]  rng-tools
 [ - ]  rpcbind
 [ - ]  rsync
 [ + ]  rsyslog
 [ + ]  ssh
 [ - ]  sudo
 [ + ]  triggerhappy
 [ + ]  udev
 [ - ]  x11-common
pi@raspi01:~ $

Désactiver ou activer le service lighttpd au démarrage

Le problème des commandes précédentes est que lorsque le système Raspberry redémarre, le service ligttpd est à nouveau actif, quelque soit l'état dans lequel il se trouvait avant l'opération. 
Pour le désactiver de façon persistante au démarrage, on utilise la commande Linux systemctl  :
pi@raspi01:~ $ sudo systemctl disable lighttpd
Synchronizing state of lighttpd.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install disable lighttpd
Removed /etc/systemd/system/multi-user.target.wants/lighttpd.service.
pi@raspi01:~ $
Pour l'activer de façon persistante au démarrage :
pi@raspi01:~ $ sudo systemctl enable lighttpd
Synchronizing state of lighttpd.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable lighttpd
Created symlink /etc/systemd/system/multi-user.target.wants/lighttpd.service → /lib/systemd/system/lighttpd.service.
pi@raspi01:~ $ 
A remarquer que, quelque soit l'état du service lighttpd au démarrage, celui-ci peut toujours être activé ou désactivé à volonté avec la commande service.

Conclusion

Le serveur Web Lighttpd est une alternative à Apache plus légère pour installer un serveur Web sur un Rasberry Py. Ce logiciel est vu par Raspbian comme un service. Celui-ci peut donc être activé et désactivé à volonté comme n'importe quel autre service Debian grâce aux commandes service, ou systemctl lorsque la persistance est nécessaire.
Ce service sert des pages statiques au format HTML. Mais il peut aussi servir des pages créées dynamiquement par des scripts CGI programmés avec un langage  de programmation. Cela permet d'envisager de construire le contenu d'une page à partir de données collectées dans un fichier ou dans une base de données comme MariaDB (une alternative en logiciel libre à MySQL) installable à partir des packages Rasbian.
Traditionnellement, les scripts CGI sont écrits en langage PERL. Mais les langages C, C++, PHP et même Python peuvent être également utilisés, moyennant une configuration adéquate du service lighttpd. Le prochain article présentera comment configurer lighttpd pour servir des pages dynamiques programmées en Python.

Commentaires

Posts les plus consultés de ce blog

Gérer la mise en veille

Configurer VSCode pour programmer et déboguer à distance sur Raspberry Pi

Créer un nouvel utilisateur Raspbian