Teil 3 unserer kleinen HowTo-Reihe. Wir zeigen euch, wie man eine WordPress Webseite mit Nginx auf Ubuntu Server beschleunigen kann. Nachdem wir Nginx bereits installiert haben und PHP und MySQL, wird nun erklärt, wie man ein reibungsloses Zusammenspiel konfiguriert. [sws_divider_top]Bevor ich nun erkläre wie man PHP in Nginx einbindet, müssen wir ersteinmal wissen, wie die Nginx Konfiguration funktioniert. Die Konfiguration hat eine feste, logische Struktur:
# Hier werden nur Einstellungen vorgenommen die ganz global sind # wie z.b. der User, womit nginx ausgeführt werden soll befehl; befehl; events { # hier kann einstellt werden wie nginx mit Verbindungen umgeht befehl; } http { # Einstellungen für den http Server befehl; befehl; include conf/mime.types; # Einstellungen aus anderer Datei dazuholen server { # Einstellungen für einen Host listen nodch.de; # dieser Serverbereich gilt für die domain nodch.de befehl; befehl; location / { # Einstellungen für das Root Verzeichnis befehl; } location /download/ { # Einstellungen für /downloads befehl; } location ~* ^.+\.(jpg|jpeg|gif)$ { # Einstellungen für alle URLs die auf .jpg, .jpeg oder .gif enden befehl; } } }
Der server und der location Bereich kann beliebig oft vorkommen, solange er an der richtigen Sstelle ist. Einige Befehle können nur in definierten Bereichen stehen. Ich werde euch hier die wichtigsten Funktionen für jeden Bereich erklären.
Globale Einstellungen
user www www; # nginx wird als User www in der Gruppe www ausgeführt worker_processes 2; # nginx wird 2 Verarbeiter Prozesse starten pid /var/run/nginx.pid; # pid file wird dort gespeichert
Außerdem kann noch der error_log definiert werden, jedoch separiere ich diese immer in die einzelnen Server. Wird sie oben angegeben, sieht man im log auch globale Fehler. Eine komplette Auflistung aller globalen Einstellungen findet man im Nginx Wiki#NginxHttpMainModule. Mit worker_processes und dem event Bereich könnt ihr die Performance des Servers beeinflussen. Der event Bereich lässt verschiedene Einstellungen zu, der Wichtigste ist aber:
worker_connections 1024;
Wenn ihr worker_proesses * worker_connections rechnet, erhaltet ihr die maximale Anzahl gleichzeitiger Clients, im Beispiel also maximal 2048. Auch hier findet ihr wieder alle möglichen Einstellungen im Nginx Wiki#NginxHttpEventsModule.
Die richtige Wahl der worker_processes ist wichtig! Wollt ihr eine Webseite haben, die sehr Last intensiv ist, also mit SSL und GZIP, so sollte die Zahl der Worker Prozesse nicht die Anzahl der CPU Cores übersteigen. Verwendet ihr den Server aber als Host für statischen Content, kann die Zahl erhöht werden, um einen schnellstmöglichen Dateizugriff zu haben.
HTTP Server Einstellungen
Alle hier getätigten Einstellungen wirken sich direkt auf die eingetragenen server Bereiche aus. Im http Bereich werden in der Regel Einstellungen gemacht, die für alle server Bereiche gleich sind, wie beispielsweise das access log format, oder gzip. Diese Befehle können problemlos im server Bereich überschieben werden. Hier seht ihr wie der http Bereich bei nodch.de aussieht:
include /etc/nginx/mime.types; log_not_found off; # kein Status 404 logen # Log format soll Apache ähnlich sein log_format main '$remote_addr - $remote_user [$time_local] "$request"' ' $status $body_bytes_sent "$http_referer" "$http_user_agent"'; sendfile on; # Erlaubt sendfile(). Infos hier tcp_nodelay on; # Für sendfile() keepalive_timeout 6; # Verbindungen früh wieder schließen server_tokens off; # Versionsnummer nicht auf der Fehlerseite zeigen gzip on; # GZip Anschalten gzip_http_version 1.0; gzip_comp_level 2; # Kompressionslevel. Performancesache gzip_proxied any; # Proxy Verhalten gzip_min_length 1100; # erst ab 1100 byte größe kompremieren gzip_buffers 16 8k; # Folgende Dateitypen kompremieren gzip_types text/plain text/html text/css application/x-javascript application/xml application/xml+rss text/javascript; gzip_disable "MSIE [1-6].(?!.*SV1)"; # GZip für den IE6 auschalten gzip_vary on; # Vary Header senden # server und zusatzconfigs einbinden include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*;
Dies ist eine vergleichsweise simple Konfiguration, wir definieren, das wir immer GZip benutzen wollen, jedoch nicht für den IE6. Außerdem setzen wir das keepalive_timeout stark runter, um erhöhtes Trafficaufkommen problemlos zu verarbeiten. Außerdem ändern wir das Log Format in das von Apache, um Analyse Tools zu benutzen. Eine Auflistung aller Core Befehle gibt es auch wieder im Nginx Wiki#NginxHttpCoreModule sowie eine Übersicht über alle anderen Module. Viel wichtiger als der http Bereich, ist für uns aber der server Bereich.
Der server Bereich ist ähnlich dem VirtualHost Eintrag im Apache. Hier ein Beispiel:
server { server_name nodch.de; # Dieser Bereich ist nur für die Domain nodch.de # nodch.de wird auf www.nodch.de umgeschrieben rewrite ^(.*) https://nodch.de$1 permanent; } server { listen 80; # Port 80 benutzen # Dieser Bereich gilt für diese beiden Domains server_name www.nodch.de photo.nodch.de; root /var/www/nodch.de/httpdocs; # Hier liegen die Dateien # Log hier schreiben und dabei das "main"-Format benutzen access_log /var/www/nodch.de/logs/access.log main; # Die Fehler landen in dieser Datei error_log /var/www/nodch.de/logs/error.log; # die index Datei ist index.php wenn nicht da index.html ... usw. index index.php index.html index.htm; }
Wenn nun eine [sws_highlight hlcolor=“fbfac7″]index.html[/sws_highlight] Datei in [sws_highlight hlcolor=“fbfac7″]/var/www/nodch.de/httpdocs[/sws_highlight] liegt und euer Server ist gestartet, dann könnt ihr mit eurem Webbrowser darauf zugreifen und ihr werdet den Inhalt der index.html dargestellt bekommen. Nur wird es ohne weiteres nicht klappen nodch.de aufzurufen und eure Datei zu sehen 🙂 Ihr müsst es entweder auf localhost ändern oder eure eigene Domain eintragen. Aber insoweit ist Nginx konfiguriert um statischen Content zu hosten, welcher brav komprimiert wird. Im server Bereich könnt ihr eigene location Bereiche anlegen, in denen Befehle hinterlegt werden können, die eben nur an dieser location gültig sind. Hierzu ein Beispiel:
# Gilt für die Hauptseite location / { # URLs probieren ob es sie gibt, letzter Eintrag ist immer Default try_files $uri $uri/ /index.php; } # Die Datei piwik.js, egal wo sie liegt bekommt eine Cachezeit von 90 Tagen. location ~ piwik.js$ { expires 90d; } # Das favicon interessiert uns nicht. Log aus. location = /favicon.ico { access_log off; } # Adressen die mit wp-content, js oder css anfangen location ~ ^/(wp-content|js|css)/ { expires 30d; # Cachzeit 30 Tage root /var/www/nodch.de/static; # Dateien aus anderen Ordner beziehen }
Der location Bereich kann ziemlich frei, mithilfe von Regex bestimmt werden. Mithilfe von Steuerzeichen kann außerdem bestimmt werden, wie wichtig ein location Bereich ist.
- = Bedeutet, dass diese location fest ist, kein Regex
- ~ Regex ist case sensitiv
- *~ Regex ist case insensitiv
- ^~ Sucht ein Regex, hört an dieser location auf wenn gefunden
Genauere Infos erhaltet ihr natürlich wieder im Nginx Wiki#location, auch sind die default Konfigurationen gut kommentiert, sodass man damit auch gleich loslegen kann.[sws_divider_top]
PHP einbinden
Mit dem vorherigen Artikel habt ihr schon PHP installiert und als FastCGI Anwendung auf 127.0.0.1:9000 gespawnt. Um diese nun mit nginx anzusteuern, müssen zwei kleine Modifikationen vorgenommen werden. Öffnet zuerst die Datei [sws_highlight hlcolor=“fbfac7″]/etc/nginx/fastcgi_params[/sws_highlight] . Der Inhalt sollte so aussehen:
fastcgi_param QUERY_STRING $query_string; fastcgi_param REQUEST_METHOD $request_method; fastcgi_param CONTENT_TYPE $content_type; fastcgi_param CONTENT_LENGTH $content_length; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param SCRIPT_NAME $fastcgi_script_name; fastcgi_param REQUEST_URI $request_uri; fastcgi_param DOCUMENT_URI $document_uri; fastcgi_param DOCUMENT_ROOT $document_root; fastcgi_param SERVER_PROTOCOL $server_protocol; fastcgi_param GATEWAY_INTERFACE CGI/1.1; fastcgi_param SERVER_SOFTWARE nginx/$nginx_version; fastcgi_param REMOTE_ADDR $remote_addr; fastcgi_param REMOTE_PORT $remote_port; fastcgi_param SERVER_ADDR $server_addr; fastcgi_param SERVER_PORT $server_port; fastcgi_param SERVER_NAME $server_name;
Es ist wichtig, dass in SCRIPT_FILENAME der absolute Pfad verwendet wird, denn dieser wird an die PHP Worker gegeben. Würde ein vermeindlich relativer Dateipfad übergeben werden, wie z.B. [sws_highlight hlcolor=“fbfac7″]/wordpress/index.php[/sws_highlight], werdet ihr die Fehlermeldung No input file specified bekommen. Er muss also absolut sein: [sws_highlight hlcolor=“fbfac7″]/var/www/prad/zu/index.php[/sws_highlight].
Ist diese Anpassung gemacht, öffnet bitte die Datei, in der ein server Bereich vorhanden ist. Fügt eine neue location hinzu:
location ~ \.php$ { include fastcgi_params; # Parameter einbinden fastcgi_pass 127.0.0.1:9000; # Anfrage an Worker weitergeben fastcgi_index index.php; # Standard Dateiname fastcgi_split_path_info ^(.+\.php)(/.+)$; # Parameter abtrennen fastcgi_intercept_errors on; # Fehler ausgeben }
Diese location bezieht sich auf alle PHP Dateien und reicht die Verarbeitung an unsere PHP Worker weiter. Die Parameter werden von der URL abgetrennt, was bewirkt, das auch URL Parameter an PHP gegeben werden und normal benutzt werden können. Alternativ zu 127.0.0.1:900 kann auch ein Unix-Socket verwendet werden. Dazu im Startscript einfach nicht die Adresse 127.0.0.1:9000 sondern eine Datei wie [sws_highlight hlcolor=“fbfac7″]/var/socket/php.socket[/sws_highlight] binden. Danach muss der Parameter fastcgi_pass angepasst werden:
fastcgi_pass unix:/var/socket/php.socket;
Das wars auch schon. Ihr könnt jetzt folgendes testen:
$ echo "<?php phpinfo(); ?>" > /var/www/eure/httpdocs/info.php
Dann einfach die info.php im Browser aufrufen und ihr werdet die PHP Konfigurationswebseite sehen!
Viel Spaß beim testen! Im nächsten Teil dieser Serie werde ich euch dann zeigen, wie ihr WordPress auf einer Nginx Umgebung benutzt und es mit Hilfe von W3TotalCache, sowie anderen Optimierungsmethoden spürbar schneller machen könnt.
[sws_divider_top] Teil 0: Einführung
Teil I: Installation der aktuellen Nginx-Version auf Ubuntu
Teil II: Installation von MySQL und PHP
Teil III: Nginx konfigurieren und PHP als FastCGI bereitstellen
– Alternativ: PHP-FPM Installieren und bereitstellen (folgt !)
Teil IV: Nginx für WordPress optimieren