Nginx auf Debian Squeeze installieren und konfigurieren

2011-03-20 - kostaki 3 Kommentare »

Nginx Logo

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

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:

Wer lieber ein Buch in der Hand hat, kann sich das derzeit einzige Nginx Buch (englisch) auf dem Markt besorgen. Ich habe es selbst noch nicht, aber ich schließe aus den Amazon.com Rezensionen, das es sich für Einsteiger eignet.

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.

  1. 3 Kommentare

  2. 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.

  3. 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.

  4. 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.

Kommentar schreiben

*

*