kaffeeringe.de

Entwicklungssserver: nginx und PHP auf dem Raspberry Pi

nginx + PHP auf Raspberry Pi
nginx + PHP auf Raspberry Pi

WordPress Entwickler Mark Jaquith erzählt in seinem Vortrag „Scaling, Servers, and Deploys — Oh My!“ davon, wie er eine Leistungsfähige Webserver-Umgebung mit nginx („Engine-X„) aufgebaut hat. Nginx soll dabei wesentlich weniger Ressourcen verbrauchen als Apache. Nach meinen Erfahrungen mit dem Apache auf meinem Raspberry Pi, die sich mit APC nur teilweise lösen ließen, dachte ich, dass nginx dem Minirechner vielleicht Beine machen könnte.

Der Vortrag von Mark Jaquith hat mich dazu inspririert, dass der Rapsberry Pi vielleicht ein ganz guter, lokaler Entwicklungsserver sein könnte. Zum Einen habe ich ungerne lauter Server-Dienste auf meinem Desktoprechner im Hintergrund laufen. Zum Anderen kann ich auf dem Minirechner auch einfach mal Sachen ausprobieren und wenn es nicht klappt, mach ich ihn einfach wieder platt.

Webserver: nginx + PHP5

Zwei Dinge brauche in zunächst:

  1. Den eigentlichen Webserver: nginx
  2. Etwas, das PHP in Webseiten verwandelt. Das ist PHP-FPM

Nginx liefert ausschließlich statische Inhalte aus. PHP-Aufgaben gibt nginx weiter an den PHP „FastCGI Process Manager“ – der erzeugt aus PHP statisches HTML und gibt das zurück an nginx zur Auslieferung.

Zunächst solltest Du noch Dein System auf den aktuellen Stand bringen:

1
2
apt-get update
apt-get upgrade

Dann geht es los:

1
2
3
4
5
6
7
sudo apt-get install nginx php5-fpm php5-cgi php5-cli php5-common
sudo useradd www-data
sudo groupadd www-data
sudo usermod -g www-data www-data
sudo mkdir /var/www
sudo chmod 775 /var/www -R
sudo chown www-data:www-data /var/www

Dann muss man den Server konfigurieren:

1
sudo nano /etc/nginx/sites-enabled/default

Folgende Konfiguration sollte eigentlich direkt funktionieren und kann direkt überkopiert werden. Eine toller Einstieg in die Konfiguration von nginx gibt übrigens die Wiki-Seite bei ubuntuusers.de.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
server {
listen 80;
root /var/www;
index index.html index.php;
server_name localhost;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}

Wenn Du jetzt im Browser die IP (zB http://192.168.1.99) Deines Raspi aufrufst, sollte der sich mit nginx melden. Dein Webserver-Verzeichnis ist /var/www – wenn Du dort eine Datei info.php anlegst und dort hinein schreibst:

1
<? phpinfo();

Dann kannst Du diese Datei im Browser aufrufen: http://192.168.1.99/info.php – Dann solltest Du eigentlich eine Übersicht all Deiner PHP Einstellungen bekommen.

MySQL – Die Datenbank

Nun musst Du ein Datenbank-System installieren, damit Du zum Beispiel WordPress oder ownCloud installieren kannst:

1
sudo apt-get install mysql-server php5-mysql

Damit installierst Du MySQL und die nötige Brücke, damit PHP auf die Datenbank zugreifen kann. Während der Installation wirst Du nach einem Passwort gefragt. Mit diesem Passwort kannst Du später Datenbanken anlegen, ändern und löschen.

Lade einmal die info.php in Deinem Browserfenster und such mal nach „mysql“ – Du solltest da jetzt einen Treffer haben.

Ich würde Dir jetzt raten, phpMyAdmin zu installieren, damit Du bequem Datenbanken und Benutzer anlegen kannst. Das habe ich leider nicht über die Konsole hinbekommen. Es gibt – anders als zum Beispiel bei WordPress – keinen Link, der immer auf die aktuellste Version zeigt. Deswegen ist das nicht so leicht:

  1. Lade die aktuelle Version von phpMyAdmin herunter.
  2. Entpack sie.
  3. Binde den PI in Nautilus an. Mach dazu ein neues Dateifenster in Ubuntu auf und gibt in die Adresszeile sftp://pi@192.168.1.99/ und drück Enter.
  4. Du wirst dann nach Deinem Pi-Passwort gefragt.
  5. Danach kannst Du auf die Verzeichnisse Deines Pi zugreifen. Wechsel in /var/www/
  6. Leg ein Verzeichnis phpMyAdmin an.
  7. Kopier die Dateien von phpMyAdmin dort hinein.

Wenn Du das gemacht hast, kannst Du unter http://192.168.1.99/phpMyAdmin darauf zugreifen. Du wirst nach Benutzernamen und Passwort gefragt. Das sind die Daten, die Du bei der Installation von MySQL angegeben hast.

Jetzt kannst Du dort einen neuen User anlegen und dem eine neue Datenbank einrichten. phpMyAdmin macht das in einem Schritt.

Installier mit diesen Daten WordPress. Wenn Du damit fertig bist, wirst Du feststellen, dass das WordPress läuft… aber nicht gerade rennt…

Performance: APC, Memcached, Varnish

Erstaunlich finde ich, dass in der Prozessliste, nginx fast nicht auftaucht. Sicher – der kümmert sich nur um die paar Bilder, JavaScripte und CSS-Dateien. Aber Apache war da immer fleißig dabei. In der Liste steht jetzt nur die PHP-Engine. Und genau da kann man ansetzen: Aus PHP-Dateien lassen sich statische Dateien cachen und Daten können zwischengespeichert werden.

Mit APC wird der kompilierte PHP-Quelltext zwischengespeichert. Varnish ist ein Reverse Proxy, der den Webserver entlastet und Memcached hält Daten im Speicher:

1
sudo apt-get install php-apc varnish memcached php5-memcache

Im „WordPress on Raspberry Pi“ Blog gibt es eine Varnish-Config:

1
sudo nano /etc/varnish/piwordpress.vcl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
backend default {
.host = "127.0.0.1";
.port = "81";
}
acl purge {
"localhost";
}

sub vcl_recv {
if (req.request == "PURGE") {
if (!client.ip ~ purge) {
error 405 "Not allowed.";
}
return(lookup);
}
if (req.url ~ "^/$") {
unset req.http.cookie;
}
}
sub vcl_hit {
if (req.request == "PURGE") {
set obj.ttl = 0s;
error 200 "Purged.";
}
}
sub vcl_miss {
if (req.request == "PURGE") {
error 404 "Not in cache.";
}
if (!(req.url ~ "wp-(login|admin)")) {
unset req.http.cookie;
}
if (req.url ~ "^/[^?]+.(jpeg|jpg|png|gif|ico|js|css|txt|html|htm)(\?.|)$") {
unset req.http.cookie;
set req.url = regsub(req.url, "\?.$", "");
}
if (req.url ~ "^/$") {
unset req.http.cookie;
}
}
sub vcl_fetch {
if (req.url ~ "^/$") {
unset beresp.http.set-cookie;
}
if (!(req.url ~ "wp-(login|admin)")) {
unset beresp.http.set-cookie;
}
}

Und dann noch diese Config.

1
sudo nano /etc/varnish/varnish

Im WordPress on Raspberry Pi“ Blog steht, dass man folgendes ab ca. Zeile 46 ersetzen soll. Bei mir war die Datei aber leer. Deswegen hab ich das einfach so eingefügt – und es lief danach:

1
2
3
4
5
DAEMON_OPTS="-a 127.0.0.1:80 \
-T localhost:6082 \
-f /etc/varnish/piwordpress.vcl \
-S /etc/varnish/secret \
-s file,/var/lib/varnish/$INSTANCE/varnish_storage.bin,1G"

Schau mal nach: info.php sollte Dir anzeigen, dass memcached, APC und Varnish installiert sind und zur Verfügung stehen.

Nun kannst Du nginx noch dazu bringen, gzip zu nutzen. Dazu musst Du die Konfiguration bearbeiten:

1
sudo nano /etc/nginx/nginx.conf
1
2
3
4
5
6
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_types text/plain text/css application/json

Zum Abschluss solltest Du den Webserver und PHP einmal neu starten:

1
2
sudo service nginx restart
sudo service php5-fpm restart

Jetzt muss Dein WordPress lernen, mit der Umgebung ordentlich zusammen zu arbeiten. Du brauchst dazu zwei Plugins:

  • nginx Compatibility
  • W3 Total Cache

„nginx Compatibility“ benötigt keine weitere Konfiguration. Bei W3 Total Cache musst Du drei Dinge einschalten und einstellen:

  1. Page Cache: memcached
  2. Object Cache: APC
  3. Varnish: 127.0.0.1

Danach sollte Dein WordPress mit einer einigermaßen ordentlichen Geschwindigkeit laufen.

Ausblick

Mal sehen, wie es jetzt weiter geht. Es wäre im nächsten Schritt schon einmal gut, wenn ich das Theme in ein Git bekäme und aus dem Git auf die Live-Seite.

Allerdings finde ich die Performance immer noch nicht soo großartig. Vielleicht hilft es ja auch, wenn ich das Webroot-Verzeichnis nicht mehr auf der SD-Karte mit dem System habe. Dann würde ich erst einmal wieder eine externe Festplatte anklemmen.

Hat sonst noch jemand Performance-Tipps?

Links

Pingbacks

  1. Raspberry als Schaltzentrale (Teil 2) | einfach-dirk.de

Kommentare

Steffen Voß

Huch. Ich stell gerade fest, dass die WordPress-Installation sau-schnell auf dem Raspi ist, wenn man nicht eingeloggt ist!

Das ist natürlich sinnvoll, dass Admins keine umfangreich gecachten Seiten zu sehen bekommen. Die Frage ist, ob man damit trotzdem Theme-Entwicklung machen kann. Da ist ja auch wichtig, dass die Seiten immer frisch sind.

Finn Malte Hinrichsen

Interessanter Artikel! Wie wäre es mit einem git-wrapper-Script, der neben dem eigentlichen git commit oder pull einen Seitenrefresh für Varnish auslöst? Ein Varnish refresh Script gibt es hier: http://giantdorks.org/alain/a-shell-script-to-refresh-a-single-page-in-varnish-cache/

Robert Katzki

Ich hab vor einiger Zeit auch eine minimale Anleitung zur Installation und Einrichtung von php-fpm geschrieben: http://katzki.de/journal/nginx-and-php-fpm/

Empfehlenswert sind noch die TIpps von if !1 0: http://www.if-not-true-then-false.com/2011/nginx-and-php-fpm-configuration-and-optimizing-tips-and-tricks/

Jonathan

@Finn: Sowas wollte ich auch gerade vorschlagen.

Erst gestern hab ich WordPress hinter nginx installiert für ein kleines Podcastprojekt. War schon etwas nervig. Finde es gut, dass du die Sache hier mal Schritt für Schritt beschrieben hast!

Thomas

Wie wäre es denn mit sqlite statt mysql?

Markus

Ich habe auf den RaspberryPi auch gerade für ein Projekt einen nginx mit python und sqlite eingebaut, der später mal eine django-app ausliefern soll. Der Anwendungsserver hinter nginx ist dabei gunicorn. Klappt super.

Olaf

Mir ist ehrlich gesagt nicht klar, ob varnish bei dir wirklich sauber läuft. nginx startest du auf Port 80, in der varnish-config trägst du aber Port 81 als backend server ein, wie soll da varnish als proxy funktionieren? Ich habe es bei mir mal andersrum probiert, bin aber auf probleme gestoßen: Varnish schreibt Fehlermeldungen ins syslog, nach dieser Seite: http://www.raspberrypi.org/phpBB3/viewtopic.php?t=24249&p=322920 müsste man varnish wohl selber kompilieren, die Installation über apt-get scheint auf dem pi noch nicht zu gehen. Die von dir vermisste Konfiguration (/etc/varnish/varnish) habe ich unter /etc/defaults/varnish gefunden.

Steffen Voß

Oh, danke für den Hinweis. Da muss ich bei Gelegenheit mal schauen.

Fetz

Hallöchen,

habe mal alle Schritte zum einrichten von php und nginx befolgt. Hat super geklappt. Aus eigener Erfahrung raus kann ich dir noch sagen, dass es mittlerweile mithilfe von sudo apt-get install phpmyadmin möglich ist, das ganze via Konsole zu installieren.

Den Rest werde ich dann morgen machen, ich hoffe das klappt genauso gut. Danke dir.

Fetz

Da War ich wohl zu schnell. Habe bisher das ganze nu runter Apache gemacht und gerade nicht bedacht, dass die konfiguration fehlshclagen könnte… dann werd ich nun wohl auch den von dir beschriebenen weg gehen.

benny

ACHTUNG: Bei aktuellen nginx-Versionen kann es zu einemProblem kommen. Die hier gezeigte Konfigurationsdatei ist etwas veraltert, denn bei neueren Versionen liegt das Verzeichnis mit den html-Dokumenten unter /var/www/html, nicht unter /var/www.
Die Konfigurationsdatei heißt also richtig so:
server {
listen 80;
root /var/www/html;
index index.html index.php;
server_name localhost;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}

Bei mir gab es deshalb Probleme.

Schreibe einen Kommentar

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

Möchtest Du benachrichtigt werden, wenn Dir hier jemand antwortet?