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:
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:
apt-get update apt-get upgrade
Dann geht es los:
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:
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.
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:
<? 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:
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:
- Lade die aktuelle Version von phpMyAdmin herunter.
- Entpack sie.
- 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.
- Du wirst dann nach Deinem Pi-Passwort gefragt.
- Danach kannst Du auf die Verzeichnisse Deines Pi zugreifen. Wechsel in /var/www/
- Leg ein Verzeichnis phpMyAdmin an.
- 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:
sudo apt-get install php-apc varnish memcached php5-memcache
Im „Wordpress on Raspberry Pi“ Blog gibt es eine Varnish-Config:
sudo nano /etc/varnish/piwordpress.vcl
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.
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:
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:
sudo nano /etc/nginx/nginx.conf
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:
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:
- Page Cache: memcached
- Object Cache: APC
- 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?
Schreibe einen Kommentar