Auch Entwickler brauchen Platz zum Spielen

31. Januar 2013 /

WordPress auf Nginx: Performance und Sicherheit optimieren

Nginx ist ein mächtiges Werkzeug. Gewusst wie, wird WordPress um ein vielfaches beschleunigt und mit ausgereiften Schutztechniken versehen.
Nginx

Im letzten Teil der Serie “WordPress auf Nginx” beschreibt das heutige Tutorial die Perfektionierung der Ausgabe an den Browser: Angefangen mit der Gzip-Komprimierung der Daten bis hin zu bevorzugten Caching-Headern für Bilder, Stylesheets und JavaScript. Zum Thema werden auch die nachhaltige Absicherung des Administrationsbereichs und der Schutz gegen unerwünschte Versuche, das WordPress-System anzugreifen.

Gzip-Aktivierung
Im Auslieferungszustand komprimiert Nginx die Ausgabe der HTML-Dateien im Gzip-Format, so dass weniger Bytes durch die Leitung an den Browser gesendet werden. Doch das ist nur die halbe Mitte, denn ein (WordPress-)Blog beinhaltet auch Stylesheets, Feeds und nicht selten zahlreiche JavaScript-Files. All diese Ressourcen können vom Webserver ebenfalls verkleinert ausgegeben werden.

Dazu müssen in der Konfigurationsdatei nginx.conf – zu lokalisieren unter /etc/nginx/ – alle Zeilen beginnend mit gzip_ einkommentiert werden. Einkommentiert bedeutet, dass das Doppelkreuz am Anfang der jeweiligen Zeilen eliminiert gehört. Und zwar:

Die Standard-Einstellung

# 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 ...

verwandelt sich in:

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 ...

Änderungen speichern, Nginx neu starten:

/etc/init.d/nginx restart

Die letzte einkommentierte Zeile listet Dateiformate auf, die Nginx Gzip-komprimiert an den Client schickt. Diese kann auf Wunsch ausgedehnt oder reduziert werden.

Nginx Gzip-Header

Caching- und Gzip-Header gesendet von Nginx

Steuerungszentrale
Im vorherigen Artikel wurde gezeigt, wie eine Konfigurationsdatei pro Server erstellt und im Nginx-Verzeichnis sites-available abgelegt wird. In unserem Beispiel heißt die Datei helpdesk.wpseo.de – diese wurde mit minimalen Eigenschaften bereits versehen. Nun ist es an der Zeit, die empfohlene Konfiguration in voller Länge zu präsentieren. Die Devise bleibt nach wie vor: Nginx optimiert für WordPress.

Server-Konfigurationsdatei

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 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
server {
## INIT
listen 80 default_server;
server_name helpdesk.wpseo.de;
 
## ROOT
root /var/www/helpdesk.wpseo.de;
## LOGS
error_log /var/log/nginx/helpdesk.error.log;
# DEFAULT INDEX
index index.php;
## SECURITY
if ( $request_method !~ ^(GET|HEAD|POST)$ ) {
return 444;
}
location ~ /(\.|wp-config.php|liesmich.html|readme.html) {
return 444;
}
## REWRITES
location ~ ^/(\d+)/$ {
return 301 /?p=$1;
}
## RESSOURCES
location ~ \.(?:ico|png|jpe?g|css|js)$ {
expires 31d;
add_header Pragma "public";
add_header Cache-Control "public, must-revalidate, proxy-revalidate";
#location ~ \.(?!ico).+$ {
# valid_referers none blocked server_names ~(wpseo.|google.|yahoo.|bing.|facebook.|fbcdn.|pinterest.);
# if ( $invalid_referer ) {
# return 444;
# }
#}
}
## REDIRECT INDEX
location / {
try_files $uri $uri/ /index.php;
}
## PHP FILES
location ~ \.php$ {
include fastcgi_params;
fastcgi_index index.php;
fastcgi_pass 127.0.0.1:9000;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
}
## AUTH ADMIN
location = /wp-login.php {
#auth_basic "Restricted";
#auth_basic_user_file /etc/nginx/htpasswd;
include fastcgi_params;
fastcgi_index index.php;
fastcgi_pass 127.0.0.1:9000;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
}
}

Erläuterungen
Die meisten Zeilen der Konfiguration kommen bekannt vor, da vorhin besprochen. Weiter geht’s mit dem Abschnitt SECURITY. An dieser Stelle werden unerlaubte Request-Methoden abgewehrt. Auch der Zugriff auf unsichtbare System- und WordPress-interne Dateien, welche möglicherweise die Nummer der eingesetzten Blogsoftware-Version verraten, wird sofort beendet. Unter REWRITES befindet sich eine Regel, die einen im Browser aufgerufenen Permalink im Format /%post_id%/ auf /?p=%post_id% per 301 Redirect umleitet.

Der Bereich RESSOURCES vereint in sich die Behandlung aller Grafik-, CSS- und JavaScript-Ressourcen. Hier wird Nginx aufgefordert, korrekte Cache-Header zu senden. Die Gültigkeit des Caching beläuft sich auf 31 Tage.

In der gleichen Abfrage für Ressourcen sind sechs Zeilen Code auskommentiert – dabei handelt es sich um einen Hotlinking-Schutz. Sind die Zeilen nachträglich einkommentiert (wie? siehe oben), so unterbindet Nginx die Einbettung eigener Ressourcen auf fremden Webseiten. So schützt man sich gegen Diebstahl von Medien. Favicons sind von der Sperre ausgeschlossen. Die Liste mit Domains ist eine Whitelist – dort sind Domains eingetragen, wo die Einbindung erlaubt ist. Wichtig: Auch die eigene Domain gehört in die Auflistung mit rein (wpseo. = exemplarisch).

Schutz des Administrationsbereichs
Aus Sicherheitsgründen wird es empfohlen, den Admin-Bereich mit einem zusätzlichen Zugang auszustatten. Genauer gesagt die Eingangstür dahin: die Datei wp-login.php (dazu passend: Mehr Sicherheit für WordPress durch den “Admin”-Schutz). Für diesen Zweck sind folgende Schritte erforderlich:

  1. Z.B. unter /etc/nginx/ eine neue Datei namens htpasswd anlegen (die Datei beinhaltet keine Punkte).
  2. Der Dateiinhalt sind die Zugangsdaten des Nutzers. Das Format wäre Nutzer:Passwort. Diese können mit dem Online-Generator erzeugt werden. Wichtig: Unter Algorithmus bitte Crypt auswählen.
  3. Passwortdatei speichern.
  4. In der Server-Konfigurationsdatei die Zeilen mit auth_basic und auth_basic_user_file einkommentieren.
  5. Nginx restarten.

Tipp zur Spam-Bekämpfung
Handelt es sich um eine CMS-Website, also um Inhalte mit abgestellten Kommentar- und XML-RPC-Funktionen, so würde es Sinn machen, die Dateien wp-comments-post.php und xmlrpc.php auf die interne Blackliste zu setzen und jede Anfrage dahin mit dem Code 444 unverzüglich zu beenden. Die betroffene Zeile aus dem Snippet oben müsste in diesem Fall wie folgt aussehen:

location ~ /(\.|wp-config.php|liesmich.html|readme.html|xmlrpc.php|wp-comments-post.php) {
  return 444;
}
Twenty Eleven Page Speed

Nginx optimiert: 100 Page Speed Punkte beim Twentyeleven Theme

Load Test
Die durchgeführten Optimierungen (samt Cachify) können sich sehen lassen: WordPress kann locker mit 10 Millionen Hits pro Tag umgehen.

Outro
An dieser Stelle endet die Tutorial-Serie. Der WordPress-Blog läuft performant unter Nginx und PHP5-FPM. APC beschleunigt zusätzlich die Ausführung der Skripte. Durch die Erweiterung der Server-Konfigurationsdatei ist WordPress gegen böswillige Angriffe und unerwünschte Einbettungen der Medien geschützt. Ressourcen sind mit korrekten Caching-Mechanismen ausgestattet. Jetzt ist der Blogger mit hochwertigen Inhalten dran ;)

Tutorials der Serie

Sergej Müller

[Der Autor]Sergej Müller ist enthusiastischer Software Engineer mit Schwerpunkten Webentwicklung, Apps und WordPress. Seit 2007 programmiert und vertreibt er wpSEO, das zugkräftige SEO-Plugin für WordPress-Blogs.

Thematisch ähnliche Beiträge