ubuntuusers.de

Du betrachtest eine alte Revision dieser Wikiseite.

nginx

Dieser Artikel wurde für die folgenden Ubuntu-Versionen getestet:


Du möchtest den Artikel für eine weitere Ubuntu-Version testen? Mitarbeit im Wiki ist immer willkommen! Dazu sind die Hinweise zum Testen von Artikeln zu beachten.

http://wiki.nginx.org/local/nginx-logo.png nginx 🇬🇧 (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 laut netcraft 🇬🇧 von 7.53% (Stand: Januar 2010) aller Websites genutzt.

Installation

Aus den Paketquellen

http://media.ubuntuusers.de/wiki/attachments/34/42/Software2_64.png nginx kann ab Ubuntu Hardy 8.04 als fertiges Paket installiert werden[1]:

  • nginx (universe)

Befehl zum Installieren der Pakete:

sudo apt-get install nginx 

Oder mit apturl installieren, Link: apt://nginx

Mithilfe des Quellcodes

Hinweis!

Zusätzliche Fremdquellen können das System gefährden.

Zuerst muss der Quellcode von nginx hier ⮷ heruntergeladen werden. Bevor nginx kompiliert werden kann, benötigt es folgende Pakete:

  • gcc

  • libevent

  • build-essential

Befehl zum Installieren der Pakete:

sudo apt-get install gcc libevent build-essential 

Oder mit apturl installieren, Link: apt://gcc,libevent,build-essential

Nun entpackt[3] man das Paket und kompiliert[4] nginx.

Achtung!

Die Konfigurationsdatei ist bei der Installation mithilfe des Quellcodes abweichend. Sie befindet sich unter /usr/local/nginx/nginx.conf.

Konfiguration

http://media.ubuntuusers.de/wiki/thumbnails/a/aa/aafd2cea8b27c3505026e4941791d1ec3ce7ffb8i75x.png 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.

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

Aktivierung einer 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;

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

http://media.ubuntuusers.de/wiki/thumbnails/1/14/1458a1cada5733067103f97814bab4a9edd96d4di75x.png

Grundkonfiguration

Damit nginx an eine Domain oder IP gebunden wird, muss folgender Grundblock in den http-Teil eingefügt werden:

server {

}

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.

Achtung!

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

http://media.ubuntuusers.de/wiki/attachments/55/28/php-logo.png 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:

  • php5-cgi

Befehl zum Installieren der Pakete:

sudo apt-get install php5-cgi 

Oder mit apturl installieren, Link: apt://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:

 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
#!/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

Experten-Info:

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

  • spawn-fcgi (universe)

Befehl zum Installieren der Pakete:

sudo apt-get install spawn-fcgi 

Oder mit apturl installieren, Link: apt://spawn-fcgi

Dann erstellt man ein Bash-Skript, welches die Instanzen startet (Quelle: Linode.com - Nginx and PHP-FastCGI on Ubuntu):

1
2
#!/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

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;
}

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

Experten-Info:

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

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

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 hier 🇬🇧 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]\.";

Achtung!

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 hier 🇬🇧 gelistet sind. Allerdings kann man nginx mit vielen weiteren Modulen benutzen, deren offizielle Anlaufstelle hier 🇬🇧 und hier 🇬🇧 ist. 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 (hier gelistet) funktioniert das folgendermaßen:

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

Loadbalancing ist standardmäßig in nginx vorhanden und schlägt laut diesem Artikel 🇩🇪 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 Variable $.

/index.php?artikel=$1? bedeutet, dass statt http://www.example.com/artikel/1234 http://www.example.com/index.php?artikel=1234 aufgerufen wird.

Hinweis:

1234 ist hier der Wert der Variable $ gewesen.

Achtung!

Wenn das last am Ende vergessen wird, dann produziert nginx einen 500 Server-Error.

Weitere Hilfe findet man hier 🇬🇧

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

http://media.ubuntuusers.de/wiki/attachments/56/50/ErsteSchritte.png

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. Hier 🇬🇧 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 Plesk nginx nicht konfigurieren?

Das liegt daran, dass Plesk Apache nutzt und nicht auf nginx zugeschnitten ist.

Wiki von nginx 🇬🇧

Apache vs Nginx : Web Server Performance Deathmatch 🇬🇧

Linode.com - Weiterführende Konfiguration von nginx 🇬🇧

Quellen

Website von nginx 🇬🇧

Wiki von nginx 🇬🇧

Linode.com 🇬🇧

Diese Revision wurde am 28. März 2010 13:48 von DerDenker erstellt.
Die folgenden Schlagworte wurden dem Artikel zugewiesen: Netzwerk, Server, Internet