Banana Pi – install Nginx, MySQL and PHP5

Whether you want to run OwnCloud, Baikal or WordPress on the Banana Pi – you will need a web server, MySQL and PHP. I have decided to use Nginx as web server, since it is very resource-friendly compared to Apache. And it is also known for its performance and stability.

This combination is known as LEMP: L inux + nginx(pronounced „engine x“) + MySQL + PHP.

1. install Nginx

 apt-get install nginx 

Now start the server with

/etc/init.d/nginx start

and test whether it works. To test enter the address of the Banana Pi in the browser and if everything went right, you should see the following screen:

Startbild Nginx

2. install MySQL

 apt-get install mysql-server 

During installation you will be prompted to set the password for the MySQL user „root“. It is recommended to do that.

3. install PHP

To get PHP running under Nginx, PHP-FPM needs to be installed, an alternative FastCGI implementation (FPM = FastCGI Process Manager).
PHP-FPM starts a FastCGI server on the socket /var/run/php5-fpm.sock.

 apt-get install php5-fpm 

To make PHP working with MySQL, the package

 apt-get install php5-mysql 

must be installed

To speed up PHP, it is recommended to set up a cache, where already compiled PHP pages are stored and made available when required. For this the package

 apt-get install php-apc 

is installed.

To make PHP pages running with Nginx, a few settings need to be adjusted.

4. configure Nginx
For this, the file /etc/nginx/sites-available/default needs to be be adjusted.
The use of PHP is already prepared there and the corresponding lines only need to be commented out.

	listen   80; ## listen for ipv4; this line is default and implied
	#listen   [::]:80 default_server ipv6only=on; ## listen for ipv6

.....

	location ~ \.php$ {
		fastcgi_split_path_info ^(.+\.php)(/.+)$;
		# NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
	
		# With php5-cgi alone:
	#	fastcgi_pass 127.0.0.1:9000;
		# With php5-fpm:
		try_files $uri $uri/ /index.php?$uri&$args;
		fastcgi_pass unix:/var/run/php5-fpm.sock;
		fastcgi_index index.php;
		include fastcgi_params;
	}

In the PHP-block the line try_files $uri $uri/ /index.php?q=$uri&$args; should be added.
And since PHP-FPM is installed, make sure that the line fastcgi_pass 127.0.0.1:9000; is commented out.

And as last thing, as it is recommended in „NOTE“, set the „cgi.fix_pathinfo“ parameter to 0 in the php.ini file.

nano /etc/php5/fpm/php.ini

....

; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI.  PHP's
; previous behaviour was to set PATH_TRANSLATED to SCRIPT_FILENAME, and to not grok
; what PATH_INFO is.  For more information on PATH_INFO, see the cgi specs.  Setting
; this to 1 will cause PHP CGI to fix its paths to conform to the spec.  A setting
; of zero causes PHP to behave as before.  Default is 1.  You should fix your scripts
; to use SCRIPT_FILENAME rather than PATH_TRANSLATED.
; http://php.net/cgi.fix-pathinfo
cgi.fix_pathinfo=0

To make NginX work with the new settings it needs to be restartet with

/etc/init.d/nginx restart 

( Thanks to Jos Poortvliet for pointing this out )

If you want to test whether PHP is running correctly, you can create a file in the document root of Nginx that provides all information about the PHP configuration when called.

nano /usr/share/nginx/www/info.php

The contents of the file is.

<?php
phpinfo();
?>

If you call this file with the browser, the following output should appear:
Ausgabe phpinfo

57 Gedanken zu “Banana Pi – install Nginx, MySQL and PHP5

  1. Hi,

    woher kriege ich dieses Nginx und muss ich es auf die SD Karte installieren, wo bananian drauf war die wir in der anleitung davor auf die festplatte verschoben haben?

    • Hallo Hans

      Dieses NginX bekommst du wie oben im Artikel beschrieben auch über den Paketmanager apt .. Einfach den Befehl „apt-get install nginx“ eingeben und das wars.
      Wenn das System schon auf die Festplatte verschoben wurde, wird das Paket dann auch auf der Festplatte installiert. Darum muss man sich dann nicht mehr kümmern.

      Ich hoffe, das hilft dir weiter

      Gruß Bjoern

  2. Hi,
    thanks for this. In my nginx installation the nginx root Directory is named ‚html‘ not ‚www‘, so I put the info.php skript there.

    Thomas

  3. Prima Anleitung und auch einfach nachzuvollziehen. Vielen Dank.
    Bei lief nginx und gabe die Testseite aus. Allerdings bekam ich beim Aufruf von info.php „Fehler: Verbindung fehlgeschlagen“ – hast du einen Tipp, woran das liegen könnte? (Habe alle Befehle und Inhalte von Dateien mithilfe der Zwischenablage übertragen, also sollte keine Eingabefehler passiert sein.)

    • Das lässt hoffen .. 😉

      Also wenn NginX läuft und PHP nicht klappt läuft vermutlich der php-fpm nicht oder NginX hat die Konfiguration nicht übernommen.

      Einfach mal beides neu starten mit

      /etc/init.d/php-fpm restart
      /etc/init.d/nginx restart

      Siehe dazu auch den ersten Kommentar. Das sollte dann reichen.

      Gruß Bjoern

  4. Hallo Bjoern,

    ich habe ein Problem bei der Ausgabe der PHP Info auf dem Browser.
    Eingabe im Browser: 192.168.179.103/info.php
    Ausgabe im Browser: >?php phpinfo(); ?>
    Keine Fehlermeldung bei:
    /etc/init.d/php-fpm restart
    /etc/init.d/nginx restart
    Hast du eine Idee in welcher Konfigurationsdatei ich noch mal nachschauen soll?

    ( Ich bin ein absoluter Neuling in Sachen Banana pi und Linux )

    Viele Grüße
    Joachim

    • Hallo Joachim

      Das sieht aus, als wenn PHP nicht interpretiert wird. Ich vermute stark, dass du dir dir Datei(en) von NginX nochmal anschauen solltest im Ordner /etc/nginx/sites-available/. Wenn du da sonst noch nichts gemacht hast, sollte die da nur die Datei „default“ drin sein.
      Dort muss sichergestellt sein, dass php an php-fpm weitergereicht wird.

      Wenn du php-fpm nutzt, sollte diese Datei folgenden Eintrag haben:

      location ~ \.php$ {
      		fastcgi_split_path_info ^(.+\.php)(/.+)$;
      		try_files $uri $uri/ /index.php?$uri&$args;
      		fastcgi_pass unix:/var/run/php5-fpm.sock;
      		fastcgi_index index.php;
      		include fastcgi_params;
      	}
      

      Dann sollte das eigentlich weiter kein Problem sein …

      Meld dich einfach noch mal, wenn es trotzdem nicht klappt.

      Gruß Bjoern

  5. Hallo Bjoern

    Das haut immer noch nicht hin.
    Ich vermute ich habe da einen Eingabefehler, oder beim editieren was gelöscht.
    kannst du mir die gesammte Datei mal zumailen, damit ich mal vergleichen kann?

    Danke

  6. When loading my-ip/php.info I only get „Welcome to nginx!“
    Restartet nginx und php-fpm but still no change…

    • Hey Stokel

      Try to rename your file to info.php, bacause nginx is working with some kind of regular expressions and as you can see in the line
      location ~ \.php$ { … }
      only files with the ending *.php are send to the php-fpm socket.

      I think, this will help

      Bjoern

  7. Thanks, now I feel stupid. 😛
    Got another problem with setting up seafile. I’ll try to fix it myself and if I’m unable to do so, you’ll hear from me in the other tutorial. 😉

  8. Hi Bjoern,

    vielen Dank für die ausführliche Anleitung.
    Trotzdem bin ich bei der Installation von nginx nicht weitergekommen.
    Bei Aufruf „http://192.168.1.104/info.php“ bekomme ich die Fehlermeldung „500 Internal Server Error“ angezeigt.

    Ein „/etc/init.d/php-fpm restart“
    gibt die Meldung „zsh: correct ‚/etc/init.d/php-fpm‘ to ‚/etc/init.d/php5-fpm‘ [nyae]?“

    Hast Du bitte einen Tip zu weitersuchen, ev. die Datei „/etc/nginx/sites-available/default“ damit ich nochmals vergleichen kann.

    Danke im voraus.

    Gruss Soehnke

    • Hey Soehnke

      Entschuldige die späte Antwort – hab gerade ein wenig zu viel um die Ohren ..

      Also zum einen heißt es wirklich /etc/init.d/php5-fpm restart

      Und die Basis default für NginX steht oben im Artikel – wenn die so kopierst, sollte das eigentlich schon so laufen.

      Gruß Bjoern

  9. Hi Bjoern,

    Danke für Deine Antwort.

    Ich habe versucht akribisch Deine Anleitung umzusetzen (copy-paste), es läuft leider nicht:

    rufe ich server/info.php auf bleibt der Bildschirm leer und in nginx/error.log erfolgt kein Eintrag, rufe ich server/info oder eine andere nicht existierende Datei auf
    so erhalte ich die Fehlermeldung 404 von Nginx und im error.log: *1 open() „/var/www/html/info“ failed (2: No such file or directory) …

    Hast Du bitte einen Tip wo&wie ich weitersuchen kann.

    Danke

    Gruss Soehnke

  10. Hi Bjoern,

    sorry, hätte ich ja gleich dazu posten können …
    die letzten Einträge …

    [27-Aug-2015 13:52:36] NOTICE: fpm is running, pid 1275
    [27-Aug-2015 13:52:36] NOTICE: ready to handle connections
    [27-Aug-2015 13:52:36] NOTICE: systemd monitor interval set to 10000ms
    [27-Aug-2015 14:24:48] NOTICE: Finishing …
    [27-Aug-2015 14:24:48] NOTICE: exiting, bye-bye!
    [27-Aug-2015 14:25:41] NOTICE: configuration file /etc/php5/fpm/php-fpm.conf test is successful

    [27-Aug-2015 14:25:41] NOTICE: fpm is running, pid 1291
    [27-Aug-2015 14:25:41] NOTICE: ready to handle connections
    [27-Aug-2015 14:25:41] NOTICE: systemd monitor interval set to 10000ms
    [27-Aug-2015 15:07:58] NOTICE: Finishing …
    [27-Aug-2015 15:07:58] NOTICE: exiting, bye-bye!
    [27-Aug-2015 15:07:59] NOTICE: fpm is running, pid 2078
    [27-Aug-2015 15:07:59] NOTICE: ready to handle connections
    [27-Aug-2015 15:07:59] NOTICE: systemd monitor interval set to 10000ms
    [27-Aug-2015 18:33:01] NOTICE: Finishing …
    [27-Aug-2015 18:33:01] NOTICE: exiting, bye-bye!
    [27-Aug-2015 18:33:01] NOTICE: fpm is running, pid 2364
    [27-Aug-2015 18:33:01] NOTICE: ready to handle connections
    [27-Aug-2015 18:33:01] NOTICE: systemd monitor interval set to 10000ms

    Gruß
    Soehnke

  11. Hi Bjoern,

    sorry, hätte ich gleich kopieren können …
    die letzten Zeilen:
    [27-Aug-2015 18:33:01] NOTICE: Finishing …
    [27-Aug-2015 18:33:01] NOTICE: exiting, bye-bye!
    [27-Aug-2015 18:33:01] NOTICE: fpm is running, pid 2364
    [27-Aug-2015 18:33:01] NOTICE: ready to handle connections
    [27-Aug-2015 18:33:01] NOTICE: systemd monitor interval set to 10000ms

    Gruß

    Soehnke

  12. Hallo Bjoern,
    ich habe den gleichen Fehler wie Soehnke…
    Habe alles nach deiner Anleitung gemacht und mehrfach überprüft…
    Die php-Seiten bleiben weiß und es gibt keinen Fehlereintrag in den logs.
    php5-fpm und nginx wurden restartet…

    Gibt’s hierfür bereits eine Lösung?

  13. Bei meinen Recherchen zu dem Problem mit php5-fpm, nginx und den blanken Seiten bin ich fündig geworden.

    In der Datei /etc/nginx/sites-available/default zusätzlich zum obigen Inhalt die folgende Zeile einfügen:

    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

    Damit funktioniert dann nginx im Zusammenspiel mit php5-fpm und der php-Inhalt wird dargestellt.

    Gruß
    Ralf

    • >fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

      Zusammen mit der Zeile funktioniert es unter 1604 bei mir jetzt auch :>

      Ohne die Zeile gibt z.B. der Aufruf der vorhandenen info.php ein
      leeres Browserfenster ohne alles, bei nicht existenten php-Dateien kam 500 Internal Server Error vom nginx.

  14. Hallo Ralf,
    danke für die zusätzliche Zeile:
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

    Ich hatte das selbe Problem und jetzt läuft’s
    Gruß
    Günter

  15. Hi, ich komme irgendwie nicht weiter. Ich habe den zweiten Befehl: apt-get install nginx ausgeführt, bis er an den Punkt gelangt: After this operation, 14.7 MB of additional disk space will be used.
    Do you want to continue? [Y/n]
    Dann drücke ich auf YES und bekomme die Meldung:
    Err http://ftp.de.debian.org/debian/ jessie/main libxml2 armhf 2.9.1+dfsg1-5
    404 Not Found
    Err http://ftp.de.debian.org/debian/ jessie/main libpng12-0 armhf 1.2.50-2+b2
    404 Not Found
    Err http://ftp.de.debian.org/debian/ jessie/main libfreetype6 armhf 2.5.2-3
    404 Not Found
    E: Failed to fetch http://ftp.de.debian.org/debian/pool/main/libx/libxml2/libxml2_2.9.1+dfsg1-5_armhf.deb 404 Not Found

    E: Failed to fetch http://ftp.de.debian.org/debian/pool/main/libp/libpng/libpng12-0_1.2.50-2+b2_armhf.deb 404 Not Found

    E: Failed to fetch http://ftp.de.debian.org/debian/pool/main/f/freetype/libfreetype6_2.5.2-3_armhf.deb 404 Not Found

    E: Unable to fetch some archives, maybe run apt-get update or try with –fix-missing?

    Was kann ich machen?

    • Hey Rob ..

      Eigentlich teht es schon da – da hilt ein
      apt-get update
      weiter. Wenn die Paketliste lange nicht aktualisiert wurde, versucht er manchmal, alte, nicht mehr aktuelle Pakete runter zu laden.

      Damit solltest du weiter kommen.

      Gruß Bjoern

  16. Ok, bin weitergekommen, jetzt bin ich hier:

    nano /usr/share/nginx/www/test.php

    Der Inhalt der Datei ist

    Ich füge den Text ein und will speichern, aber leider sagt er mir:

    Error writing /usr/share/nginx/www/test.php: No such file or directory ]
    Ich gehe davon aus, dass ich eine Datei vorher erstellen muss, um den Text dort zu speichern. Nur wie mach ich das?

    • Nochmal Hallo

      Nein, das musst du eigentlich nicht. Mit

      nano /usr/share/nginx/www/test.php

      wird die Datei erstellt, falls sie nicht vorhanden ist. Ich vermute, dass irgendwas an dem Pfad nicht stimmt – also schon vor /…./ test.php.
      Es kann sein, dass bei den neueren nginx-Versionen ein anderer Pfad als document-root genutzt wird.

      Schau daher bitte mal in die Datei
      /etc/nginx/sites-available/default

      Dort siehst du in dem Eintrag:
      root /…
      welches Verzeichnis er als Standardverzeichnis nutzt. Dort musst du dann deine PHP-Datei anlegen.

      Gruß Bjoern

  17. Jetzt habe ich das Problem, dass eine leere Seite angezeigt wird. Ich habe leider kein Bild mit diesen schönen Infos. Habe nochmal alles gecheckt, aber leider funktioniert es nicht. Zumindest zeigt er mir keinen Fehler, aber eben eine leere Seite.

  18. Hallo zusammen! Erstmal vielen Dank für die ausführlichen Erklärungen hier 🙂 Ich spiele mich gerade als vollkommener Linux-Newbie mit dieser Anleitung auf meinem bananapi herum. Dabei steh ich jetzt vor folgenden Problemen:
    Nachdem ich die default-Datei wie oben beschrieben abgeändert habe, startet nginx nicht mehr. Das log sagt:
    [emerg] 7903#0: unknown directive „fastcgi_slpit_path_info“ in /etc/nginx/sites-enabled/default:46
    Was hab ich hier vergessen zu konfigurieren?

    Ausserdem kennt er restart nicht, nur stop und start … ?
    LG, Michi

  19. Und gleich noch einmal ich – ein weiterer Error ist aufgetaucht:
    [emerg] 9401#0: „try_files“ directive is duplicate in /etc/nginx/sites-enabled/default:52

    LG, Michi

  20. So, und erneut my 5 cent 😉
    Ich glaube, ich hab’s gefunden … google sei Dank. Folgende Zeilen im default-file nach dem Eintrag „include fastcgi_params;“ haben bei mir dann die Probleme behoben:

    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param PATH_INFO $fastcgi_path_info;
    fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;

    LG, Michi

  21. Hey Michi

    Vielen Dank für Dein Feedback. Ich muss mal schauen, ob neuere NGinX-Versionen vielleicht andere Einstellungen benötigen.
    Ansonsten sind das hier die Einstellungen, mit denen es bei mir läuft.

    Aber freut mich, dass es bei Dir dann auch geklappt hat.
    Hast du vielleicht Lust, deine komplette Konfig-Datei hier zu posten, damit Andere sich vielleicht daran orientieren können?

    Gruß Bjoern

  22. Guten Morgen Bjoern,
    ich weiß nicht, ob das sinnvoll ist – ich kenn mich unter Linux nicht wirklich aus und bin übrigens noch auf ein anderes Problem gestossen. Es läuft zwar alles inkl. owncloud, aber bei der php-Konfiguration dürfte etwas nicht stimmen, da der Aufruf von info.php einen 500er Error liefert. Das Log sagt:

    [error] 1745#0: *235 rewrite or internal redirection cycle while internally redirecting to „/index.php“, client: xxx.xxx.xxx.xxx, server: _, request: „GET /info.php HTTP/1.1“, host: „xxx.xxx.xxx.xxx“
    [error] 1747#0: *223 open() „/var/secure/favicon.ico“ failed (2: No such file or directory), client: xxx.xxx.xxx.xxx, server: , request: „GET /favicon.ico HTTP/1.1“, host: „xxx.xxx.xxx.xxx“
    [error] 1747#0: *223 open() „/var/secure/favicon.ico“ failed (2: No such file or directory), client: xxx.xxx.xxx.xxx, server: , request: „GET /favicon.ico HTTP/1.1“, host: „xxx.xxx.xxx.xxx“
    [error] 1747#0: *289 rewrite or internal redirection cycle while internally redirecting to „/index.php“, client: xxx.xxx.xxx.xxx, server: _, request: „GET /info.php HTTP/1.1“, host: „xxx.xxx.xxx.xxx“

    Was da jetzt genau in der Konfig nicht stimmt … ich habe keine Ahnung 🙂

    LG, Michi

    • Hey Michi

      Das scheint kein Problem mit der PHP-Konfig zu sein, denn sondern das kommt von deinem Webserver.
      Irgendwas scheint mit deinen Document-Roots noch nicht so ganz zu stimmen.

      Hast du die Document-Root für alle Dateien in /etc/nginx/sites-available angepasst?

      Gruß Bjoern

  23. Hi Bjoern,
    melde mich noch einmal, um die php-Geschichte von meiner Seite her hier abzuschließen. Alles genau lesen hilft oft weiter – es steht so gut wie alles bereits in den Kommentarten hier 🙂

    Die eine zusätzliche Zeile im default-file wurde oben bereits von Ralf erwähnt.+
    Und der Pfad für das info.php-file hat sich ebenfalls erledigt. Dein ursprünglicher mit /usr/share/… stimmt bei mir jedenfalls nicht mit dem Pfad in der document-root überein (/var/www/html). Jetzt funktioniert der Aufruf 🙂
    Na dann, werd ich mich jetzt weiterhandeln mit den owncloud-Einstellungen.
    Dabei gibt es für mich Stolpersteine, wenn ich den Server in eine andere Domain übersiedel … irgendwo gibt es da Einstellungen zu trusted domains usw. usf. 🙂

    Mit besten Grüßen,
    Michi

    • Hey Michi

      Na wer hat denn heute schon Zeit, Artikel komplett zu lesen 😉
      Weiß nicht genau, warum, aber bei der von mir installierten Version von NginX war wirklich /usr/share/.. die Document-Root.
      In den weiteren Artikeln wird diese aber auch noch angepasst .. egal. Werde das hier mal ergänzen.

      Für den Umzug von Owncloud gibt es gute Anleitungen und die Trusted-Host Einstellungen für OC ist auch relativ einfach zu lösen .. kann mich erinnern.
      Da ich selber aber OC nicht mehr nutze, habe ich das hier nicht weiter notiert.

      Gruß Bjoern

  24. Hi Björn,
    danke für die sehr tolle Beschreibung. Auch meinen Dank an Ralf für die zusätzliche Zeile. Es ist nun alles OK.
    Ich werde mich nun mit virtuellen Hosts beschäftigen. Mal sehen, ob das auch genauso geht, wie unter Apache
    VG Angelo

  25. Hallo,
    ich habe alles auf meinem Banana M2 installiert. Der nginx ging zuerst nach der Installation in Betrieb, dann wollte ich die default-Datei entsprechend anpassen, sie sieht aber bei mir anders aus.
    Habe trotzdem versucht die Einträge laut Beschreibung zu machen, der nginx will dann aber nicht restarten (FAIL) . Wenn ich die Änderungen zurücknehme, restartet er.
    Die default-Datei (mit meinen Änderungen) sieht so aus:

    server {
    listen 80 default_server;
    listen [::]:80 default_server;
    ….
    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:
    try_files $uri $uri/ /index.php?$uri&$args;
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    fastcgi_index index.php;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param PATH_INFO $fastcgi_path_info;
    fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
    #}

    Da ist sicher etwas falsch, aber was?
    Danke im voraus für die Hilfe.
    LG
    Chris

  26. Hallo Bjoern,

    bei der Installation von php5-fpm erhalte ich folgende Fehlermeldung:

    /# apt-get install php5-fpm
    Reading package lists… Done
    Building dependency tree
    Reading state information… Done
    Package php5-fpm is not available, but is referred to by another package.
    This may mean that the package is missing, has been obsoleted, or
    is only available from another source

    E: Package ‚php5-fpm‘ has no installation candidate

    Da ich mich erst seit kurzem mit Linux beschäftige stellt sich die Frage ob es für Ubuntu 16.04 ein anderes Package gibt?

    Gruß
    Dietmar

  27. Hallo Bjoern,

    hat sich erstmal erledigt. Die Ubuntu LTS Version 16.04 muss PHP7 installieren. Wird es mal mit dieser Version versuchen.

    Gruß
    Dietmar

Schreibe einen Kommentar