Nginx auf Debian Squeeze installieren und konfigurieren

Mittlerweile kenne ich die Webserver Apache und lighttpd recht gut und setze beide produktiv auf mehreren Servern ein. Leider gibt es für mich keinen klaren Favoriten den man in jeder Lebenslage empfehlen kann. Ich entscheide eher anhand der anstehenden Aufgaben welchen Webserver ich einsetzen möchte. Dabei spielen natürlich nicht nur die Funktionen eine Rolle, sondern auch die Performance. Deshalb habe ich mir den als sehr performant geltenden Nginx (ausgesprochen: engine x) angesehen und wie der Zufall will auch gleich einen produktiven Anwendungsfall gefunden.
Nginx ist ein high perfomance Webserver und Reverse Proxy. Er ist kostenlos, wird als Open Source entwickelt und kann auch als IMAP/POP3 Proxy eingesetzt werden. Das erste Release wurde 2004 von Igor Sysoev veröffentlicht und seit dem vergrößert sich die Anzahl von Webseiten die auf Nginx setzen ständig. Er wurde aus dem gleichen Grund geschrieben wie lighttpd, nämlich um dem C10K Problem zu begegnen. Mittlerweile ist Nginx für seine hohe Performance, Stabilität, Funktionsvielfalt, einfache Konfiguration und vor allem durch seinen niedrigen Ressourcenverbrauch bekannt.
Anders als traditionelle Webserver, baut nginx nicht auf Threads auf um Anfragen zu verarbeiten. Stattdessen findet eine viel besser skalierende ereignisbasierte (asynchrone) Architektur Verwendung. Diese Architektur benötigt nur eine geringe, und viel wichtiger, vorhersehbare Speichermenge unter Last.
Auch wenn Sie nicht damit rechnen tausende Anfragen verarbeiten zu müssen, können Sie trotzdem von der Leistungsfähigkeit und dem geringen Speicherverbrauch von Nginx profitieren. Nginx skaliert in alle Richtungen: vom kleinen VPS bis zum großen Server-Cluster.
Nginx wird bei vielen bekannten high Traffic Webseiten eingesetzt wie zum Beispiel: WordPress.com, Golem.de, Github.com und Magentocommerce. Ich habe im FireFox das Addon Server Spy installiert, das anzeigt auf welchem Webserver die aktuelle Website läuft und Nginx sehe ich hier immer öfter.
Inhaltsverzeichnis
- Nginx Installation mit Debian Squeeze Bordmitteln
- Nginx Installation mit Debian Lenny Bordmitteln
- Nginx selbst kompilieren auf Debian Squeeze
- Nginx konfigurieren
- Nginx und PHP
- Nginx komplett entfernen
Nginx Installation mit Debian Squeeze Bordmitteln
Debian Squeeze beinhaltet die Version 0.7.67, die als Legacy Stable Version bezeichnet wird. Die Installation ist gewohnt einfach.
$ aptitude install nginx
Die Konfiguration findet man unter /etc/nginx, wobei die nginx.conf die Hauptkonfiguration ist. Die Logfiles landen in /var/log/nginx.
Problem: Address family not supported by protocol: Auf meinem Test Server startete der Server nicht. Stattdessen sah ich diese Fehlermeldung. Nach kurzem googlen war das Problem aber schnell gefunden. Da mein Server kein IPv6 Support hat, muss man diesen aus der Config entfernen (auskommentieren). Danach startet der Server ganz normal.
#listen [::]:80 default ipv6only=on; ## listen for ipv6
$ /etc/init.d/nginx start Starting nginx: the configuration file /etc/nginx/nginx.conf syntax is ok [emerg]: socket() [::]:80 failed (97: Address family not supported by protocol) configuration file /etc/nginx/nginx.conf test failed $ nano /etc/nginx/sites-available/default $ /etc/init.d/nginx start
Neuere Nginx Versionen sagen das etwas deutlicher. Hier die Fehlermeldung von einem 0.8.54 Nginx.
Starting nginx: [emerg]: the INET6 sockets are not supported on this platform in "[::]:80" of the "listen" directive in /etc/nginx/sites-enabled/default:10 configuration file /etc/nginx/nginx.conf test failed
In der Debian Doku wird noch ein weiteres Problem angesprochen das beim starten des Servers auftreten kann: could not build the server_names_hash, you should increase server_names_hash_bucket_size: 32: Wenn man diese Meldung erhält soll man die Variable server_names_hash_bucket_size in der nginx.conf erhöhen. Weitere Informationen gibt es im Nginx Wiki
Jetzt kann man die IP des Servers oder den Hostnamen im Browser aufrufen. Da das Nginx Paket das Verzeichnis /var/www nicht anlegt, bekommt man erst mal eine "404 Not Found" Meldung. Man muss sich erst selbst darum kümmern wenn es noch nicht existiert. Danach sieht man dann seine Hallo Welt Seite.
$ mkdir /var/www $ echo 'Hallo Welt' > /var/www/index.htm $ chown -R www-data:www-data /var/www
Nginx Installation mit Debian Lenny Bordmitteln
Debian Lenny bringt ebenfalls ein Nginx Pakete in der Version 0.6.32 mit.
$ aptitude install nginx $ /etc/init.d/nginx start
Auch hier findet man die Konfiguration unter /etc/nginx und die Logfiles landen in /var/log/nginx. Hier hatte ich keine Probleme den Server zu starten und die Webseite war sofort erreichbar. /var/www/ wird bei Debian Lenny automatisch angelegt.
Nginx selbst kompilieren auf Debian Squeeze
Möchte man eine aktuellere Version als die von Debian mitgelieferte haben oder man benötigt zusätzliche Module (bei Nginx muss man alle Module beim kompilieren angeben, es gibt kein nachladen von Modulen wie bei Apache oder lighttpd üblich), kann man den Server auch selbst kompilieren. Auf Debian installiert man dafür als erstes Nginx normal über den Paketmanager und entfernt ihn anschließend wieder. Damit hat man schon ein init Script.
$ aptitude install nginx $ aptitude remove nginx $ find / | grep 'nginx' /etc/nginx /etc/nginx/nginx.conf /etc/init.d/nginx /etc/logrotate.d/nginx ...
Jetzt installiert man die build-essentials und ein paar weitere benötigte Pakete, besorgt sich einen aktuellen Source Tarball und entpacken diesen. Es kann sein das noch weitere Pakete gebraucht werden, wenn man andere Module benutzen möchte. Einfach nach dem Namen suchen und das dazugehörige "-dev" Paket installieren.
$ aptitude search brauchisch $ aptitude install brauchisch-dev
Hier gibt es eine Übersicht über die Configure Parameter.
$ aptitude install build-essential libpcre3-dev libssl-dev $ wget http://nginx.org/download/nginx-0.8.54.tar.gz $ tar xvfz nginx-0.8.54.tar.gz $ cd nginx-0.8.54 $ ./configure --prefix=/usr --conf-path=/etc/nginx/nginx.conf --sbin-path=/usr/sbin \ --user=www-data --group=www-data --http-log-path=/var/log/nginx/access.log \ --without-mail_pop3_module --without-mail_imap_module --without-mail_smtp_module \ --with-http_ssl_module --with-http_stub_status_module --with-http_gzip_static_module Configuration summary + using system PCRE library + using system OpenSSL library + md5: using OpenSSL library + sha1 library is not used + using system zlib library $ make && make install
Das war es schon. Möglicherweise muss man noch die nginx.conf anpassen, aber dann kann man den Server auch schon starten. Zum updaten die Schritte wiederholen und vor dem make install den Server anhalten.
Nginx konfigurieren
Die Konfiguration von Nginx ist sehr verständlich, wie diese einfache Beispiel Config zeig. Die Befehlsnamen sind meistens selbsterklärend und wenn nicht, kann man sie im Nginx Wiki nachschlagen. Für die Default Config gibt es hier auch eine schöne Erklärung der einzelnen Befehle.
- worker_processes: Standard ist 1. Mit worker_processes kann man die Anzahl an Worker Prozessen steuern. Das macht Sinn wenn man ein Multi Prozessor System hat und diese per Nginx benutzen möchte. Lässt man es auf 1 stehen, wird auch nur 1 Prozessor Kern von Nginx benutzt. Setzt man es auf 4, wird die Last auf 4 Prozessorkerne verteilt. Anhand des worker_processes und des worker_connections Wertes, kann man max_clients berechnen: max_clients = worker_processes * worker_connections
- worker_connections: Dient zur Bestimmung der maximalen Anzahl an gleichzeitigen Verbindungen und damit der maximalen Anzahl an Clients. Die Berechnung von max_clients verändert sich wenn Nginx als Reverse Proxy eingesetzt wird. max_clients = worker_processes * worker_connections / 4
user www-data;
worker_processes 1;
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
access_log /var/log/nginx/access.log;
index index.html index.htm;
sendfile on;
keepalive_timeout 30;
tcp_nodelay on;
include /etc/nginx/conf.d/*.conf;
server {
listen 80 default;
server_name localhost;
root /var/www;
}
}
Nginx und PHP
Um Nginx und PHP zusammen zu führen gibt es mehrere Wege. Man kann PHP Aufrufe an einen dahinter liegenden Apache/lighttpd weiterreichen, man kann PHP per FastCGI und spawn-fcgi von lighttpd zum laufen bringen oder man benutzt das neue php-fpm. Letzteres scheint mir der stabilste, zukunftsweisende und wenn richtig konfiguriert auch der performanteste Weg zu sein. Aktuell gibt es aber kein offizielles Debian Paket dafür (außer in Sid), deshalb muss man es entweder selbst kompilieren oder auf fremde Pakete (z.B. dotdeb.org) zurückgreifen. Da ich die Konfiguration von php-fpm näher beschreiben möchte und dies diesen Artikel sprengen würde, wird dies in einem weiteren Artikel behandelt. Wer es nicht abwarten kann, kann einfach nach nginx php-fpm debian googlen.
Nginx komplett entfernen
Will man Nginx wieder komplett entfernen, hilft einem der Paketmanager, wenn man Nginx wie beschrieben vor dem kompilieren installiert hat. Erst den Webserver stoppen und dann aptitude purge aufrufen. Dann muss man nur noch ein paar Dateien löschen.
$ /etc/init.d/nginx stop $ aptitude purge nginx $ rm -rf /usr/src/nginx* $ find / | grep 'nginx' /var/cache/apt/archives/nginx_0.7.67-3_amd64.deb /usr/sbin/nginx $ rm /var/cache/apt/archives/nginx_0.7.67-3_amd64.deb /usr/sbin/nginx
Related Links:
- Offiziele englische Nginx Webseite | Russische Version
- Nginx Forum
- Englisches Wiki | Die deutsche Version des Nginx Wiki
- Anleitung zur Installation von Nginx aus Sourcen auf einem Debian System
- Sammlung von schlechten Config's die man im Netz findet
- How nginx "location if" works: Anleitung wie man if in location benutzt
Clément Nedelcu hat das erste Buch zu und über nginx verfasst. Dabei werden im Buch Themen wie das Herunterladen, die Installation, Konfiguration, das verwenden von Modulen und vieles mehr behandelt. Weiters sind Tutorien enthalten wie die eigenen Server sukzessive durch nginx ersetzt werden können. Gut kommentierte Konfigurationsbeispiele und tief gehende Modulbeschreibungen runden das Ganze ab. Das Buch ermöglicht es Einsteigern aber auch Fortgeschrittenen die gesamte Leistung aus nginx heraus zu holen.
3 Kommentare
biwebco
schrieb am 21.03.2011 um 10:17 Uhr
>”Nginx selbst kompilieren auf Debian Squeeze”
Ich denke es wäre einfacher unstable repo für nginx und dependencies: libgeoip zu verwenden statt ständig zu kompilieren.
kostaki
schrieb am 23.03.2011 um 09:39 Uhr
Stimmt schon, aber jedem das seine.
Geht ja auch nicht nur um die aktuellere Version, sondern auch wenn du 3rd Party Module brauchst kommst du um selbst kompilieren nicht mehr herum. Beim php5-fpm komme ich zum Beispiel nicht herum außer ich füge unstable hinzu.
Thurn
schrieb am 27.04.2011 um 15:13 Uhr
Auf Dotdeb ( http://www.dotdeb.org ) gibt es nginx 1.0.0 und auch viele andere Packages für Debian vorcompiliert und ready to go. Ich benutze dotdeb seit Jahren auf meinen Servern – funktioniert einwandfrei, da es ein reiner “Package-Service” ist.