[[Vorlage(Getestet, hardy, intrepid, jaunty, karmic)]] {{{#!vorlage Wissen [:Pakete_installieren: Installation von Programmen] [:Paketquellen_freischalten: Bearbeiten von Paketquellen] [:Packprogramme: Archive entpacken] [:Programme kompilieren: Pakete aus dem Quellcode erstellen] [:Terminal: Ein Terminal öffnen] [:Editor: Einen Editor öffnen] }}} [[Inhaltsverzeichnis(3)]] [[Bild(http://wiki.nginx.org/local/nginx-logo.png, 100, left)]] [http://www.nginx.org nginx] {en} (gesprochen ''engine x'') ist ein Webserver, welcher gegenüber Apache sehr schnell und schmal ist. Er ist dafür ausgelegt, selbst unter hoher Last nur wenig Ressourcen zu verbrauchen. nginx wurde von Igor Sysoev entwickelt und wird [http://news.netcraft.com/archives/2010/01/07/january_2010_web_server_survey.html laut netcraft] {en} von 7.53% (Stand: Januar 2010) aller Websites genutzt. = Installation = == Aus den Paketquellen == [[Bild(http://media.ubuntuusers.de/wiki/attachments/34/42/Software2_64.png, align=right)]] nginx kann ab Ubuntu Hardy 8.04 als fertiges Paket installiert werden[1]: {{{#!vorlage Paketinstallation nginx, universe }}} == Mithilfe des Quellcodes == [[Vorlage(Fremd, Quelle, "")]] Zuerst muss der Quellcode von nginx [http://nginx.org/en/download.html hier] {dl} heruntergeladen werden. Bevor nginx kompiliert werden kann, benötigt es folgende Pakete: {{{#!vorlage Paketinstallation gcc libevent build-essential }}} Nun entpackt[3] man das Paket und kompiliert[4] nginx. {{{#!vorlage Warnung Die Konfigurationsdatei ist bei der Installation mithilfe des Quellcodes abweichend. Sie befindet sich unter '''/usr/local/nginx/nginx.conf'''. }}} = Konfiguration = [[Bild(http://media.ubuntuusers.de/wiki/thumbnails/a/aa/aafd2cea8b27c3505026e4941791d1ec3ce7ffb8i75x.png, align=right)]] nginx liest die Konfiguration aus der Datei '''/etc/nginx/nginx.conf'''. Die Datei besteht im Wesentlichen aus zwei Teilen: Dem kleinen ''events''-Teil und dem wichtigen ''http''-Teil. {{{#!vorlage Hinweis Kommentiert wird mit einer Raute (#). Kommentierte Zeilen werden von nginx nicht beachtet. }}} == Ändern der Umgebung == === Ändern des Nutzers === nginx kann - wie viele andere Webserver - auch einen anderen Nutzer als ''root'' benutzen. Um dies auszulösen ändert man folgende Zeile: {{{ #user nobody; }}} ab zu folgender Zeile (in diesem Beispiel wird der Nutzer ''www-data'' verwendet): {{{ user www-data; }}} Dies ändert - unabhängig davon, mit welchem Nutzer nginx gestartet wurde - das Konto, mit dem der [wikipedia:Daemon:] arbeitet. === Aktivierung einer [wikipedia:Logdatei:] === Um eine komplette Logdatei nach '''/etc/nginx/logs/error.log''' zu schreiben, ändert man die Zeile: {{{ #error_log logs/error.log; }}} ab zu: {{{ error_log /etc/nginx/logs/error.log; }}} {{{#!vorlage Hinweis Falls der Nutzer geändert wurde (s.o.), muss dieser Schreibzugriff auf den Ordner bzw. die Datei besitzen. }}} Durch das Hinzufügen von ''info'' oder ''notice'' nach dem Dateinamen kann das Protokoll gefiltert werden. == Konfigurieren des Webservers == [[Bild(http://media.ubuntuusers.de/wiki/thumbnails/1/14/1458a1cada5733067103f97814bab4a9edd96d4di75x.png,align=right)]] === Grundkonfiguration === Damit nginx an eine Domain oder IP gebunden wird, muss folgender Grundblock in den http-Teil eingefügt werden: {{{ server { } }}} {{{#!vorlage Hinweis Die Datei ist nach der Installation schon vorkonfiguriert. Es ist empfehlenswert, jegliche ''server { [...] }''-Bereiche zu entfernen, um Komplikationen zu vermeiden. }}} Nun wird angegeben, an welchen Port sich nginx binden soll (''80'') und an welche Domain bzw. IP (''localhost''): {{{ server { listen 80; server_name localhost; } }}} Nun würde nginx zwar am Port 80 horchen, allerdings könnte er keine Daten überbringen, da er kein Verzeichnis mit Dateien zur Verarbeitung bekommen hat. Dies ändert man mit "''root''" (im Beispiel liegen die Dateien in ''/srv/localhost''): {{{ root /srv/localhost; }}} Zuletzt wird noch festgelegt, welche Datei aufgerufen werden soll, wenn der Nutzer nur ''localhost'' eintippt: {{{ location / { index index.html index.htm; } }}} === Domains einbinden === Domains lassen sich folgendermaßen einbinden: {{{ server_name www.example.com example.com; }}} Damit hört nginx sowohl an ''www.example.com'' als auch ''example.com''. === Sub- und Wildcarddomains einbinden === Sub- und Wildcarddomains bindet man mit {{{ server_name *.example.com subdomain.example.com; }}} ein. {{{#!vorlage Warnung Jeder ''server { [...] }''-Block löst aus, dass alle Domains, die hinter ''server_name'' stehen, mit dem Inhalt von ''root'' versorgt werden. }}} === Beispiel === {{{ server { listen 80; server_name localhost example.com www.example.com; root /srv/daten; location / { index index.html index.htm; } } server { listen 80; server_name subdomain.example.com; root /srv/subdomain/daten; location / { index index.html index.htm; } } }}} == PHP mit nginx == [[Bild(http://media.ubuntuusers.de/wiki/attachments/55/28/php-logo.png, align=right)]] nginx verlangt für PHP eine FastCGI-Schnittstelle. Da PHP nicht im Passiv-Modus agiert, müssen - wie für FastCGI üblich - PHP-Instanzen gestartet werden, die im Arbeitsspeicher auf ihren Einsatz warten. Zuerst installiert man PHP im CGI-Modus, falls noch nicht geschehen, mit folgendem Paket: {{{#!vorlage Paketinstallation php5-cgi }}} === Ab Ubuntu Hardy 8.04 === Bis Ubuntu 9.10 existiert das Paket ''spawn-fcgi'' nicht, mit welchem man sonst die Instanzen hätte einfacher starten können, weswegen man '''start-stop-daemon''' verwenden muss. Dazu erstellt man die Datei '''/usr/bin/php-fastcgi''' und füllt sie mit folgendem [:Bash:]-Skript: {{{#!code bash #!/bin/bash BIND=127.0.0.1:9000 USER=www PHP_FCGI_CHILDREN=8 PHP_FCGI_MAX_REQUESTS=1000 PHP_CGI=/usr/bin/php-cgi PHP_CGI_NAME=`basename $PHP_CGI` PHP_CGI_ARGS="- USER=$USER PATH=/usr/local/bin PHP_FCGI_CHILDREN=$PHP_FCGI_CHILDREN PHP_FCGI_MAX_REQUESTS=$PHP_FCGI_MAX_REQUESTS $PHP_CGI -b $BIND" RETVAL=0 start() { echo -n "Startet PHP FastCGI: " start-stop-daemon --quiet --start --background --chuid "$USER" --exec /usr/bin/env -- $PHP_CGI_ARGS RETVAL=$? echo "$PHP_CGI_NAME." } stop() { echo -n "Stoppt PHP FastCGI: " killall -q -w -u $USER $PHP_CGI RETVAL=$? echo "$PHP_CGI_NAME." } case "$1" in start) start ;; stop) stop ;; restart) stop start ;; *) echo "Benutzung: php-fastcgi {start|stop|restart}" exit 1 ;; esac }}} Zuerst gilt es nun zu überprüfen, ob die Datei in Zeile 7 überhaupt existiert. Falls nicht, ändert man den Pfad passend ab. Danach ändert man in Zeile 3 den Benutzer, mit dem die FastCGI-Instanzen laufen sollen und zu guter Letzt verpasst man dem Skript noch die passenden Rechte: {{{ chmod a+x /usr/bin/php-fastcgi }}} Starten tut man die Instanzen nun mit dem Befehl {{{ sudo php-fastcgi start }}} {{{#!vorlage Experten Das Skript kann auch als /etc/init.d/-Skript eingesetzt werden, damit die Instanzen automatisch starten. }}} === Ab Ubuntu Karmic 9.10 === Zuerst installiert man, falls noch nicht geschehen, das Paket {{{#!vorlage Paketinstallation spawn-fcgi,universe }}} Dann erstellt man ein [:Bash:]-Skript, welches die Instanzen startet (Quelle: [http://library.linode.com/web-servers/nginx/php-fastcgi/ubuntu-9.10-karmic Linode.com - Nginx and PHP-FastCGI on Ubuntu]): {{{#!code bash #!/bin/sh /usr/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -u www-data -f /usr/bin/php5-cgi }}} Das Skript speichert man unter '''/usr/bin/php-fastcgi''' ab und setzt mit {{{ chmod a+x /usr/bin/php-fastcgi }}} die richtigen Rechte. Starten tut man nun die Instanzen ganz einfach mit dem Befehl {{{ sudo php-fastcgi }}} === Die Konfiguration von nginx anpassen === {{{#!vorlage Hinweis Dieser Teil gilt wieder für alle Ubuntu-Versionen. }}} Zu guter letzt muss jetzt nur noch nginx wissen, wie man sich an die Schnittstelle bindet. Dazu fügt man in den ''server { [...] }''-Block folgendes ein: {{{ location ~ \.php$ { fastcgi_pass localhost:9000; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }}} {{{#!vorlage Hinweis Bei Uploads bitte auch "nginx und PHP absichern" beachten! }}} = nginx steuern = nginx bildet sich aus einem ''Master''-Prozess und vielen ''Slave''- bzw. ''Client''-Prozessen. Steuern tut man nginx mit dem Master-Prozess, den man mit dem Befehl ''nginx'' anspricht. Dies geht nach folgendem Prinzip (''Ausgabe von nginx -h''): {{{ nginx [-s signal] [-c filename] [-p prefix] [-g directives] }}} == Starten, stoppen und restarten == Für den Start führt man folgenden Befehl aus: {{{ sudo nginx }}} {{{#!vorlage Experten Es sind Rootrechte erforderlich, da eine Bindung an einen ''Haupt''-Port stattfindet, die von Ubuntu/dem Root genehmigt werden muss. }}} Für das Stoppen von nginx: {{{ sudo nginx -s stop }}} Für das erneute Starten von nginx: {{{ sudo nginx -s quit sudo nginx }}} {{{#!vorlage Hinweis Falls '''/etc/init.d/nginx''' vorhanden ist, kann man nginx auch mit diesen Optionen steuern: ''/etc/init.d/nginx (start|stop|restart|reload|force-reload)'' }}} == Auf andere Konfigurationsdatei verweisen == {{{#!vorlage Hinweis Dies ist '''nicht''' bei einer Installation mithilfe vom Quellcode und einer Installation aus den Paketquellen nötig. }}} Falls eine andere Konfigurationsdatei als '''/etc/nginx/nginx.conf''' z.B. zu Testzwecken verwendet werden soll, startet man nginx folgendermaßen: {{{ sudo nginx -c /pfad/der/konfigurationsdatei }}} = nginx optimieren = == GZip-Komprimierung anschalten == Dank der GZip-Komprimierung kann mach sich viel Traffic einsparen. Wie die Kompression von Websites funktioniert und warum man sie aktivieren sollte, kann man [http://betterexplained.com/articles/how-to-optimize-your-site-with-gzip-compression/ hier] {en} nachlesen. nginx kann alle Typen von Websites und Textdateien komprimieren im Gegensatz zu dem ZLib-Modul von PHP, welches nur PHP komprimiert. Um die Komprimierung anzuschalten ändert man die Zeile {{{ #gzip on; }}} ab zu {{{ gzip on; }}} und startet nginx neu. Zusätzlich kann man sogar noch festlegen, welche Dateien geschrumpft werden sollen, und welche Browser ausgenommen werden sollen: {{{ gzip_types text/plain application/xml; gzip_disable "MSIE [1-6]\."; }}} {{{#!vorlage Warnung Die GZip-Kompression kann bei uneingeschränkter Nutzung bei älteren Browsern zu Problemen führen. }}} == Charset festlegen == Falls ein Charset festgelegt werden soll, kann man sich mit folgendem Befehl im ''server { [...] }''-Block behelfen: {{{ charset utf-8; }}} = Tipps & Tricks = == Module benutzen == nginx besitzt standardmäßig nur Standard-Module, welche [http://wiki.nginx.org/NginxModules#Standard_HTTP_Modules hier] {en} gelistet sind. Allerdings kann man nginx mit vielen weiteren Modulen benutzen, deren offiziellen Anlaufstellen [http://wiki.nginx.org/NginxModules#Optional_HTTP_modules hier] {en} und [http://wiki.nginx.org/Nginx3rdPartyModules hier] {en} sind. Die Module kann man allerdings - nicht wie bei allen anderen Webservern - direkt benutzen, sondern muss sie mit nginx kompilieren[4]. Wie das funktioniert, steht in aller Regel in der Dokumentation des Modules. Bei optionalen HTTP-Modulen ([http://wiki.nginx.org/NginxModules#Optional_HTTP_modules hier] gelistet) funktioniert das folgendermaßen: {{{#!vorlage Hinweis In diesem Beispiel wird das "FLV Streaming Modul" installiert. }}} Man bezieht sich - wie oben schon beschrieben - den Quellcode von nginx und entpackt ihn. Statt nun einfach {{{ ./configure }}} einzutippen, fügt man nun das Modul an: {{{ ./configure --with-http_flv_module }}} Somit wird bei der weiteren Kompilierung nun auch das FLV-Modul berücksichtigt. == Loadbalancing mit nginx == [wikipedia:Loadbalancing:] ist standardmäßig in nginx vorhanden und schlägt laut [http://www.admin-blog.com/archives/227-Nginx-vs-Pound-Klarer-Sieg-fuer-Nginx-als-Loadbalancer.html diesem Artikel] {de} [http://de.wikipedia.org/wiki/Pound_(Software) Pound] deutlich. Im folgenden Beispiel verteilt nginx die Last auf 3 Server: {{{ http { upstream loadbalancer { server 127.0.0.1:8000; server 127.0.0.1:8001; server 127.0.0.1:8002; } server { listen 80; server_name www.example.com example.com; location / { proxy_pass http://loadbalancer; } } } }}} Zur Erklärung: Im upstream ''loadbalancer'' sind 3 (Web-)Server vorhanden und mit ihren jeweiligen Daten (''IP:Port'') angegeben. Im ''server { [...] }''-Block hört nginx an den Domains ''www.example.com'' und ''example.com'' an Port 80 und leitet die Anfrage an den upstream weiter. == Rewriting == Statt sich die Domain http://www.example.com/index.php?artikel=1234 zu merken, ist es viel einfacher, sich die Domain http://www.example.com/artikel/1234 zu merken. In der Konfigurationsdatei kann dies im ''server { [...] }''-Block erledigt werden: {{{ rewrite ^/artikel/(.*)$ /index.php?artikel=$1? last; }}} ''^/artikel/(.*)$'' bedeutet folgendes: Sollte irgendwo ''/artikel/'' vorkommen, dann kommt das, was hinter ''/artikel/'' steht, in die [wikipedia:Variable:] $. ''/index.php?artikel=$1?'' bedeutet, dass statt http://www.example.com/artikel/1234 http://www.example.com/index.php?artikel=1234 aufgerufen wird. {{{#!vorlage Hinweis 1234 ist hier der Wert der Variable $ gewesen. }}} {{{#!vorlage Warnung Wenn das ''last'' am Ende vergessen wird, dann produziert nginx einen 500 Server-Error. }}} '''Weitere Hilfe findet man [http://wiki.nginx.org/NginxHttpRewriteModule hier] {en}''' = nginx und PHP absichern = Man stelle sich vor, ein Hacker würde eine *.php-Datei via PHP in das Verzeichnis '''/uploads/''' hochladen. Diese Datei ist mit Schadcode infiziert und würde bei der Ausführung dem Server schaden. Wenn jetzt aber die Ausführung der Datei nicht verboten wird, könnte der Hacker seinen Angriff starten. Um das zu verhindern, fügt man in den ''location ~ \.php$ { [...] }''-Block folgendes ein: {{{ if ($uri !~ "^/uploads/") { fastcgi_pass 127.0.0.1:9000; } }}} Dies löst aus, dass alle *.php-Dateien in allen Ordnern mit dem Namen ''uploads'' nicht mehr ausgeführt werden. = Erste Hilfe bei Problemen = [[Bild(http://media.ubuntuusers.de/wiki/attachments/56/50/ErsteSchritte.png, align=right)]] ==== nginx zeigt bei Dateien, die existieren, im Browser "403" an. ==== Schreibrechte überprüfen! Diese Meldung kommt meistens, wenn nginx bzw. der Benutzer, mit dem nginx läuft, keinen Zugriff auf die Dateien hat. ==== nginx startet nicht automatisch. ==== Eventuell fehlt das ''/etc/init.d''-Startskript. [http://library.linode.com/web-servers/nginx/installation/ubuntu-9.10-karmic#create_an_init_script_to_manage_nginx Hier] {en} findet man Hilfe. ==== nginx startet nicht, da die Konfigurationsdatei angeblich falsch ist. ==== Die Konfigurationsdatei überprüfen, ob überall am Ende jedes Befehls/jeder Zeile ein Semikolon ist, und ob der ''server { [...] }''-Block auch mit dem Zeichen "}" geschlossen ist! ==== Obwohl nginx richtig konfiguriert ist, passiert beim Aufrufen von Subdomains nichts. ==== Das kann passieren, wenn man sich vertippt hat, oder der Namensserver falsch eingestellt ist. ==== Wieso bliebt nginx an der Meldung "''[...]:80 failed (98: Address already in use)''" hängen? ==== Vielleicht läuft nginx schon. Falls nicht, sollte man überprüfen, ob andere Webserver schon diesen Port nutzen! ==== Wieso kann [wikipedia:Plesk:] nginx nicht konfigurieren? ==== Das liegt daran, dass Plesk [:Apache:] nutzt und nicht auf nginx zugeschnitten ist. = Links = [http://wiki.nginx.org/ Wiki von nginx] {en} [http://www.joeandmotorboat.com/2008/02/28/apache-vs-nginx-web-server-performance-deathmatch/ Apache vs Nginx : Web Server Performance Deathmatch] {en} [http://library.linode.com/web-servers/nginx/ Linode.com - Weiterführende Konfiguration von nginx] {en} = Quellen = [http://www.nginx.org/ Website von nginx] {en} [http://wiki.nginx.org/ Wiki von nginx] {en} [http://library.linode.com/web-servers/nginx/ Linode.com] {en} #tag: Netzwerk, Internet, Server