close button

Bienvenue sur ce site internet auto-hébergé. Il est conforme au règlement général européen sur la protection des données (RGPD). Aucun cookie de traçage, aucune bannière et aucune publicité ne sont présents. Son contenu est mis à disposition selon les termes de la licence Creative Commons BY-NC-SA. Toute utilisation à des fins commerciales est strictement interdite et toute reproduction ou partage, même partiel, doivent respecter ces termes. Pour en savoir plus...

Rpi-update, Nginx et IPv6

Écrit par : fdgeek
7 minutes
Rpi-update, Nginx et IPv6

Tous les trois mois environ, j'ai l'habitude de mettre à jour le firmware de mon Raspberry Pi grâce au paquet rpi-update. C'est une opération qui n'est pas obligatoire, mais elle me permet de disposer du dernier noyau Linux (Kernel) disponible pour mon matériel sans attendre que ce dernier soit intégré au sein des mises à jour officielles de la distribution Raspbian.

Le but est de bénéficier des dernières avancées en terme de compatibilité et d'optimisation matérielle ainsi que des derniers correctifs de sécurité intégrés aux noyau. Au préalable, je conseille vivement de procéder à une sauvegarde complète de son système (avec rpi-clone par exemple) car c'est une manipulation qui touche au cœur du système. Prudence est mère de sûreté.😁

Il y a deux jours donc, je décide de passer au dernier firmrware disponible : la branche de Kernel 5.15.

Aucun souci pour ce qui concerne cet Update, mais, au redémarrage du Raspberry Pi, je constate que les services sont en mode dégradé. Je consulte leur statut et je m'aperçois que le serveur Nginx est en échec de lancement après le Boot.

Je tente un démarrage manuel via une ligne de commande :

sudo systemctl start nginx 

Mais, rien n'y fait, le service Nginx refuse toujours de démarrer. Je regarde alors quel est son statut exact afin d'avoir plus d'informations sur la cause de cette panne avec la commande :

sudo systemctl status nginx

Et là, j'ai le beau message d'erreur suivant :

-- Unit nginx.service has begun starting up.
Oct 30 15:41:42 nginx[5069]: nginx: [emerg] socket() [::]:80 failed (97: Address family not supported by protocol)
Oct 30 15:41:42 nginx[5069]: nginx: configuration file /etc/nginx/nginx.conf test failed
Oct 30 15:41:42 systemd[1]: nginx.service: Control process exited, code=exited status=1
Oct 30 15:41:42 systemd[1]: Failed to start A high performance web server and a reverse proxy server.
-- Subject: Unit nginx.service has failed

En moins de deux minutes de recherche sur le net je vois que cette erreur est bien documentée et qu'elle émane d'un problème avec le protocole IPv6. ([::] 80 failed (97: Address family not supported by protocol)). C'est très clair Nginx tente de démarrer en écoutant le port 80 d'une adresse de type IPv6. N'ayant rien modifié dans ma configuration système concernant l'adressage et les protocoles réseau, ni dans la configuration d'Nginx, et, IPv6 étant désactivé depuis des lustres sur mon serveur, tout s'explique. Mais, le serveur Nginx ayant toujours démarré sans souci jusqu'à ce jour j'en conclue que cela ne peut venir que de la mise à jour du firmware vers le dernier noyau Linux

Il y a probablement une modification dans la gestion des protocoles IP qui jusqu'à cette version du noyau n'impactait pas le fonctionnement d' Nginx. Pour réparer cette panne, j'ai donc procédé aux corrections recommandées :

Éditer les fichiers de configuration et commenter la directive qui demande au serveur web d'écouter sur le port 80 d'une adresse au format IPv6. Ceci afin d'inactiver cette fonction. A savoir la ligne :

listen [::]:80 default_server;

Pour ce faire, il faut en premier lieu éditer le fichier de configuration de base du serveur web : Default présent dans le répertoire /etc/nginx/sites-enabled :

sudo nano /etc/nginx/sites-enabled/default

et ensuite faire de même avec tous les fichiers des sites web (noms de domaines déclarés et actifs) où cette ligne est aussi présente. Cette directive doit être commentée avec un # . Comme dans l'exemple ci-dessous :

server {
        listen 80 default_server;
        #listen [::]:80 default_server;

Puis enregistrer les modifications et quitter l'éditeur Nano:

ctrl+O
ctrl+X

Ensuite, j'effectue une relance manuelle du serveur Nginx pour voir si tout fonctionne :

sudo systemctl start nginx

Tout est OK. Je fais de même avec un redémarrage à chaud du serveur :

sudo systemctl restart nginx

Tout fonctionne également, Nginx se relance sans broncher.

N'ayant jusqu'à ce jour désactivé le protocole IPv6 que via les fichiers de configuration réseau du système d'exploitation, j'opte pour une solution bien plus radicale en passant directement par le fichier de configuration du Boot du Raspberry Pi. Le fichier config.txt qui agit directement sur la configuration matérielle dès le démarrage de la machine (comme un BIOS sur un PC).

J'édite donc ce fichier afin d'y rajouter une directive qui désactive de façon permanente la prise en charge du protocole IPv6 au niveau matériel dès le démarrage de la carte. J'ouvre le fichier avec l'éditeur Nano :

sudo nano /boot/config.txt

Et j'ajoute à la fin les lignes suivantes :

# Disable IPv6 protocol
ipv6.disable=1

J'enregistre et je relance la machine :

sudo reboot

Une fois le Raspberry Pi redémarré, tous les services sont au vert et le serveur Nginx fonctionne parfaitement.👍

Opter pour une modification du fichier config.txt sera je l'espère plus pertinent et efficace pour palier aux modifications apportées par les futurs firmwares...

Mentions légales