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:

    
1sudo apt install nginx
2sudo systemctl stop nginx

Préparation de la configuration

Ensuite, il faut ajouter la configuration de notre application web (nommée “myapp”, original):

    
1sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/myapp
2sudo nano /etc/nginx/sites-available/myapp

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 bloc location, la directive root 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 directive allow 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:

    
1sudo ln -s /etc/nginx/sites-available/myapp /etc/nginx/sites-enabled/
2sudo unlink /etc/nginx/sites-enabled/default
3sudo systemctl enable nginx
4sudo systemctl start nginx

Le service Nginx est démarré et surtout il démarrera automatiquement lorsqu’on allume le Raspberry Pi.