Sur la distribution DietPi, j'utilise Lighttpd comme serveur web. Il est léger et rapide. Je me note ici quelques bricoles tout à fait personnelles afin que je les retrouver facilement, mais si ça peut aider…
Le fichier de configuration de Lighttpd est /var/lighttpd/lighttpd.conf
. Pour prendre en compte un changement de config:
sudo service lighttpd force-reload
Si vous utilisez NextCloud sur un SBC (genre Raspberry), cette option va vous changer la vie.
Par défaut, Lighttpd va utiliser un fichier temporaire pour récupérer toutes les données de l'applicatif (php ou autre) et attendra la fin de l'applicatif pour envoyer au client. C'est problématique quand vous avez un NextCloud pour récupérer de gros fichiers (puisqu'il va ainsi copier localement intégralement le fichier). On change donc le paramètre suivant afin que Lighttpd stream en direct les données produits par l'applicatif.
L'applicatif va donc tourner plus longtemps (le temps que tout soit envoyé au client), mais cela évite des I/O disque monstrueuses (ce qui est problématique sur un Raspberry).
# Streamer les données vers le client plutôt qu'utiliser un fichiers temporaire server.stream-response-body = 1
Les logs ne sont pas actifs dans DietPi car cette distrib essaie de minimiser les écritures disque.
# Activer les Access logs: server.modules += ( "mod_access", "mod_accesslog", ) accesslog.format = "%V %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" accesslog.filename = "/var/log/lighttpd/access.log"
Si je ne veux pas loguer certaines requêtes provenant de certaines IP et qui demandent certaines URL, exemple:
$HTTP["remoteip"] == "12.34.56.78" { $HTTP["url"] =~ "^/nextcloud/ocs-provider/" { accesslog.filename = "" } }
Comme pour tout serveur http, par mesure de sécurité il ne faut pas indiquer la version du serveur dans les entêtes http:
# Ne pas donner le nom et version du serveur dans les réponses. server.tag=""
Dès que vous avez un serveur web ouvert sur le web, il sera scanné tout le temps. L'astuce suivante permet de bloquer directement les accès par IP , tout en laissant passer les accès par le vrai nom de la machine. Les scanners tapant généralement uniquement sur l'IP, cela les bloque (ils se verront répondre un HTTP 403 à toutes leurs requêtes).
# Bloquer les requêtes arrivant sans HOST (pour bloquer le scanning) $HTTP["host"] !~ "^monhost.mondomaine.ext$" { url.access-deny=("") }
PS; Pour réduire les risques de scan, je n'ai bien entendu pas ouvert mon serveur web sur les port 80 et 443, mais sur un port pas standard du tout (J'ai configuré ma box pour mapper un port élevé (genre 55123) vers le port 443 de mon Raspi). Je change donc la config en conséquence:
# Bloquer les requêtes arrivant sans HOST (pour bloquer le scanning) $HTTP["host"] !~ "^monhost.mondomaine.ext(:55123)?$" { url.access-deny=("") }
Ok c'est sans doute pas de bonnes pratiques, mais c'est rapide. Voici ma procédure pour renouveller le certificat Let's Encrypt, sachant que pour cela Let's Encrypt exige que le port 80 soit ouvert (oui, beurk).
sudo lighttpd-disable-mod dietpi-https_redirect
sudo service lighttpd force-reload
sudo ufw disable
sudo dietpi-letsencrypt
choisir juste "Apply".
sudo ufw enable
sudo lighttpd-enable-mod dietpi-https_redirect
sudo service lighttpd force-reload