kaffeeringe.de

Entwicklungssserver: nginx und PHP auf dem Raspberry Pi

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

WordPress Entwickler Mark Jaquith er­zählt in sei­nem Vortrag „Scaling, Servers, and Deploys — Oh My!“ da­von, wie er ei­ne Leistungsfähige Webserver-Umgebung mit nginx („Engine-X„) auf­ge­baut hat. Nginx soll da­bei we­sent­li­ch we­ni­ger Ressourcen ver­brau­chen als Apache. Nach mei­nen Erfahrungen mit dem Apache auf mei­nem Raspberry Pi, die si­ch mit APC nur teil­wei­se lö­sen lie­ßen, dach­te ich, dass nginx dem Minirechner viel­leicht Beine ma­chen könn­te.

Der Vortrag von Mark Jaquith hat mi­ch da­zu in­spri­riert, dass der Rapsberry Pi viel­leicht ein ganz gu­ter, lo­ka­ler Entwicklungsserver sein könn­te. Zum Einen ha­be ich un­ger­ne lau­ter Server-Dienste auf mei­nem Desktoprechner im Hintergrund lau­fen. Zum Anderen kann ich auf dem Minirechner auch ein­fach mal Sachen aus­pro­bie­ren und wenn es nicht klappt, mach ich ihn ein­fach wie­der platt.

Webserver: nginx + PHP5

Zwei Dinge brau­che in zu­nächst:

  1. Den ei­gent­li­chen Webserver: nginx
  2. Etwas, das PHP in Webseiten ver­wan­delt. Das ist PHP-FPM

Nginx lie­fert aus­schließ­li­ch sta­ti­sche Inhalte aus. PHP-Aufgaben gibt nginx wei­ter an den PHP „FastCGI Process Manager“ – der er­zeugt aus PHP sta­ti­sches HTML und gibt das zu­rück an nginx zur Auslieferung.

Zunächst soll­test Du no­ch Dein System auf den ak­tu­el­len Stand brin­gen:

1
2
apt-get up­date
apt-get up­grade

Dann geht es los:

1
2
3
4
5
6
7
su­do apt-get in­stall nginx php5-fpm php5-cgi php5-cli php5-common
su­do use­r­add www-data
su­do grou­padd www-data
su­do user­mod -g www-data www-data
su­do mkdir /var/www
su­do ch­mod 775 /var/www -R
su­do chown www-data:www-data /var/www

Dann muss man den Server kon­fi­gu­rie­ren:

1
su­do na­no /etc/nginx/sites-enabled/default

Folgende Konfiguration soll­te ei­gent­li­ch di­rekt funk­tio­nie­ren und kann di­rekt über­ko­piert wer­den. Eine tol­ler Einstieg in die Konfiguration von nginx gibt üb­ri­gens die Wiki-Seite bei ubuntuusers.de.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
ser­ver {
lis­ten 80;
root /var/www;
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;
}
}

Wenn Du jetzt im Browser die IP (zB http://192.168.1.99) Deines Raspi auf­rufst, soll­te der si­ch mit nginx mel­den. Dein Webserver-Verzeichnis ist /var/www – wenn Du dort ei­ne Datei info.php an­legst und dort hin­ein schreib­st:

Dann kann­st Du die­se Datei im Browser auf­ru­fen: http://192.168.1.99/info.php – Dann soll­test Du ei­gent­li­ch ei­ne Übersicht all Deiner PHP Einstellungen be­kom­men.

MySQL – Die Datenbank

Nun mus­st Du ein Datenbank-System in­stal­lie­ren, da­mit Du zum Beispiel WordPress oder own­Cloud in­stal­lie­ren kann­st:

1
su­do apt-get in­stall mysql-server php5-mysql

Damit in­stal­lier­st Du MySQL und die nö­ti­ge Brücke, da­mit PHP auf die Datenbank zu­grei­fen kann. Während der Installation wirst Du nach ei­nem Passwort ge­fragt. Mit die­sem Passwort kann­st Du spä­ter Datenbanken an­le­gen, än­dern und lö­schen.

Lade ein­mal die info.php in Deinem Browserfenster und su­ch mal nach „mys­ql“ – Du soll­test da jetzt ei­nen Treffer ha­ben.

Ich wür­de Dir jetzt ra­ten, ph­pMyAd­min zu in­stal­lie­ren, da­mit Du be­quem Datenbanken und Benutzer an­le­gen kann­st. Das ha­be ich lei­der nicht über die Konsole hin­be­kom­men. Es gibt – an­ders als zum Beispiel bei WordPress – kei­nen Link, der im­mer auf die ak­tu­ells­te Version zeigt. Deswegen ist das nicht so leicht:

  1. Lade die ak­tu­el­le Version von ph­pMyAd­min her­un­ter.
  2. Entpack sie.
  3. Binde den PI in Nautilus an. Mach da­zu ein neu­es 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 ge­fragt.
  5. Danach kann­st Du auf die Verzeichnisse Deines Pi zu­grei­fen. Wechsel in /var/www/
  6. Leg ein Verzeichnis ph­pMyAd­min an.
  7. Kopier die Dateien von ph­pMyAd­min dort hin­ein.

Wenn Du das ge­macht hast, kann­st Du un­ter http://192.168.1.99/phpMyAdmin dar­auf zu­grei­fen. Du wirst nach Benutzernamen und Passwort ge­fragt. Das sind die Daten, die Du bei der Installation von MySQL an­ge­ge­ben hast.

Jetzt kann­st Du dort ei­nen neu­en User an­le­gen und dem ei­ne neue Datenbank ein­rich­ten. ph­pMyAd­min macht das in ei­nem Schritt.

Installier mit die­sen Daten WordPress. Wenn Du da­mit fer­tig bist, wirst Du fest­stel­len, dass das WordPress läuft… aber nicht ge­ra­de rennt…

Performance: APC, Memcached, Varnish

Erstaunlich fin­de ich, dass in der Prozessliste, nginx fast nicht auf­taucht. Sicher – der küm­mert si­ch nur um die paar Bilder, JavaScripte und CSS-Dateien. Aber Apache war da im­mer flei­ßig da­bei. In der Liste steht jetzt nur die PHP-Engine. Und ge­n­au da kann man an­set­zen: Aus PHP-Dateien las­sen si­ch sta­ti­sche Dateien cachen und Daten kön­nen zwi­schen­ge­spei­chert wer­den.

Mit APC wird der kom­pi­lier­te PHP-Quelltext zwi­schen­ge­spei­chert. Varnish ist ein Reverse Proxy, der den Webserver ent­las­tet und Memcached hält Daten im Speicher:

1
su­do apt-get in­stall php-apc var­nish mem­cached php5-memcache

Im „WordPress on Raspberry Pi“ Blog gibt es ei­ne Varnish-Config:

1
su­do na­no /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
ba­ckend de­fault {
.host = "127.0.0.1";
.port = "81";
}
acl pur­ge {
"lo­cal­host";
}

sub vcl_recv {
if (req.request == "PURGE") {
if (!client.ip ~ pur­ge) {
er­ror 405 "Not al­lo­wed.";
}
re­turn(loo­kup);
}
if (req.url ~ "^/$") {
un­set req.http.cookie;
}
}
sub vcl_hit {
if (req.request == "PURGE") {
set obj.ttl = 0s;
er­ror 200 "Purged.";
}
}
sub vcl_miss {
if (req.request == "PURGE") {
er­ror 404 "Not in cache.";
}
if (!(req.url ~ "wp-(login|admin)")) {
un­set req.http.cookie;
}
if (req.url ~ "^/[^?]+.(jpeg|jpg|png|gif|ico|js|css|txt|html|htm)(\?.|)$") {
un­set req.http.cookie;
set req.url = reg­sub(req.url, "\?.$", "");
}
if (req.url ~ "^/$") {
un­set req.http.cookie;
}
}
sub vcl_fetch {
if (req.url ~ "^/$") {
un­set beresp.http.set-cookie;
}
if (!(req.url ~ "wp-(login|admin)")) {
un­set beresp.http.set-cookie;
}
}

Und dann no­ch die­se Config.

1
su­do na­no /etc/varnish/varnish

Im WordPress on Raspberry Pi“ Blog steht, dass man fol­gen­des ab ca. Zeile 46 er­set­zen soll. Bei mir war die Datei aber leer. Deswegen hab ich das ein­fach so ein­ge­fügt – und es lief da­na­ch:

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 soll­te Dir an­zei­gen, dass mem­cached, APC und Varnish in­stal­liert sind und zur Verfügung ste­hen.

Nun kann­st Du nginx no­ch da­zu brin­gen, gzip zu nut­zen. Dazu mus­st Du die Konfiguration be­ar­bei­ten:

1
su­do na­no /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 soll­test Du den Webserver und PHP ein­mal neu star­ten:

1
2
su­do ser­vice nginx re­start
su­do ser­vice php5-fpm re­start

Jetzt muss Dein WordPress ler­nen, mit der Umgebung or­dent­li­ch zu­sam­men zu ar­bei­ten. Du brauchst da­zu zwei Plugins:

  • nginx Compatibility
  • W3 Total Cache

„nginx Compatibility“ be­nö­tigt kei­ne wei­te­re Konfiguration. Bei W3 Total Cache mus­st Du drei Dinge ein­schal­ten und ein­stel­len:

  1. Page Cache: mem­cached
  2. Object Cache: APC
  3. Varnish: 127.0.0.1

Danach soll­te Dein WordPress mit ei­ner ei­ni­ger­ma­ßen or­dent­li­chen Geschwindigkeit lau­fen.

Ausblick

Mal se­hen, wie es jetzt wei­ter geht. Es wä­re im nächs­ten Schritt schon ein­mal gut, wenn ich das Theme in ein Git be­kä­me und aus dem Git auf die Live-Seite.

Allerdings fin­de ich die Performance im­mer no­ch nicht soo groß­ar­tig. Vielleicht hilft es ja auch, wenn ich das Webroot-Verzeichnis nicht mehr auf der SD-Karte mit dem System ha­be. Dann wür­de ich er­st ein­mal wie­der ei­ne ex­ter­ne Festplatte an­klem­men.

Hat son­st no­ch je­mand 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?