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 ge­ra­de fest, dass die WordPress-Installation sau-schnell auf dem Raspi ist, wenn man nicht ein­ge­loggt ist! 

Das ist na­tür­li­ch sinn­voll, dass Admins kei­ne um­fang­reich ge­cach­ten Seiten zu se­hen be­kom­men. Die Frage ist, ob man da­mit trotz­dem Theme-Entwicklung ma­chen kann. Da ist ja auch wich­tig, dass die Seiten im­mer fri­sch sind.

Finn Malte Hinrichsen

Interessanter Artikel! Wie wä­re es mit ei­nem git-wrapper-Script, der ne­ben dem ei­gent­li­chen git com­mit oder pull ei­nen Seitenrefresh für Varnish aus­löst? Ein Varnish re­fresh Script gibt es hier: http://giantdorks.org/alain/a-shell-script-to-refresh-a-single-page-in-varnish-cache/

Robert Katzki

Ich hab vor ei­ni­ger Zeit auch ei­ne mi­ni­ma­le Anleitung zur Installation und Einrichtung von php-fpm ge­schrie­ben: http://katzki.de/journal/nginx-and-php-fpm/

Empfehlenswert sind no­ch 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 woll­te ich auch ge­ra­de vor­schla­gen.

Erst ges­tern hab ich WordPress hin­ter nginx in­stal­liert für ein klei­nes Podcastprojekt. War schon et­was ner­vig. Finde es gut, dass du die Sache hier mal Schritt für Schritt be­schrie­ben hast!

Thomas

Wie wä­re es denn mit sq­li­te statt mys­ql?

Markus

Ich ha­be auf den RaspberryPi auch ge­ra­de für ein Projekt ei­nen nginx mit py­thon und sq­li­te ein­ge­baut, der spä­ter mal ei­ne django-app aus­lie­fern soll. Der Anwendungsserver hin­ter nginx ist da­bei gu­ni­corn. Klappt su­per.

Olaf

Mir ist ehr­li­ch ge­sagt nicht klar, ob var­nish bei dir wirk­li­ch sau­ber läuft. nginx star­test du auf Port 80, in der varnish-config trägst du aber Port 81 als ba­ckend ser­ver ein, wie soll da var­nish als proxy funk­tio­nie­ren? Ich ha­be es bei mir mal an­ders­rum pro­biert, bin aber auf pro­ble­me ge­sto­ßen: Varnish schreibt Fehlermeldungen ins sys­log, nach die­ser Seite: http://www.raspberrypi.org/phpBB3/viewtopic.php?t=24249&p=322920 müss­te man var­nish wohl sel­ber kom­pi­lie­ren, die Installation über apt-get scheint auf dem pi no­ch nicht zu ge­hen. Die von dir ver­miss­te Konfiguration (/etc/varnish/varnish) ha­be ich un­ter /etc/defaults/varnish ge­fun­den.

Steffen Voß

Oh, dan­ke für den Hinweis. Da muss ich bei Gelegenheit mal schau­en.

Fetz

Hallöchen,

ha­be mal al­le Schritte zum ein­rich­ten von php und nginx be­folgt. Hat su­per ge­klappt. Aus ei­ge­ner Erfahrung raus kann ich dir no­ch sa­gen, dass es mitt­ler­wei­le mit­hil­fe von su­do apt-get in­stall ph­pmyad­min mög­li­ch ist, das gan­ze via Konsole zu in­stal­lie­ren.

Den Rest wer­de ich dann mor­gen ma­chen, ich hof­fe das klappt ge­nauso gut. Danke dir.

Fetz

Da War ich wohl zu schnell. Habe bis­her das gan­ze nu run­ter Apache ge­macht und ge­ra­de nicht be­dacht, dass die kon­fi­gu­ra­ti­on fehlsh­cla­gen könn­te… dann werd ich nun wohl auch den von dir be­schrie­be­nen weg ge­hen.

benny

ACHTUNG: Bei ak­tu­el­len nginx-Versionen kann es zu ein­em­Pro­blem kom­men. Die hier ge­zeig­te Konfigurationsdatei ist et­was ver­al­tert, denn bei neue­ren Versionen liegt das Verzeichnis mit den html-Dokumenten un­ter /var/www/html, nicht un­ter /var/www.
Die Konfigurationsdatei heißt al­so rich­tig so:
ser­ver {
lis­ten 80;
root /var/www/html;
in­dex index.html index.php;
server_name lo­cal­host;
lo­ca­ti­on / {
try_files $uri $uri/ /index.php?$args;
}
lo­ca­ti­on ~ \.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;
in­clu­de fastcgi_params;
}
}

Bei mir gab es des­halb 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?