Pi-Hole – Nginx als Webserver

HINWEIS: Aktuell ist Pi-Hole nur bedingt mit php8.1 kompatibel! Nutze am besten php7.4, damit keine Probleme entstehen! (20.02.2022)


Pi-Hole installiert (soweit ausgewählt) lighttpd als Webserver auf dem Linux-System. Damit wird ein sauberer Zugriff via Webinterface ermöglicht und die notwendigen Pakete automatisch aktualisiert.
Wer ein anderen Webserver verwenden möchte, z.B. in diesem Fall nginx, muss einige Anpassungen vornehmen, damit Pi-Hole sauber läuft.

Noch kein Pi-Hole installiert?
Ich habe ein Video-Tutorial dazu erstellt. Schau es dir doch einmal an 🙂

Noch kein Pi-Hole installiert, du kennst aber die Anleitung schon?
Sehr gut!
Du kannst während der Installation auswählen, das lighttpd NICHT installiert wird! Somit kannst du dir Schritt 1 sparen!

Das Ziel:

Das Webinterface von Pi-Hole über nginx betreiben.

Die Lösung:

1. Stoppen und deinstallieren von lighttpd
Es ist besser lighttpd direkt komplett zu deinstallieren, damit wir keine Probleme verursachen, wenn zwei Webserver laufen.

apt remove lighttpd*
apt purge lighttpd*

2. PHP ggf. updaten / installieren
Installiere nun die aktuellste php-Version.

apt install php7.4 php7.4-fpm php7.4-bcmath php7.4-cgi php7.4-cli php7.4-common php7.4-curl php7.4-gd php7.4-json php7.4-mbstring php7.4-mysql php7.4-opcache php7.4-readline php7.4-sqlite3 php7.4-xml php7.4-zip -y

3. Installiere nginx

apt install nginx

4. Eine neue Config für Pi-Hole anlegen

nano /etc/nginx/sites-enabled/pihole

Ich habe hier einmal eine Beispielkonfiguration aufgeführt.
Passe diese einfach auf deine Vorgaben an.
In den meisten Fällen muss nur die PHP-FPM-Version angepasst werden.
Es wird Port 80 verwendet und der Server hat kein Name.
ACHTUNG: Soweit die „default“-Config noch aktiv ist, ändere entweder das Root-Verzeichnis oder den genutzt Port ab. Ansonsten kann es zu Fehler 403 kommen!

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

    root /var/www/html;
    autoindex off;

    index pihole/index.php index.php index.html index.htm;

    location / {
        expires max;
        try_files $uri $uri/ =404;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php7.4-fpm.sock;
        fastcgi_param FQDN true;
    }

    location /*.js {
        index pihole/index.js;
    }

    location /admin {
        root /var/www/html;
        index index.php index.html index.htm;

    }

    location ~ /\.ht {
        deny all;
    }
}

5. Berechtige www-data für die Webinterface-Daten
Das Webinterface wurde mit dem User Root angelegt, soweit du das Script zur Installation ausgeführt hast. Dies müssen wir ändern.

chown -R www-data:www-data /var/www/html/pihole
chown -R www-data:www-data /var/www/html/admin

6. Teste die nginx-Konfiguration und starte nginx neu

nginx -t
service nginx restart

Das Webinterface sollte nun via nginx zur Verfügung stehen!

Damit nun auch die Steuerung komplett funktioniert, müssen wir noch www-data in die Gruppe pihole stecken. Ansonte lässt sich z.B. nichts importieren.

usermod -aG pihole www-data

Kennst du schon mein öffentliches Pi-Hole?
Damit kannst du von überall in der Welt den Mist blocken lassen!


Schlaues zum Schluss

Du nutzt ein nginx-Proxy und hast diese beiden Fehlermeldung bereits gehabt?
Failed Host Check: [IP-DES-HOSTS] vs 127.0.0.1, , pi.hole, localhost
Failed CORS: [IP-DES-HOSTS] vs 127.0.0.1, , pi.hole, localhost
Gebe als Proxy-IP die reale IP des Servers an und NICHT die Localhost-Adresse. Rufe anschließend das Webinterface mit der IP auf und nicht mit der Domain.

9 Kommentare

  1. Pingback:Pi-Hole – DNS-over-TLS (DoT) mit nginx - Hoerli.NET

  2. Pingback:Pi-Hole – DNS über HTTPS (DoH) mit nignx - Hoerli.NET

  3. Captain Blackbird

    Mit PHP7.4 gab es Probleme: 502 Bad Gateway
    /var/nginx/error.log hatte irgendwelche php access denied meldungen

    System: Armbian 21.08.8 Linux 5.4.160-odroidxu4
    (Sorry, ich hasse untermotorisierte Raspi-Dinger 😀 )

    Lösung: Abändern von 2 Configs.

    Schaut halt mal in dem Pfad /run/php/ ob da ne datei/symlink
    php-fpm.sock
    liegt oder ob das Ding anders heisst.

    Das Problem ist dann nämlich NICHT ein Rechteproblen, sondern einfach Griff ins Leere weil siehe unten.

    1. Obere Beispielconfig
    # fastcgi_pass unix:/run/php/php7.3-fpm.sock;
    fastcgi_pass unix:/run/php/php-fpm.sock;

    2. PHP-FPM
    (alte Zeile mit ; auskommentiert, damit man sieht was man rumpfuscht)
    /etc/php/7.4/fpm/pool.d/www.conf

    ;listen = /run/php/php7.4-fpm.sock
    listen = /var/run/php/php-fpm.sock

    Jetzt läuft es, zumindest wenn man via IP-Adresse/admin aufruft.

    Nächstes Problem was ich nun fixen muss und wahrscheinlich genauso banal zu lösen ist, das Ansprechen via Host/interne Domain…

    Failed Host Check: Rechnername vs 192.168.x.x, , _, pi.hole, localhost

    Nachbrenner für Anfänger:
    „ACHTUNG: Soweit die “default”-Config noch aktiv ist, ändere entweder das Root-Verzeichnis oder den genutzt Port ab. Ansonsten kann es zu Fehler 403 kommen!“

    Ja genau, hilft Anfängern aber nicht wirklich weiter, weil nicht beschrieben WIE!

    Wenn man wie oben die config unter pihole speichert statt default

    nginx: [emerg] open() "/etc/nginx/sites-enabled/default" failed (2: No such file or directory) in>
    Jan 27 18:13:19 Core nginx[8770]: nginx: configuration file /etc/nginx/nginx.conf test failed
    Jan 27 18:13:19 Core systemd[1]: nginx.service: Control process exited, code=exited, status=1/FAILURE

    Also Anfänger, legt euch in /etc/nginx/sites-enabled/ nen ordner backup an, sichert/kopiert die Datei default da rein
    und erst dann ersetzt den Inhalt von default mit dem oberen Beispiel von Hoerli

    Erpart euch viel Frust 😉

    Mein Vorgehen soweit war (Frei Schnauze, garantiert politisch-inkorrekt, grammatikalisch ebenso):
    Auf die Kiste via ssh als root einloggen und nacheinander abgearbeitet
    lighttpd wegbomben und durch nginx ersetzen:
    apt purge lighttpd

    Gibt am Ende ein WARNING – egal heisst nur das er die Verzeichnisse vom laufendfen Pi-Hole in /var/www/html nicht mit ausradiert wurden, alles gut – Schock bekämpfen und Tasse Kaffee trinken.

    apt install -y nginx

    Yup, unfallfrei installiert.

    Dann mal gucken welche PHP-Version drauf ist, also
    php -v
    PHP 7.4.25 (cli) (built: Oct 23 2021 21:53:50) ( NTS )

    AHA, is also 7.4 – hab ich doch Lunte gerochen das mit copy&paste oben nix draus wird fein,fein

    Also die Zeile oben alle 7.3 in 7.4 abändern und mit -y die doofe Frage willste das installieren abwürgen…
    apt install -y php7.4 php-fpm php7.4-bcmath php7.4-cgi php7.4-cli php7.4-common php7.4-curl php7.4-gd php7.4-json php7.4-mbstring php7.4-mysql php7.4-opcache php7.4-readline php7.4-sqlite3 php7.4-xml php7.4-zip

    Dann die Rechte für das html-Verzeichnis setzen, Faulheitshalber als Einzeiler:
    chown -R www-data:www-data /var/www/html/pihole && chown -R www-data:www-data /var/www/html/admin
    www-data in die pi-hole Gruppe boxen:
    usermod -aG pihole www-data

    Mal gucken ob nginx was zu meckern hat:
    nginx -t

    Nö, alles save.

    Dann, weil gerade Hirntod-Modus, nochmal wie in der Pi-Hole Doku beschrieben, aber vielleicht fehlt noch das apache zeugs
    Doku übrigens völlig outdatet, kümmert sich anscheinend auch keiner drum – wie so oft.
    War wahrscheinlich völlig unnötig.
    copy&paste aus der Doku:

    apt-get -y install nginx php7.4-fpm php7.4-cgi php7.4-xml php7.4-sqlite3 php7.4-intl apache2-utils

    Kommentiert mal bitte dazu.

    PHP-FPM autostart mal anschmeissen:
    systemctl enable php7.4-fpm

    yup, hat er angelegt, keine Fehlermeldung
    Für nginx auch nochmal den autostart anwerfen:
    systemctl enable nginx

    Kurz checken ob die Dinger rennen:
    systemctl status php7.4-fpm.service
    joar, gut – mit q kommt man übrigens wieder raus

    systemctl status nginx.service
    gleiches spiel, rennt

    Weil ich nun mal Faul bin ,Komfort liebe und kein Windoof nutze ausser zum Zocken, mit sftp://rechner via Nautilus verbunden und mit GUI und Texteditor configs bearbeiten ist schon fein.
    Egal.

    Machen wir den Hollywood-Hackerkonsolenstyle:
    nano /etc/nginx/sites-available/default

    Ganzen Text löschen und die Config von Hoerli reinkopiert, abspeichern, nginx restart

    systemctl restart nginx.service

    Dann Fehler 502 – suuuper, war ja klar
    Fehlersuche via Schwarmintelligenz Startpage/DuckDuckGo/Google
    Viele Beiträge/Foren/Wordpressbeiträge später…
    Suche in englisch, denn Hilfe auf deutsch führt meist zu nix Sinvollem, zumindest meist noch unsinniger als englisch.
    Lösung irgendwo gefunden wie oben beschrieben.
    (Der Threadersteller war akribisch und hat die Lösung selber gepostet, nachdem keiner in der Lage war die Ursache zu finden)

    Neuen Tab im Browser, Rechnername wo pi-hole rennt und schwupps blanke Seite mit ner tollen Zeile – nix Interface, verdammt!
    Also mal via http://IP-Adresse/admin probiert – tadaaa – funktioniert.

    So, hoffe das es euch bisschen weiterhilft, jeze neuen Kaffee und das nächste Problem eruieren…

    Hawediehre,
    Captain Blackbird

  4. sehr nice wirklich, sehr nice geschrieben und das beste – es funzt sogar 🙂

    Vielen Dank für das tolle tutorial hier

    besten Gruß
    Jörg

  5. Ich bekomme danach die Fehlermeldung:“ Failed Host Check: dns2.domainname.de vs 1**.***.***.22, (ipv6), , pi.hole, localhost“

    Alle Domains sind zensiert.

    • Du greifst in dem Fall via Domain auf den Pi-Hole zu, welche nicht in der Whitelist für den Zugriff steht.
      Einfachster Ausweg, nutze die IP-Adresse, welche erlaubt ist 🙂
      Umständlicher Ausweg für die Domain: Richte dir ein Proxy-Server ein (geht mit wenigen Zeilen nginx-Code), welcher auf das Webinterface per IP zeigt, dann gehts auch.

      Code für Proxy:
      server {
      listen 443 ssl;
      listen [::]:443 ssl;
      server_name pihole.domain.de;
      index index.php;
      server_tokens off;
      location ^~ / {
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header Host $host;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_pass http://127.0.0.1:8080/admin/;
      proxy_read_timeout 90;
      }

      ssl_certificate /etc/letsencrypt/live/DEINE-DOMAIN.DE/fullchain.pem; # managed by Certbot
      ssl_certificate_key /etc/letsencrypt/live/DEINE-DOMAIN.DE/privkey.pem; # managed by Certbot
      }

      Das editieren der Whitelist funktioniert bei mir auch nicht immer sauber, daher lieber mit Proxy, ist stressfreier.

  6. Einfach nur Klasse! genau was ich brauche – denn ich nutze nginx bereits als proxy.

    Jedoch wenn ich „pihole up“ zum aktualisieren ausführe, wird wieder „lighttpd“ installiert. Kann man das umgehen?

    • Hi!
      Super das die Anleitung gefallen hat.
      Falls lighttpd wieder kommt, öffne mal die Pi-Hole-Konfiguration (/etc/pihole/setupVars.conf) und ändere deie Parameter INSTALL_WEB_SERVER und LIGHTTPD_ENABLED auf false.
      Die müssten bei dir ggf. auf true stehen.
      Dann dürfte lighttpd nicht mehr installiert werden

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.