Raspberry Pi: Nginx und PHP installieren und einrichten

Einige Projekte für den Raspberry Pi benötigen einen Webserver auf dem beispielsweise Software wie Owncloud oder WordPress installiert werden kann. Als Webserver für den Raspberry Pi kommen Apache oder Nginx in Frage. Nginx wird die bessere Performance für leistungsschwache Hardware nachgesagt, weshalb ich mich für diesen Server entschieden habe.

Die Diskussion welcher Server besser für den Raspberry Pi geeignet ist, kann hier und hier nachgelesen werden. Da meine Projekte weder viele Nutzer noch eine große Anzahl an Anfragen produzieren werden, dürfte es letztendlich egal sein. Diese Anleitung erklärt die Installation von Nginx und PHP auf dem Raspberry Pi.

Nginx und PHP auf dem Raspberry Pi installieren
Nginx und PHP auf dem Raspberry Pi installieren (Bild: Benjamin Blessing).

Raspberry Pi: Nginx und PHP installieren und einrichten

Wie bei allen Anleitungen gilt auch hier, ihr müsst keine Profis sein, nur den Willen zu haben und etwas zu recherchieren, falls es bei euch klemmt. Ansonsten genügt das Befolgen der hier genannten Schritte. Zur Durchführung wir eine lauffähige Distribution wie Raspbian erwartet. Anleitungen dazu finden sich hier:

Zudem kann auf Wunsch die Installation von Nginx ganz bequem via SSH per Kommandozeile vorgenommen werden. Wie man mit dem Raspberry Pi eine SSH-Verbindung aufbauen kann, erklärt der Beitrag.

Raspbian upgraden

Vor der Installation von Nginx auf dem Raspberry Pi werden alle Pakete des Betriebssystems auf den aktuellen Stand gebracht. Das erfolgt mit folgendem Befehl über den Terminal:

sudo apt-get update
sudo apt-get dist-upgrade
sudo apt-get upgrade

PHP 7.0 auf dem Raspberry Pi installieren

Raspbian basiert auf Debian Jessie und wird mit PHP 5.6 ausgeliefert. Das ist soweit auch gut aber zwischenzeitlich ist mit PHP 7.0 eine bessere Option auf dem Markt. PHP 7.0 wurde im Dezember 2015 vorgestellt und bringt erhebliche Verbesserungen in den Bereichen Leistung, Sprache und nutzt dabei deutlich weniger Speicher. Optimal für den Raspberry Pi.

Damit PHP 7.0 auf dem Raspberry Pi installiert werden kann, wird Zugriff auf die Entwicklerversion von Raspbian benötigt. Diese trägt den Codename stretch. Dazu ist die Datei sources.list abzuändern welche von Aptitude (apt-get) genutzt wird.

sudo nano /etc/apt/sources.list

Unter der ersten Zeile die das Wort jessie enthält, ist folgende Zeile einzufügen:

deb http://mirrordirector.raspbian.org/raspbian/ stretch main contrib non-free rpi

Gespeichert wird mit Strg + X, Y und dann Enter drücken.

Damit würden alle Installationen und Updates automatisch die neusten verfügbaren Dateien aus dem stretch Release ziehen. Diese sind jedoch nicht immer 100 Prozent stabil. Damit zukünftig keine instabilen Pakete installiert werden, werden automatisch alle Pakete gezwungen, das jessie Release mit einer höheren Priorität zu wählen.

sudo nano /etc/apt/preferences

Hier ist folgendes einzufügen:

Package: *
Pin: release n=jessie
Pin-Priority: 600

Gespeichert wird mit Strg + X, Y und dann Enter drücken.

Anschließend werden die Updates noch einmal ausgeführt mit:

sudo apt-get update

Jetzt erfolgt die Installation von PHP 7.0 auf dem Raspberry Pi aus dem stretch Release inklusive aller PHP-Pakete.

sudo apt-get install -t stretch php7.0 php7.0-curl php7.0-gd php7.0-fpm php7.0-cli php7.0-opcache php7.0-mbstring php7.0-xml php7.0-zip

Mit nachfolgendem Befehl lässt sich die Funktion von PHP testen:

php -v

Anschließend sollte folgende oder ähnliche Ausgabe erscheinen:

PHP 7.0.7-4 (cli) ( NTS )
Copyright (c) 1997-2016 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies
with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2016, by Zend Technologies

Fertig. PHP 7.0 wurde erfolgreich auf dem Raspberry Pi installiert.

Nginx auf dem Raspberry Pi installieren

Wie bei PHP 7.0 gibt es im stretch Release eine neue und verbesserte Version mit der Nummer 1.9. Diese wird wie folgt installiert:

sudo apt-get install -t stretch nginx

Nginx auf dem Raspberry Pi starten

Mit folgende Befehl wird Nginx gestartet:

sudo /etc/init.d/nginx start

An dieser Stelle empfiehlt es sich kurz zu testen, ob die Installation von Nginx auf dem Raspberry Pi erfolgreich war. Nginx erstellt eine HTML Datei in Web-Ordner. Diese default Webseite lässt sich wie folgt aufrufen:

Über den Browser des Raspberry Pis:

http://localhost/

Über einen Computer im Netzwerk. Dazu benötigt ihr die IP-Adresse eures Raspberry Pis. Wenn ihr diese nicht kennt, zeigt folgende Befehl euch diese an:

hostname -I

Über einen beliebigen Computer im Netzwerk könnt ihr die Webseite dann unter der IP aufrufen. Beispielsweise:

http://192.168.1.10

Wenn ihr das nachfolgende Bild sieht, wart ihr bis hier erfolgreich. Einige weitere Schritte sind für die abschließende Installation von Nginx auf dem Raspberry Pi notwendig.

Nginx auf dem Raspberry Pi
Nginx auf dem Raspberry Pi (Bild: Nginx).

Nginx auf dem Raspberry Pi konfigurieren

Die Standardwebseite liegt im Verzeichnis /usr/share/nginx/www unter Raspbian. Die index.html kann von euch beliebig angepasst, gelöscht oder durch eine andere ersetzt werden. Das Standardverzeichnis wird über eine Datei in /etc/nginx/sites-available festgelegt. In dieser Datei befindet sich eine Zeile die mit root beginnt. Hier kann das Verzeichnis beliebig angepasst werden.

Nginx liefert eine default Datei für die Konfiguration mit. Da wir diese modifizieren, empfiehlt es sich davon eine Sicherungskopie zu erstellen. Es wird eine Kopie von default mit dem Namen default-do-not-touch angelegt:

cd /etc/nginx/sites-available

sudo cp default default-do-not-touch

cd

Weitere Informationen zum Kopieren unter Linux erklärt der verlinkte Beitrag.

Im nächsten Schritt ist PHP für Nginx zu aktivieren:

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

Dort ist folgende Zeile zu suchen:

index index.html index.htm;

Bei mir war diese bei Zeile 39. Um zu sehen in welcher Zeile der Cursor sich befindet, einfach Strg + C drücken. In die oben genannte Zeile muss noch ein index.php eingefügt werden, so dass die Zeile anschließend wie folgt aussieht:

index index.php index.html index.htm;

Zusätzlich ist noch etwas weiter unten in der default Datei weitere Zeilen anzupassen. Scrollt etwas runter bis ihr folgenden Abschnitt findet:

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
#       include snippets/fastcgi-php.conf;
#
#       # With php5-cgi alone:
#       fastcgi_pass 127.0.0.1:9000;
#       # With php5-fpm:
#       fastcgi_pass unix:/var/run/php5-fpm.sock;
#}

Durch das Entfernen des # werden diese Zeilen aktiviert. Das ist für drei Zeilen vorzunehmen. Zusätzlich müssen noch einige Zeilen eingefügt werden, diese sind fett markiert.

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
#       include snippets/fastcgi-php.conf;
#
#       # With php5-cgi alone:
#       fastcgi_pass 127.0.0.1:9000;
#       # With php5-fpm:
fastcgi_pass unix:/var/run/php5-fpm.sock;
               fastcgi_index index.php;
               include fastcgi.conf;
}

Ebenso muss der Verweis auf php5 auf die Version php7.0 aus dem stretch-Release abgeändert werden. Siehe fett gedruckte Zeile.

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
#       include snippets/fastcgi-php.conf;
#
#       # With php5-cgi alone:
#       fastcgi_pass 127.0.0.1:9000;
#       # With php5-fpm:
fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
fastcgi_index index.php;
include fastcgi.conf;
}

Gespeichert wird mit Strg + X, Y und dann Enter drücken. Abschließend muss die Konfigurationsdatei neu geladen werden:

sudo /etc/init.d/nginx restart
sudo /etc/init.d/php7.0-fpm restart

Jetzt läuft auf dem Raspberry Pi unter Raspbian ein Nginx Server zusammen mit PHP 7.0. Viel Spaß.

Teste PHP auf dem Nginx Server

Bevor mit weiteren Projekten fortgefahren wird, ist zu testen ob PHP unter Nginx auf dem Raspberry Pi läuft. Dazu wird eine index.php im Webverzeichnis erstellt:

cd /var/www/html

sudo nano index.php

In die neue Datei ist folgende Zeile einzufügen:

<?php echo phpinfo(); ?>

Gespeichert wird mit Strg + X, Y und dann Enter drücken. Jetzt den Browser unter localhost auf dem Raspberry Pi oder der IP auf einem externen Computer neu laden. Jetzt sollten die Versionsinformationen zu PHP erscheinen.

PHP Info auf Nginx
Die PHP Informationen über den Nginx-Server (Bild: Nginx).

Persönliche Meinung

Nach der Installation von Nginx auf dem Raspberry Pi zusammen mit PHP lassen sich zahlreiche Projekte wie beispielsweise Owncloud auf dem Raspberry Pi realisieren. Damit lässt sich mit minimalem Aufwand eine Alternative zu Dropbox für Zuhause und unterwegs aufbauen.

19 Gedanken zu „Raspberry Pi: Nginx und PHP installieren und einrichten

  • 3. September 2016 um 17:37
    Permalink

    Sehr gute verständliche und ausführliche Anleitung. Klasse.

    Hat alles sehr gut geklappt – bis aufs Finale. Nachdem alles fertig war und alle Zwischenschritte funktionierten kam zum Schluss kam 502 Bad Gateway nginx/1.10.1

    Und dieses Problem bekomme ich trotz I*net Recherchen leider nicht weg.

    Antwort
    • 5. Oktober 2016 um 21:38
      Permalink

      Habe leider dasselbe Problem. Bis zuletzt eine tolle Anleitung, aber was mache ich jetzt?

      Antwort
      • 8. Oktober 2016 um 0:20
        Permalink

        Hatte das selbe Problem auch gerade. Schaut mal in der /etc/init.d/sites-available/default ob Ihr den Pfad zum PHP7.0 Sock richtig angegeben habt. Die Zeile sollte wie folgt lauten:

        fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;

        Antwort
        • 8. Oktober 2016 um 16:10
          Permalink

          Danke für Deine Hilfe, Jason. Leider ist in /etc/init.d/ kein sites-available Ordner.

          Antwort
          • 10. Oktober 2016 um 0:04
            Permalink

            Hups, mein Fehler. Gemeint war /etc/nginx/sites-available/default

        • 10. Oktober 2016 um 23:03
          Permalink

          Danke nochmal, es war tatsächlich der falsche Pfad eingetragen. Der ist nun korrigiert, hat aber leider keine Besserung ergeben.
          Die von Technik-Salamander angesprochene I-Netrecherchen haben auch bei mir nicht gefruchtet, weil ich die entsprechenden Ordner, bzw. Dateien so nicht habe.

          Antwort
          • 11. Oktober 2016 um 10:42
            Permalink

            Welche Linux-Distribution verwendest du denn? Ansonsten versuch es doch nochmal mit apt-get install php7.0 – Ich könnte mir gerne auch mal deine default-Datei anschauen, dazu müsstest du diese irgendwo hochladen. Im schlimmsten Fall wirst du den Raspberry Pi nochmal neu aufsetzen müssen. Ich verwende den Raspberry Pi Version 3 Model B mit Raspbian Jessie 4.4, vielleicht hilft das ja 🙂

  • 13. Oktober 2016 um 22:22
    Permalink

    Super Anleitung! Bei mir hat das problemlos funktioniert…

    Antwort
  • Pingback: Raspberry Pi: Owncloud Server installieren und einrichten – random brick [DE]

  • 14. November 2016 um 13:08
    Permalink

    Hallo, hab mir nach der Anleitung nginx installiert. Ich bekomme jedoch auch einen Bad Gateway. Nun würde ich ungern wieder bei Null anfangen, ich sitze schon seit Tagen an der Installation um owncloud zum fehlerfreien laufen zu bekommen. Bisher vergeblich.
    Vielleicht kannst mir bei dem 502 Fehler helfen? Wie gesagt, genau nach Anleitung.
    Danke.

    Antwort
  • 16. November 2016 um 17:03
    Permalink

    hatte auch bad gateway der fehler bei mir war in der
    fastcgi_pass unix:/var/run/php7.0-fpm.sock;
    ein php zu wenig.
    Richtig:
    fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;

    Antwort
    • 16. November 2016 um 22:05
      Permalink

      das wars bei mir leider nicht, es war ein fehlender zusätzlicher ServerName. Nun funktioniert es. ;-)))

      Antwort
  • 19. November 2016 um 20:32
    Permalink

    Hallo und vielen Dank für das gute und aktuelle Tutorial.
    Aber am Schluss scheitert es auch bei mir. Zunächst musste ich ein /php zwischen schieben. Nachdem ich dann die /var/www/html/index.nging-debian.html weggeschoben habe und nur noch die index.php drin liegt, bekomme ich die Meldung 403 Forbidden.
    Mein Ziel ist, auf dem RasPi3 eine SeafileCloud zu installieren.

    Antwort
  • 21. Dezember 2016 um 21:16
    Permalink

    Bei mir war auch der fehler.
    folgendes hat mir geholfen:
    in der datei: „/etc/nginx/sites-available/default“
    1. den pfad angepasst „fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;“
    2.hinter „server_name“ noch die ip vom raspberry eingefügt „XXX.XXX.XXX.XX;“

    Antwort
  • 20. Februar 2017 um 23:22
    Permalink

    Bei mir war der root Pfad falsch

    #root /var/www/html;
    root /usr/share/nginx/html;

    Danke für die Anleitung
    Paddy

    Antwort
  • 2. April 2017 um 17:56
    Permalink

    Hallo zusammen,

    bekomme leider den Fehler:
    Sub process /usr/bin/dpkg returned an error code (1)
    Paket nginx-full ist noch nicht konfiguriert

    Wie kann ich diesen beheben?

    Antwort
  • 7. April 2017 um 23:40
    Permalink

    Hallo,

    tolle Schritt für Schritt Anleitung. Vorher habe ich zwei andere ausprobiert. Mein Ziel ist die Installation von Tiny Tiny RSS auf einem Raspberry Pi 3.

    Das erste Tutorial, dass ich für die gesamte Installation verwendet habe, war richtig gut geschrieben und hat auch Sicherheitsaspekte für MySQL und HTTPS Zugriff berücksichtigt. Ich habe es damit aber nicht hinbekommen und nach Rücksprache mit dem Blog Betreiber erfuhr ich, dass das Tutorial für bereits erfahrene Leser gedacht ist. Wobei da die geforderten Erfahrungen liegen kann ich mir in etwa vorstellen, nachdem ich dieses Tutorial durchgearbeitet habe. Es ist mein erstes Projekt mit einem Raspi und ich verstehe, dass man auch Erfahrungen mit den Tutorials sammeln muss. Wobei ich sagen muss, dass ich es total gut finde, das es auch Leute gibt, die Tutorials für Fortgeschrittene anbieten.

    Das zweite verwendete Tutorial war auch nicht schlecht, aber lange nicht so gut wie das zuerst ausprobierte. Das lag aber vermutlich auch daran, dass es bereits aus dem Jahr 2012 war. Es hat teilweise nicht mehr funktioniert und ich habe versucht die entsprechenden Stellen mit dem ersten Tutorial auszugleichen. Das hat aber aufgrund meiner fehlenden Linux Kenntnisse auch nicht funktioniert.

    Das hier vorliegende Tutorial bearbeitet nun zunächst „nur“ die Installation des Webservers und von PHP. Aber was soll ich sagen? Es hat auf Anhieb funktioniert, dass ich zunächst die Test HTML Seite erreichte und dann auch die PHP Seite. So weit bin ich vorher gar nicht gekommen, weil ich nicht verstanden hatte, wie die Skripte funktionieren. Vor allem dieser Part hat mir hier sehr gut gefallen. Insgesamt ist das Tutorial sehr gut geschrieben, auch für den Laien.

    Ich habe viel gelernt. Wie gesagt, vor allem auch über die Konfigurations Dateien. Danke dafür 🙂

    Zwenn

    PS: Alle von Euch, die z.B. die genannten Befehle abtippen … Das könnt ihr Euch einfacher machen. Kopiert die Zeilen, die Ihr als Befehl auf der Konsole braucht (ich verwende PuTTY unter Windows 10) oder als ergänzende Zeile für ein Skript oder ein ganzes Skript. Einfügen könnt Ihr den kopierten Teil dann einfach mit der rechten Maustaste auf dem Konsolenfenster von PuTTY. In Skripten müsst Ihr zuzvor den grünen Klotz Cursor mit der den Pfeiltasten an die richtige Stelle bewegen und ggf. eine Leerzeile mit Enter einfügen.

    Antwort
  • 18. April 2017 um 7:03
    Permalink

    Ich hatte vorher schon NginX auf einem anderen System im Betrieb. Gehe ich nach deiner Anleitung vor bzw. nehme die Config / ändere sie ab dann läuft er nicht. Ihr / Du könnt gern meine nehmen, ist auch ein wenig erweitert und getweakt und leif vorher bei mir auf einem anderen System. Mfg

    server {
    listen 80; ## listen for ipv4; this line is default and implied
    listen [::]:80 default ipv6only=on; ## listen for ipv6
    access_log off;

    root /var/www;
    index index.php index.html index.htm;

    # Make site accessible from http://localhost/
    server_name debian;

    location ~* \.html$ {
    expires -1;
    }

    #location ~* \.(css|js|gif|jpe?g|png)$ {
    # expires 168h;
    # add_header Pragma public;
    # add_header Cache-Control „public, must-revalidate, proxy-revalidate“;
    #}

    location ~* \.(jpg|jpeg|gif|png|css|js|ico|xml)$ {
    access_log off;
    log_not_found off;
    expires 30d;
    }

    location / {
    # First attempt to serve request as file, then
    # as directory, then fall back to index.html
    try_files $uri $uri/ /index.html;
    }

    location /doc {
    root /usr/share;
    autoindex on;
    allow 127.0.0.1;
    deny all;
    }

    location /images {
    root /usr/share;
    autoindex off;
    }

    #error_page 404 /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
    root /usr/share/nginx/www;
    }

    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    #location ~ .php$ {
    # proxy_pass http://127.0.0.1;
    #}

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    location ~ .php$ {
    fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
    #fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param SCRIPT_NAME $fastcgi_script_name;

    fastcgi_buffer_size 128k;
    fastcgi_buffers 256 16k;
    fastcgi_busy_buffers_size 256k;
    fastcgi_temp_file_write_size 256k;
    }

    # deny access to .htaccess files, if Apache’s document root
    # concurs with nginx’s one
    #
    location ~ /.ht {
    deny all;
    }
    }

    Antwort

Kommentar verfassen