Anzeige
Smartes Cloud Hosting für anspruchsvolle Projekte.
↬ Loslegen und Spaces testen ↬ Jetzt testen!
Sven Schannak 16. Juni 2012

Nginx – Erste Schritte mit der Apache-Alternative

Konfiguration des Reverse-Proxy

Nginx (ausgesprochen Engine X) wird von vielen Entwicklern und Administratoren als leistungsstarke Alternative zu Apache angesehen. Dabei bietet es durch seine einfache Konfiguration und auf Performance angelegte Architektur auch Einsteigern in das Thema Webserver viele Vorteile.

Anzeige

nginx Logo

Anfangs ist zu betrachten, wofür Nginx eingesetzt werden soll. Neben dem Einsatz als einfacher HTTP-Server ist vor allem die Verwendung als Reverse-Proxy zur Lastverteilung beliebt. Aber auch bei statischen Webseiten bietet Nginx Performance-Vorteile gegenüber Apache. Um nicht gleich den Stab über Apache zu brechen, muss gesagt werden, dass dieser momentan noch eine weit größere Vielfalt an Modulen bietet, die für viele professionelle Entwickler und Administratoren unerlässlich sind. Nginx bietet weit weniger, aber zumindest schon die meisten wichtigen Module, wie SSL-Support oder erweiterte Caching-Möglichkeiten.

Anzeige

Nginx wird heute bereits, wenn man verschiedenen Quellen glauben mag, zum Betrieb von weltweit 9% aller Webseiten eingesetzt. In Russland, dem Heimatland von Nginx, liegt der Anteil angeblich gar über 50%. Repräsentative Anwender sind zum Beispiel GitHub, WordPress.com, Wikimedia oder Hulu. Nginx kann auch als Proxy für POP3- und SMTP-Protokolle auftreten.

Installation von Nginx

An einem Debian-Server möchte ich die Installation und Konfiguration von Nginx zuerst zum Betrieb von PHP demonstrieren und anschließend seine Verwendung als Reverse-Proxy zeigen. Installieren kann man Nginx über die gängigen Paketmanager.

Vor Beginn der Aktion sollten wir schauen, ob unter Umständen bereits Apache auf Port 80 läuft:

Unter Debian nutzen wir hierfür den Befehl:

netstat -an | grep :80 | wc -l

Falls als Ergebnis 1 ausgegeben wird, muss zunächst Apache gestoppt oder Nginx auf einen anderen Port gesetzt werden.

sudo apt-get install nginx

Um Nginx zu konfigurieren, öffnet man mit Hilfe von vim folgende Datei:

sudo vim /etc/nginx/sites-available/default

Dort können wir verschiedene Einstellungen vergeben. Als Einstieg setzen wir den Pfad /data/dev/php als Ausgangsordner für all unsere PHP-Dateien. Sie sollten allerdings beachten, dass man bei der Konfiguration eines Webservers viele verschiedene Dinge in Bezug auf die Sicherheit beachten muss. Das gilt insbesondere bei der Nutzung von PHP. Die folgende Config sollte nicht in einer produktiven Umgebung eingesetzt werden. Sie dient in meiner kleinen Einführung hier lediglich zum ersten Testen von Nginx. Es sind noch weitere Einstellungen, basierend auf ihren Systemen zum produktiven Betreiben von Nginx als Webserver nötig. Die folgenden Einstellungen bringen PHP unter Nginx ans Laufen.

## Allgemeine Server-Einstellungen
server {

## Ersetzt Apache
  listen 80;
  server_name localhost;
  access_log /var/log/nginx/localhost.access.log;

## Grundlegende Pfade
  location / {
   ## Absoluter Pfad zum Ordner mit den PHP-Dateien
   root /data/dev/php;
   index index.php;
   try_files $uri =404;
  }

## Einstellungen für Bilder und statischen Content
  location ~* ^.+.(jpg|jpeg|gif|css|png|js|ico|xml)$ {
   access_log off;
   expires 30d;
   root /data/dev/php;
  }

## Konfiguration zum Parsen der PHP-Dateien im Ordner (fastcgi)
  location ~ .php$ {
   fastcgi_split_path_info ^(.+\.php)(.*)$;
   fastcgi_pass backend;
   fastcgi_index index.php;
   fastcgi_param SCRIPT_FILENAME /data/dev/php$fastcgi_script_name;
   include fastcgi_params;
   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_intercept_errors on;
   fastcgi_ignore_client_abort off;
   fastcgi_connect_timeout 60;
   fastcgi_send_timeout 180;
   fastcgi_read_timeout 180;
   fastcgi_buffer_size 128k;
   fastcgi_buffers 4 256k;
   fastcgi_busy_buffers_size 256k;
   fastcgi_temp_file_write_size 256k;
  }

## .htaccess und .htpwd können von außen nicht betrachtet werden
  location ~ /\.ht {
   deny all;
  }
}
upstream backend {
  server 127.0.0.1:9000;
}

PHP mit Nginx

Bevor man nun Nginx neustartet, sollte noch PHP und FastCGI für PHP installiert werden, damit Nginx alle Configs, die es benötigt, finden kann. Zuerst installiert man PHP und verschiedene Abhängigkeiten:

sudo echo "deb http://php53.dotdeb.org stable all" >> /etc/apt/sources.list
sudo apt-get update
sudo apt-get install php5-cli php5-common php5-suhosin

Als Nächstes folgt die FastCGI-Unterstützung:

sudo apt-get install php5-fpm php5-cgi

Dann muss Nginx neu gestartet werden:

sudo /etc/init.d/nginx restart

Das ist es eigentlich schon. Skripte im Ordner /data/dev/php sollten nun lokal unter der Adresse localhost erreichbar sein. Testen kann man die Lauffähigkeit seines Servers mit dem kleinen Tool siege:

apt-get install siege

Und mit folgendem Befehl startet man einen kleinen Test auf localhost. Das Ganze ergibt natürlich mehr Sinn für eine Load-Balancing-Umgebung, worum es dann im nächsten Abschnitt geht:

siege -d1 -c50 -t1m http://localhost

Der Parameter d steht für „delay“, c für die Anzahl der „Nutzer“, die versuchen, gleichzeitig den Server aufzurufen und t für die Zeit. M kann dabei durch s für Sekunden oder h für Stunden ersetzt werden. Man kann zum Benchmarking aber auch das bereits vorhandene Tool ab, welches mit Apache mitgeliefert wird, benutzen:

ab -kc 1000 -n 1000 http://localhost/index.php

Mit diesem Befehl sendet man 1000 Verbindungsanforderungen 1000 mal. Vergleicht man mit Hilfe von „ab“ Apache und Nginx lässt sich bei vielen Requests ein eindeutiger Vorteil von Nginx ablesen. Vor allem bei statischen Dateien wie HTML, die nicht erst interpretiert werden müssen, gibt es einen klaren Vorteil. Auf meinem Testserver hat Nginx, bei oben genannter Konfiguration, 960 Requests pro Sekunde geschafft, während Apache nur 60 Requests bearbeiten konnte.

Load-Balancing mit Nginx

Kommen wir nun zu einem spannenden Thema, mit dem die meisten Webentwickler nur selten in Berührung kommen. Es kann aber nie schaden, zu wissen, wie es ungefähr funktioniert. Beim Load-Balancing geht es um den Lastausgleich mit Hilfe eines Reverse-Proxy. Man erstellt praktisch einen Master-Server, der die Verteilung auf mehrere Slave-Server übernimmt. Dabei gibt es verschiedene Varianten des Load-Balancing, wie zum Beispiel Round-Robin, welches dafür sorgt, dass alle Server einfach nacheinander abgearbeitet werden. Beim gewichteten Round-Robin bekommt jeder Server eine Gewichtung nach Leistung und Kapazität. Wenn Server A beispielsweise eine Gewichtung von 100 erhält und Server B von 33, bekommt zuerst Server A zwei Anfragen und dann Server B eine Anfrage. Also eine 2/3 zu 1/3 Aufteilung der Last.

Least Connections überprüft die aktuellen Verbindungen der Server und entscheidet die Verteilung nach dem Server mit den wenigsten Verbindungen. Es gibt das selbe Verfahren auch in einer gewichteten Variante. Im Adaptive Balancing wird die momentane Last der Server überprüft und z.B. bei einer Überlastung eines Servers die Lastverteilung geändert.

Als bestes Verfahren werden oft gewichtete Least Connections betrachtet. Dazu benötigt man aber oft spezielle Hardware. Ich möchte hier, um es einfach zu halten, das Round-Robin-Verfahren nutzen. Dazu muss man sich einen Server als Reverse-Proxy mit Nginx denken, der eine Lastverteilung auf drei Server bearbeitet. Dabei muss auf den Servern nicht zwangsläufig Nginx laufen, andere Webserver sind genauso möglich. Die Konfiguration ist dabei ohne große Probleme einzurichten. Beachten muss man allerdings, dass es beim Load-Balancing immer auch Probleme mit Sessions gibt. Nginx hat dafür aber eine Lösung und verwendet ein IP Hash-Verfahren, um so die Anfragen eines Clients immer auf denselben Server zu leiten.

Konfiguration des Reverse-Proxy

Konfiguration des Reverse-Proxy

Zuerst benötigt man eine allgemeine Datei, die ich proxy.conf nenne und in demselben Ordner speichere, in dem auch die Nginx-Configs liegen. Die proxy.conf sollte folgenden Inhalt haben:

proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 10m
client_body_buffer_size 128k;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;s
proxy_buffers 32 4k

Als Nächstes folgen die spezifischen Einstellungen für die Umgebung:

upstream backend {
  server servera.domain.com weight=5;
  server serverb.domain.com max_fails=3 fail_timeout=30s;
  server serverc.domain.com;
}
server {
  listen 80;
  server_name domain.com;
  access_log /var/www/domain.com/log/nginx.access.log;
  error_log /var/www/domain.com/log/nginx_error.log debug;
  #set your default location
  location / {
   include proxy.conf;
   proxy_pass http://backend;
  }
}

Wie man sehen kann, ist die Config nicht sehr kompliziert. Zuerst setzt man einen upstream, in diesem Fall mit den Namen backend, in welchem man die verschiedenen Backend-Server angibt. In unserem Beispiel stehen diese alle in derselben Domäne. Servera hat zusätzlich eine Gewichtung erhalten von 5. Der zweite Server wird bei 3 fehlerhaften Versuchen innerhalb von 30 Sekunden als inoperativ deklariert. Der dritte Server hat einfach eine Plain-Beschreibung.

Im Block server folgen die üblichen Einstellungen: Auf welchem Port soll der Server hören und unter welcher Domain läuft der Server. Als nächstes werden die Orte der Logs festgelegt. Und zum Schluss geben wir die location an, an der wir die Config-Datei einbinden, die wir oben erstellt haben, sowie geben an, welcher upstream genutzt werden soll. Damit haben wir eine einfach Last-Verteilung eingerichtet. Ich persönlich finde, Nginx macht dies für jeden verständlich und leicht erweiterbar.

Fazit: In diesem Artikel ging es um die Vorteile von Nginx. Ich wollte zeigen, wie leicht man Nginx konfigurieren kann. Durch seine Leichtfüßigkeit wird er immer mehr zu einem starken Apache-Konkurrenten. Dass Nginx auch schon bei vielen Seiten mit riesigen Besucherzahlen seit längerer Zeit genutzt wird, spricht für seine Verlässlichkeit. Die Weiterentwicklung wird durch eine eigens dafür gegründete Firma stark vorangetrieben. In Zukunft wird es direkt vom Entwickler kommerzielle Module zur Erweiterung von Nginx geben. Man darf auf jeden Fall sehr gespannt sein.

(dpe)

Sven Schannak

ist ein leidenschaftlicher Web-Entrepreneur, freiberuflicher Web-Entwickler und stolzer Coding-Monkey.

2 Kommentare

  1. Danke Sven. Das Funktionsprinzip eines Reverse-Proxy und Load-Balancing mit Nginx wurde hier sehr gut und nachvollziehbar dargestellt. Ohne viel Schnick-Schnack und komplizierten Erklärungen.

    Für Einsteiger echt Top!
    Vielen dank dafür.

  2. Verdammt spannendes Thema, gerade zwecks Load-Balancing, was bei großen Projekten immer irgendwann auftreten kann. Aber wenn ich mir die einfache konfiguration ansehe, könnte Nginx doch eine echte alternative werden. Einzig das fehlen wichtiger Module die der Apache bietet schreckt mich ab.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.