WordPress-Installation von Apache 2 auf NGINX umstellen – Teil 3: Blog konfigurieren

Nachdem ich in den ersten beiden Teilen dieses kleinen Tutorials die allgemeine Konfiguration von NGINX mit PHP beschrieben habe, geht es nun in diesem Teil endlich um die WordPress-Konfiguration.  Dabei werde ich zunächst einmal erklären wie ein einfacher WordPress-Blog konfiguriert. Wie man die Konfiguration für eine WordPress-Multisite anpassen muss, beschreibe ich dann im vierten Teil des Tutorials.

Wie bereits erwähnt, verwendet NGINX zur Laufzeit nur eine einzige Konfigurationsdatei. Allerdings kann diese mit Hilfe von include-Anweisungen durchaus aus mehreren Dateien zusammengesetzt werden. Diese Möglichkeit wird von mir auch genutzt, weil es die Verwaltung deutlich vereinfacht.

Im folgenden werden ich nur zu den für die WordPress-Installation relevanten Optionen etwas schreiben. Eine ausführliche Beschreibung aller Optionen befindet sich im NGINX-Wiki.

NGINX-Konfiguration sind hierarchisch aufgebaut:

  • http: in diesem Bereich wird der Server selber konfiguriert. Die hier gemachten Einstellungen gelten für alle Domains.
  • server: pro Website (bzw. Domain oder Subdomain) gibt es jeweils eine eigene Konfiguration. Bei der NGINX-Instalallation werden im Verzeichnis /etc/nginx automatisch die Unterverzeichnisse sites-available und sites-enabled erstellt. Wie auch bei Verwendung von Apache befinden sich die eigentlichen Konfigurationen im Verzeichnis sites-available, während das Verzeichnis sites-enabled nur symbolische Links auf die aktiven Konfigurationen enthält.
  • location: für jede Domain können pro Verzeichnis bzw. Dateien eigene Einstellungen vorgenommen werden. Dies entspricht ungefähr den .htaccess-Dateien von Apache, die man dort in den jeweiligen Verzeichnissen erstellen musste.

Zunächst einmal die nginx.conf-Datei wie sie aktuell bei mir aussieht:

user www-data;
worker_processes 2;
pid /var/run/nginx.pid;
events {
    worker_connections 768;
}
http {
   sendfile on;
   tcp_nopush on;
   tcp_nodelay on;
   keepalive_timeout 65;
   types_hash_max_size 2048;

   include /etc/nginx/mime.types;
   default_type application/octet-stream;

   access_log /var/log/nginx/access.log;
   error_log /var/log/nginx/error.log;

   gzip on;
   gzip_disable "msie6";
   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 application/x-javascript text/xml application/xml application/xml+rss text/javascript;

   include /etc/nginx/conf.d/*.conf;
   include /etc/nginx/sites-enabled/*;
}
Zeilen 1-15:
Das sind im wesentlichen die Standardeinstellungen von der NGINX-Installation. Wenn ein anderer Benutzer verwendet werden soll, dann muss die Zeile 1 angepasst werden.
Zeile 17-18:
Hier werden die Dateien für die allgemeinen Log-Dateien konfiguriert. Es können aber auch pro Website jeweils eigene konfiguriert werden.
Zeile 20-27:
In der Standardkonfiguration sind diese Einstellungen auskommentiert. Aber das Komprimieren der Daten ist in jedem Fall sinnvoll. In Zeile 27 ist konfiguriert, welche Dateitypen komprimiert werden sollen. Eine Komprimierung von Bildern (insbesondere im JPEG-Format) ist nicht sinnvoll.
Zeile 29:
Durch die include-Anweisung werden alle Konfigurationsdateien aus diesem Verzeichnis geladen. Darunter befindet sich insbesondere die Konfiguration von PHP-FPM.
Zeile 30
Pro Website gibt es eine separate Konfigurationdatei, die mit dieser Anweisung geladen werden.

Wie weiter oben schon geschrieben, befindet sich im Verzeichnis sites-available für jede verfügbare Website jeweils eine Konfigurationsdatei. Für einen WordPress-Blog könnte sie wie folgt aussehen (example.com muss durch die jeweilige Domain ersetzt werden):

server {
   listen 80;
   index index.php;

   server_name example.com www.example.com;
   root /var/www/vhosts/example.com/httpdocs;

   access_log /var/log/nginx/example.com-access.log;
   error_log /var/log/nginx/example.com-error.log;

   include /etc/nginx/global/restrictions.conf;
   include /etc/nginx/global/wordpress.conf;
}
Zeile 2:
Mit dieser Anweisung kann für jede Website bzw. (Sub)Domain ein eigener Port konfiguriert werden (wenn Port 80 verwendet werden soll, kann die Zeile auch einfach weggelassen oder auskommentiert werden). Ist parallel z.B. noch ein Apache-Server aktiv, der Port 80 verwendet, so muss diese Zeile auskommentiert und ein anderer Port eingestellt werden (mehr dazu im 1. Teil dieses Tutorials).
Zeile 5:
Name(n) der Domain bzw. Sub-Domain, unter der die Website erreichbar sein soll. Durch die Definition mit und ohne www wird erreicht, dass die Website unter beiden Varianten erreicht werden kann.
Zeile 6:
Das hinter root angegebene Verzeichnis ist das Verzeichnis, in dem sich die WordPress-Installation befindet. Es kann hier problemlos dasselbe Verzeichnis verwendet werden, das bereits von einem Apache-Server genutzt wird. So kann man jederzeit zwischen Apache und NGINX wechseln.
Zeilen 8-9:
Ich verwende pro Website eigene Log-Dateien, die hier konfiguriert sind.
Zeilen 11-12:
Ich verwalte auf meinem Server derzeit 2 Websites und noch weitere Subdomains (für Piwik, Webmailer, etc). Damit ich die Konfigurationen nicht doppelt erstellen muss, habe ich unter /etc/nginx das Unterverzeichnis global mit weiteren Konfigurationsdateien angelegt.

Die wichtigste davon ist wordpress.conf. Diese Datei enthält die eigentliche WordPress-spezifische Konfiguration und hat den folgenden Inhalt:

location / {
   try_files  $uri $uri/ /index.php?q=$uri&$args;
}
location ~\.php$ {
   try_files $uri =404;
   fastcgi_split_path_info ^(.+\.php)(/.+)$;
   include fastcgi_params;
   fastcgi_index index.php;
   fastcgi_pass php;
}
Zeilen 1-3:
Diese Einstellungen sorgen dafür, das die WordPress-Permalinks überhaupt funktionieren.
Zeilen 4-10:
Diese Einstellungen werden generell für die Verwendung von PHP mit NGINX benötigt.

In der Datei restrictions.conf habe ich einige Einstellungen zur Sicherheit und zum Logging von Zugriffen für einzelne Dateien bzw. Dateitypen hinterlegt

location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
   expires 240h;
   add_header Vary: Accept-Encoding;
}
location ~* ^/favicon\.(ico|png)$ {
   access_log off;
}
location = /robots.txt {
   log_not_found off;
   access_log off;
}
location ~ /\. {
   deny all;
   access_log off;
   log_not_found off;
}
location ~* ^/wp-content/uploads/.*.php$ {
   deny all;
   access_log off;
   log_not_found off;
}
location ~* /files/(.*).php$ {<
   deny all;
   access_log off;
   log_not_found off;
}
location /nginx_status {
   stub_status on;
   access_log off;
   deny all;
}

Die Konfiguration in den ersten 4 Zeilen sorgt dafür, das die aufgeführten Dateitypen gecachet werden. Mit dieser Einstellung werden die Dateien für jeweils 10 Tage im Cache des Browsers gespeichert.

Die Einstellungen access_log und log_not_found sorgen jeweils dafür, das Zugriffe auf diese Dateien nicht im Server-Log landen.

Damit die WordPress-Permalinks richtig funktionieren, benötigt WordPress bei Verwendung von NGINX noch eine spezielle Einstellung. Hierfür kann entweder das nginx Compatibility-Plugin installiert werden oder man editiert die Datei functions.php im Installationsverzeichnis des verwendeten WordPress-Themes und fügt dort die folgende Zeile ein:

add_filter('got_rewrite', '__return_true', 999 );

Weitere Informationen zu NGINX und WordPress

Die weiteren Artikel dieser Reihe:

comments powered by Disqus