Nginx: Webserver – klein und schnell
Klein, aber oho!
Wenn es um Webserver geht, fällt den meisten Administratoren zuerst Apache ein, der in der globalen Statistik des Web auch den ersten Rang belegt (Abbildung 1). Kleinere und schnellere Alternativen gewinnen aber immer mehr Anhänger, etwa Lighttpd und Cherokee.
Als zusätzlicher Wettbewerber stieg vor einiger Zeit der Nginx-Server (englisch ausgesprochen Engine-ex) in den Ring [1]. Er steht für hohe Performance, Stabilität, umfangreiche Features, einfache Konfiguration und geringen Ressourcenverbrauch. Das Resultat der Bemühungen des Programmierers Igor Sysoev verrichtet seinen Dienst in vielen großen Sites, zum Beispiel Wordpress.com, Hulu und Linuxquestions.org. Ungewöhnlich: Außer als Webserver kann Nginx auch als Proxy für die Mailprotokolle IMAP und POP3 auftreten.
In der Domäne HTTP kann Nginx die folgenden Fähigkeiten vorweisen: statische Dateien ausliefern, reverse Proxying mit optionalem Caching, fehlertolerantes Load Balancing, remote Fast-CGI mit Caching/Beschleunigung und SSL/TLS Server Name Indication (SNI), was die Notwendigkeit einer eigenen IP-Adresse zur SSL-Konfiguration für jeden virtuellen Server überflüssig macht.
Wie Apache ist Nginx modular aufgebaut und bietet einiges an Funktionalität über Module an, die der Administrator aktivieren oder deaktivieren kann. Anders als der Prozess-basierte Apache verarbeitet Nginx alle Anfragen asynchron und skaliert dadurch wesentlich besser.
Wenn Sie nur eine einfache Site betreiben oder gerade ein Projekt neu starten, können Sie möglicherweise auch komplett auf Apache verzichten. Am besten werfen Sie einen Blick auf die Modules-Seite von Nginx [2] und prüfen, ob die Module ihre Ansprüche befriedigen. Dieser Artikel beschreibt einen typischen Aufbau, in dem Nginx als die Last ausgleichender Revery Proxy vor mehreren Apache-Backends arbeitet. Nginx liefert einen Teil der statischen Inhalte aus und komprimiert selbsttätig die dynamischen Seiten, die vom Apache kommen.
Die meisten Linux-Distributionen führen Nginx-Pakete in ihren Repositories, sodass sich der Server leicht über den Paketmanager installieren lässt. Wenn das Paket zu alt ist oder ganz fehlt, finden Sie den Quellcode auf der Nginx-Homepage. Die Installation läuft über die typischen Configure- und Make-Aufrufe. Obwohl die Defaults in den meisten Fällen wohl in Ordnung sind, sollten Sie einen Blick auf die Konfiguration werfen und sie gegebenenfalls anpassen.
Die Ausgabe von Configure sieht typischerweise etwa so aus:
Configuration summary + using system PCRE library + using system OpenSSL library + md5: using OpenSSL library + using sha1 library: /usr/include + using system zlib library
Sie sollten sicherstellen, dass die geforderten Bibliotheken auch installiert sind, wenn Sie die entsprechende Funktionalität nutzen möchten. So erfordert Rewrite beispielsweise die PCRE-Library, und SSL setzt die Open-SSL-Bibliothek voraus.
Einstellungssache
Dieser Artikel bezieht sich auf eine aus drei Servern bestehende Infrastruktur. Der Computer mit Nginx befindet sich im Internet vor den beiden Rechnern, die dahinter im privaten Netz stehen. Sie haben deshalb auch keine IP-Adresse im Internet. Tabelle 1 fasst das Layout zusammen. Die zugehörige Konfigurationsdatei »nginx.conf«
sieht aus wie in Listing 1.
Tabelle 1
Layout
| Rechner | Frontend-IP | Backend-IP |
|---|---|---|
| nginx | 10.0.0.1 | 192.168.1.1 |
| web01 | keine | 192.168.1.2 |
| web02 | keine | 192.168.1.3 |
Listing 1
nginx.conf
01 user nobody;
02 worker_processes 2;
03
04 events {
05 worker_connections 1024;
06 use epoll;
07 }
08
09 http {
10 include mime.types;
11 default_type application/octet-stream;
12 log_format custom '$http_host $remote_addr - $remote_user [$time_local] "$request" '
13 '$status $body_bytes_sent "$http_referer" '
14 '"$http_user_agent"';
15 access_log /path/to/access.log custom;
16 sendfile on;
17 server_tokens off;
18
19 upstream cluster {
20 server 192.168.1.2 weight=1; // the weight can be adjust to send more
21 server 192.168.1.3 weight=1; // traffic to specific machine(s).
22 }
23
24 server {
25 listen 10.0.0.1:80;
26 server_name www.domain.com domain.com;
27 location / {
28 proxy_pass http://cluster;
29 proxy_redirect off;
30 proxy_set_header Host $host;
31 proxy_set_header X-Real-IP $remote_addr;
32 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
33 proxy_buffers 8 32k;
34 }
35 }
36 }
Diese Konfiguration führt zu dem Ergebnis, dass beide Backend-Server ungefähr gleich viele Zugriffe abbekommen. Per Default führt Nginx ein einfaches Load Balancing nach der Round-Robin-Methode durch, das heißt, bei jeder Anfrage ist einfach der nächste Backend-Server dran. Um eine Verteilung basierend auf der IP-Adresse des anfragenden Clients zu realisieren, bietet Nginx die Konfigurationsdirektive »ip_hash«
. Ausgefeiltere Load-Balancing-Methoden sind für künftige Nginx-Versionen geplant.
Ohne weiteres Zutun kommen die Requests bei den Backend-Servern alle mit der IP-Adresse des Nginx-Frontends an. Am besten übergeben Sie die IP-Adresse der ursprünglichen Anfrage mit dem HTTP-Header »X-Forwarded-For«
und verarbeiten sie in den Apache-Prozessen mit dem Modul »mod_rpaf«
weiter. Es schreibt die Remote-Adresse wieder um, sodass andere Apache-Module die gewünschte Information erhalten. Das freie Modul finden Sie auf der Website [3].
SSL-sicher
Nginx als SSL-Proxy zu verwenden bringt mehrere Vorteile. Die Apache-Konfiguration vereinfacht sich, die CPU-Belastung durch SSL-Verschlüsselung wird verringert und das Load Balancing wird einfacher, da der Admin sich nicht um SSL-Sessions kümmern muss. SSL mit Nginx einrichten ist einfach und setzt die gleichen CRT- und KEY-Dateien voraus wie sonst Apache. Die zusätzlichen Einstellungen zeigt Listing 2.
Listing 2
SSL-Konfiguration
01 server {
02 listen 10.0.0.1:443;
03 server_name www.domain.com;
04 add_header Front-End-Https on;
05 keepalive_timeout 70;
06 ssl on;
07 ssl_certificate /path/to/server.crt;
08 ssl_certificate_key /path/to/server.key;
09
10 location / {
11 proxy_pass http://cluster;
12 proxy_redirect off;
13 proxy_set_header Host $host;
14 proxy_set_header X-Real-IP $remote_addr;
15 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
16 proxy_buffers 4 32k;
17 proxy_set_header X-Forwarded-Proto https;
18 }
19 }
20 }
Allerdings gibt es zwei Einschränkungen beim Nginx-SSL-Support. Die Stable-Version beherrscht keine Revocation Lists, mit denen sich Zertifikate ungültig machen lassen. In der Entwicklerversion ist diese Funktion aber bereits unterstützt. Außerdem lassen sich Chain-Zertifikate nicht wie bei Apache in extra Dateien verwalten. Stattdessen muss der Administrator die Daten des Chain-Zertifikats an das Hauptzertifikat anhängen, zum Beispiel mit »cat chain.crt >> server.crt«
. Danach braucht er sich nicht weiter um das Chain-Zertifikat zu kümmern, sondern kann wie gehabt mit dem im Konfigurationspunkt »ssl_certificate«
angegebenen Zertifikat arbeiten.
Diesen Artikel als PDF kaufen
Express-Kauf als PDF
Preis € 1,99
(inkl. 19% MwSt.)
Im ADMIN Online-Archiv
Abonnieren Sie das ADMIN Online-Archiv, und Sie erhalten Zugriff auf alle ADMIN-Artikel im HTML- und/oder PDF-Format.