Comment faire fonctionner Pi-hole et un serveur Nginx sur le même Raspberry Pi?
Introduction
Après l’installation de Pi-Hole, j’ai voulu héberger une mini-application web sur mon Raspberry Pi. Comme Pi-Hole fonctionne avec son propre serveur, comment faire cohabiter le serveur Web de Pi-hole et Nginx?
Préparation de Pi-hole
Comme j’ai décidé d’utiliser le port 80 pour Nginx, il faut changer le port utilisé par Pi-hole. Pour cela, il faut se connecter à l’interface web de PiHole puis aller dans le menu “System / Settings / All settings”.
Pour le port, j’ai choisi:- 8081 en HTTP
- 443 en HTTPS (classique)
Comme ça, j’accède à l’interface web du PiHole via https://pihole.gtg.local sans indiquer de port.
Autre point: il faut ajouter le nom de domaine attribué à notre application web dans les entrées DNS de Pi-hole.
J’ai simplement ajouté un CNAME du nom de domaine (case bleue, “ www.myapp.ch ”) vers le nom DNS de la machine PiHole (case orange, “pihole.gtg.local”). J’ai fixé le TTL à 60 secondes pour éviter d’attendre 3 jours qu’une prochaine modification prenne effet.Préparation de Nginx
Installation du package
On va commencer par installer le package Nginx:
Préparation de la configuration
Ensuite, il faut ajouter la configuration de notre application web (nommée “myapp”, original):
Le contenu va ressembler à cela:
1server {
2 listen 80;
3 server_name myapp.ch www.myapp.ch;
4
5 allow 192.168.1.100;
6 allow 192.168.1.101;
7 deny all;
8
9 root /var/www/html/myapp;
10
11 index index.html;
12
13 location / {
14 try_files $uri $uri/ =404;
15 }
16
17 error_page 404 /404.html;
18 location = /404.html {
19 root /var/www/html/myapp;
20 internal;
21 }
22
23 error_page 403 /403.html;
24 location = /403.html {
25 root /var/www/html/myapp;
26 allow all;
27 internal;
28 }
29
30}
Explications de cette configuration
listen 80;
: on demande à Nginx d’écouter sur le port 80 (le port http par défaut). On peut bien sûr choisir un autre port.server_name myapp.ch www.myapp.ch;
: on définit le nom DNS auquel répondra Nginx. Ici j’ai mis le nom court et le nom long (on peut donc demander http://myapp.ch et http://www.myapp.ch ). On peut bien sûr utiliser le nom DNS local de la machine.allow 192.168.1.100;
: on indique quelle adresse IP est accepté par Nginx sur ce site.deny all;
: on indique quelles adresses IP sont refusées par Nginx sur ce site, ici toutes sauf celles autorisées.root /var/www/html/myapp;
: On indique le dossier de base de l’application. A noter que le service Nginx doit avoir les droits suffisants sur ce dossier. {à détailler}index index.html;
: lorsque l’url demandée ne mentionne pas de page, Nginx retourne la page nommée index.html.location / ...
: cette directive indique quoi faire lorsque la page demandée est introuvable (ici Nginx retourne une erreur 404).error_page 404 /404.html;
: en cas de page non trouvée, Nginx redirige vers cette page. Dans le bloclocation
, la directiveroot
mentionne le dossier de base dans lequel se trouve la page.error_page 403 /403.html;
: même concept que pour les erreurs 404. A noter la présence de la directiveallow all;
nécessaire pour que les utilisateurs puissent accéder à cette page d’erreur.
Cette configuration ne charge pas PHP. Comme mon application est réalisée avec Hugo, il n’y a que des pages HTML, des CSS, un peu de Javascript à servir.
Finalisation de la configuration
Ensuite, on active notre configuration puis on démarre Nginx:
Le service Nginx est démarré et surtout il démarrera automatiquement lorsqu’on allume le Raspberry Pi.