Nginx Anleitung · 9 min read · Jan 23, 2026

Nginx aus dem Quellcode auf Debian Squeeze erstellen

Nginx aus dem Quellcode auf Debian Squeeze erstellen

Version 1.0
Autor: Michel Käser

Dieses Tutorial beschreibt, wie Sie nginx aus dem Quellcode auf Debian Squeeze erstellen können. Zusätzlich werden wir einige nützliche 3rd-Party-Module wie das naxsi WAF (Webanwendungsfirewall), SPDY usw. einbeziehen.

Am Ende haben Sie eine vollständig funktionierende nginx-Installation.

Ich gebe keine Garantie, dass dies bei Ihnen funktioniert!

1 Anforderungen

Um diesem Tutorial zu folgen, benötigen Sie Folgendes:

  • einen dedizierten Server, der Debian Squeeze ausführt
  • etwa 30 Minuten Zeit, um sorgfältig zu lesen

2 Vorbemerkungen

In diesem Tutorial verwenden wir die Entwicklungsversion von nginx als unsere Quellbasis. Bitte beachten Sie, dass diese Versionen instabil sein können und nicht empfohlen werden, um auf einem Produktionsserver ausgeführt zu werden.

Einige Module wie SPDY erfordern jedoch nginx Version 1.3.1x oder höher - und persönlich würde ich sagen, dass es mehr oder weniger sicher ist, die Entwicklungsversion von nginx zu verwenden, da keine bekannten Exploits vorhanden sind.

3 Voraussetzungen

Da nginx in der Programmiersprache C geschrieben ist, müssen wir einige Pakete installieren, die uns beim Erstellen/Komplilieren des Quellcodes helfen. Ich bin ein großer Fan des apt-Paketmanagers, aber Sie können auch aptitude usw. verwenden:

apt-get -y install build-essential zlib1g-dev libpcre3 libpcre3-dev libbz2-dev libssl-dev tar unzip

Dies installiert alle erforderlichen Pakete wie gcc und make.

4 Herunterladen des nginx-Quellcodes

Die neueste Version von nginx finden Sie auf der folgenden Website: nginx.org/en/download.html. Zum Zeitpunkt des Schreibens ist es 1.3.12 - also werden wir herunterladen:

cd /tmp  
wget http://nginx.org/download/nginx-1.3.12.tar.gz

und den Quellcode entpacken:

tar -xzvf nginx-1.3.12.tar.gz

Wir werden unsere Version von nginx noch nicht erstellen, da wir zuerst einige 3rd-Party-Module herunterladen, die wir später einfügen werden.

5 Zusätzliche 3rd-Party-Module

Im Gegensatz zu Apache HTTPd, das das dynamische Laden von Modulen unterstützt (deshalb können wir sie aus Repositories installieren), enthält nginx eine solche Funktion nicht - und nach dem, was ich gelesen habe, ist es nichts, was auf der kurzfristigen Roadmap steht.

Wir müssen daher früh entscheiden, welche Module wir in unsere benutzerdefinierte Installation einfügen möchten. Es gibt eine schöne Übersicht/Tabelle auf der offiziellen nginx-Website, die die beliebtesten auflistet: wiki.nginx.org/3rdPartyModules.
Da es nicht alle verfügbaren Module enthält, empfehle ich Ihnen, eine Google-Suche wie: nginx redis module github durchzuführen, wenn Sie nach einem bestimmten Modul suchen - viele von ihnen sind auf Github gehostet.

5.1 Herunterladen der Module

Für dieses Tutorial werden wir einige wirklich großartige Module wie naxsi, SPDY und einige weniger bekannte herunterladen.

headers_more

Lassen Sie uns mit headers_more beginnen. Sie können es verwenden, um beispielsweise die Webserverinformationen vollständig zu verbergen, um die Serversicherheit zu erhöhen:

mkdir /tmp/nginx-modules  
cd /tmp/nginx-modules  
wget https://github.com/agentzh/headers-more-nginx-module/archive/v0.19.tar.gz  
tar -xzvf v0.19.tar.gz

Dies wird die neueste Version herunterladen und entpacken. Stellen Sie sicher, dass Sie das offizielle Repository von Zeit zu Zeit überprüfen, um zu sehen, ob eine neue Version verfügbar ist (gilt für alle anderen Module ebenfalls).

Cache Purge

Sie benötigen dieses Modul möglicherweise nicht für Ihre Einrichtung. Wenn Sie jedoch nginx vor Apache haben, das als Reverse-Proxy fungiert und die Ergebnisse von proxy_pass zwischenspeichert, könnte dies ein Gewinn sein! Andernfalls überspringen Sie es:

wget https://github.com/FRiCKLE/ngx_cache_purge/archive/2.0.tar.gz  
tar -xzvf 2.0.tar.gz

naxsi

Naxsi ist ein Open-Source-, hochleistungsfähiges, wartungsarmes Webanwendungsfirewall-Modul für nginx - sehr ähnlich zu mod_security in der Funktionalität. Wir werden es verwenden, um die Webanwendungen unserer Kunden abzusichern:

wget http://naxsi.googlecode.com/files/naxsi-core-0.49.tgz  
tar -xzvf naxsi-core-0.49.tgz

SPDY

SPDY ist ein Modul, das es Ihrem Webserver ermöglicht, die SPDY-Funktionen wie Stream-Multiplexing und Header-Kompression zu nutzen, und viele Leute sprechen darüber, dass es ein neuer Standard ist (was es anscheinend ist).

Upgrade von OpenSSL

Es erfordert OpenSSL 1.0.1+, etwas, das wir standardmäßig nicht auf unserer Squeeze-Maschine haben. Wir werden im Tutorial das Testing-Repository von Debian verwenden, um es zu installieren. Sie können es jedoch auch aus dem Quellcode kompilieren oder nach anderen Repositories suchen.

nano /etc/apt/sources.list

und die folgenden Zeilen einfügen:

deb http://ftp.debian.org/debian/ testing main contrib non-free
deb http://security.debian.org/ testing/updates main contrib non-free

Wir sollten nun verhindern, dass unser Server andere Pakete auf die Testversion aktualisiert. Wir können dies tun, indem wir die Datei /etc/apt/apt.conf.d/releases erstellen/bearbeiten:

nano /etc/apt/apt.conf.d/releases

und einfügen:

APT::Default-Release "squeeze";

Achtung: Wenn Sie auf stabile Repositories mit stable in Ihrer sources.list verweisen, sollten Sie squeeze im obigen Text durch stable ersetzen.

Jetzt können wir sicher ausführen:

apt-get update  
apt-get -t testing install openssl

was die vorhandene OpenSSL-Version aktualisiert/installiert.

Anwenden des Patches

Derzeit gibt es keine Möglichkeit, es wie andere Module einzufügen, stattdessen wird es als Patch für den nginx-Quellcode bereitgestellt. Die offizielle README finden Sie hier: nginx.org/patches/spdy/README.txt

cd /tmp/nginx-1.3.12  
wget http://nginx.org/patches/spdy/patch.spdy.txt  
patch -p1 < patch.spdy.txt

sollte die gesamte Magie für uns erledigen.

6 Nginx erstellen

Bis jetzt haben wir den nginx-Quellcode, einige zusätzliche 3rd-Party-Module dafür heruntergeladen und den SPDY-Patch angewendet. Es ist Zeit, unsere nginx-Installation zu erstellen.

Es ist wie bei allen C-Anwendungen - ein 3-Schritte-Prozess. Wir gehen im Detail durch den ersten Schritt:

./configure --help

Dies zeigt Ihnen eine Liste aller verfügbaren Konfigurationsoptionen für den Build, wie welche Module deaktiviert, aktiviert werden können usw. Meine sieht so aus (verkürzt):

--help                             print this message
 --prefix=PATH                      set installation prefix
 --sbin-path=PATH                   set nginx binary pathname
 --conf-path=PATH                   set nginx.conf pathname
 --error-log-path=PATH              set error log pathname
 --pid-path=PATH                    set nginx.pid pathname
 --lock-path=PATH                   set nginx.lock pathname
 --user=USER                        set non-privileged user for
                                     worker processes
 --group=GROUP                      set non-privileged group for
                                     worker processes
 --builddir=DIR                     set build directory
 --with-rtsig_module                enable rtsig module
 --with-select_module               enable select module
 --without-select_module            disable select module
 --with-poll_module                 enable poll module
 --without-poll_module              disable poll module
 --with-file-aio                    enable file AIO support
 --with-ipv6                        enable IPv6 support
 --with-http_ssl_module             enable ngx_http_ssl_module
 [...] 
 --with-http_stub_status_module     enable ngx_http_stub_status_module
 --without-http_charset_module      disable ngx_http_charset_module
 [...] 
 --without-http_browser_module      disable ngx_http_browser_module
 --without-http_upstream_ip_hash_module
                                     disable ngx_http_upstream_ip_hash_module
 --without-http_upstream_least_conn_module
                                     disable ngx_http_upstream_least_conn_module
 --without-http_upstream_keepalive_module
                                     disable ngx_http_upstream_keepalive_module
 --with-http_perl_module            enable ngx_http_perl_module
 --with-perl_modules_path=PATH      set Perl modules path
 --with-perl=PATH                   set perl binary pathname
 --http-log-path=PATH               set http access log pathname
 --http-client-body-temp-path=PATH  set path to store
                                     http client request body temporary files
 --http-proxy-temp-path=PATH        set path to store
                                     http proxy temporary files
 --http-fastcgi-temp-path=PATH      set path to store
                                     http fastcgi temporary files
 --http-uwsgi-temp-path=PATH        set path to store
                                     http uwsgi temporary files
 --http-scgi-temp-path=PATH         set path to store
                                     http scgi temporary files
 --without-http                     disable HTTP server
 --without-http-cache               disable HTTP cache
 --with-mail                        enable POP3/IMAP4/SMTP proxy module
 [...] 
 --without-mail_smtp_module         disable ngx_mail_smtp_module
 --with-google_perftools_module     enable ngx_google_perftools_module
 --with-cpp_test_module             enable ngx_cpp_test_module
 --add-module=PATH                  enable an external module
 --with-cc=PATH                     set C compiler pathname
 [...] 
 --with-cpu-opt=CPU                 build for the specified CPU, valid values:
                                     pentium, pentiumpro, pentium3, pentium4,
                                     athlon, opteron, sparc32, sparc64, ppc64
 --without-pcre                     disable PCRE library usage
 [...] 
 --with-pcre-jit                    build PCRE with JIT compilation support
 --with-md5=DIR                     set path to md5 library sources
 --with-md5-opt=OPTIONS             set additional build options for md5
 --with-md5-asm                     use md5 assembler sources
 --with-sha1=DIR                    set path to sha1 library sources
 --with-sha1-opt=OPTIONS            set additional build options for sha1
 --with-sha1-asm                    use sha1 assembler sources
 --with-zlib=DIR                    set path to zlib library sources
 --with-zlib-opt=OPTIONS            set additional build options for zlib
 --with-zlib-asm=CPU                use zlib assembler sources optimized
                                     for the specified CPU, valid values:
                                     pentium, pentiumpro
 --with-libatomic                   force libatomic_ops library usage
 --with-libatomic=DIR               set path to libatomic_ops library sources
 --with-openssl=DIR                 set path to OpenSSL library sources
 --with-openssl-opt=OPTIONS         set additional build options for OpenSSL
 --with-debug                       enable debug logging

Dies wird Ihnen sehr helfen, zu entscheiden, welche Module Sie einfügen/auslassen möchten, sowie was sonst noch definiert werden kann.

Wir werden den folgenden Konfigurationsbefehl verwenden:

./configure \
    --prefix=/usr/share/nginx \
    --sbin-path=/usr/sbin/nginx \
    --conf-path=/etc/nginx/nginx.conf \
    --pid-path=/var/run/nginx.pid \
    --lock-path=/var/lock/nginx.lock \
    --error-log-path=/var/log/nginx/error.log \
    --http-log-path=/var/log/access.log \
    --user=www-data \
    --group=www-data \
    --without-mail_pop3_module \
    --without-mail_imap_module \
    --without-mail_smtp_module \
    --without-http_fastcgi_module \
    --without-http_uwsgi_module \
    --without-http_scgi_module \
    --without-http_memcached_module \
    --with-ipv6 \
    --with-http_ssl_module \
    --with-http_spdy_module \
    --with-http_stub_status_module \
    --with-http_gzip_static_module \
    --add-module=/tmp/nginx-modules/headers-more-nginx-module-0.19 \
    --add-module=/tmp/nginx-modules/naxsi-core-0.49/naxsi_src \
    --add-module=/tmp/nginx-modules/ngx_cache_purge-2.0

was alles, was mit Mail und Handlern zu tun hat, ausschließt, die wir nicht benötigen (Sie benötigen sie möglicherweise, wenn Sie nicht als Reverse-Proxy ausgeführt werden!) und unsere heruntergeladenen 3rd-Party-Module und den SPDY-Patch einfügt.

Ich habe hier die Standardpfade von Debian verwendet, aber fühlen Sie sich frei, sie zu ändern.

Als nächstes können wir den Quellcode kompilieren:

make

Achtung: Wenn dies Fehler ausgibt, sollten Sie diese sorgfältig lesen, um zu sehen, wo das Problem liegt und was es ist.

Schließlich installieren Sie den kompilierten Quellcode:

make install

Dies kopiert alle Dateien an die richtigen Stellen. Fertig!

7 Autostart aktivieren

Debian verwendet Init-Skripte, über die Sie das Verhalten von Diensten steuern können. Ich verwende das aus dem offiziellen nginx-Paket - alle Credits gehören seinem Maintainer:

#!/bin/sh
### BEGIN INIT INFO
# Provides:          nginx
# Required-Start:    $local_fs $remote_fs $network $syslog
# Required-Stop:     $local_fs $remote_fs $network $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: startet den nginx-Webserver
# Description:       startet nginx mit start-stop-daemon
### END INIT INFO
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=/usr/sbin/nginx
NAME=nginx
DESC=nginx
# Include nginx default if available
if [ -f /etc/default/nginx ]; then
  . /etc/default/nginx
fi
test -x $DAEMON || exit 0
set -e
. /lib/lsb/init-functions
test_nginx_config() {
    if $DAEMON -t $DAEMON_OPTS >/dev/null 2>&1; then
        return 0
    else
        $DAEMON -t $DAEMON_OPTS
        return $?
    fi
}
case "$1" in
    start)
        echo -n "Starte $DESC: "
        test_nginx_config
        # Überprüfen, ob das ULIMIT in /etc/default/nginx gesetzt ist
        if [ -n "$ULIMIT" ]; then
            # Setzen der ulimits
            ulimit $ULIMIT
        fi
        start-stop-daemon --start --quiet --pidfile /var/run/$NAME.pid \
            --exec $DAEMON -- $DAEMON_OPTS || true
        echo "$NAME."
        ;;
    stop)
        echo -n "Stoppe $DESC: "
        start-stop-daemon --stop --quiet --pidfile /var/run/$NAME.pid \
            --exec $DAEMON || true
        echo "$NAME."
        ;;
    restart|force-reload)
        echo -n "Neustarten von $DESC: "
        start-stop-daemon --stop --quiet --pidfile \
            /var/run/$NAME.pid --exec $DAEMON || true
        sleep 1
        test_nginx_config
        # Überprüfen, ob das ULIMIT in /etc/default/nginx gesetzt ist
        if [ -n "$ULIMIT" ]; then
            # Setzen der ulimits
            ulimit $ULIMIT
        fi
        start-stop-daemon --start --quiet --pidfile \
            /var/run/$NAME.pid --exec $DAEMON -- $DAEMON_OPTS || true
        echo "$NAME."
        ;;
    reload)
        echo -n "Lade $DESC-Konfiguration neu: "
        test_nginx_config
        start-stop-daemon --stop --signal HUP --quiet --pidfile /var/run/$NAME.pid \
            --exec $DAEMON || true
        echo "$NAME."
        ;;
    configtest|testconfig)
        echo -n "Teste $DESC-Konfiguration: "
        if test_nginx_config; then
            echo "$NAME."
        else
            exit $?
        fi
        ;;
    status)
        status_of_proc -p /var/run/$NAME.pid "$DAEMON" nginx && exit 0 || exit $?
        ;;
    *)
        echo "Verwendung: $NAME {start|stop|restart|reload|force-reload|status|configtest}" >&2
        exit 1
        ;;
esac
exit 0

Vergessen Sie nicht, chmod auszuführen:

chmod 755 /etc/init.d/nginx

Wir können auch eine Debian-Standarddatei erstellen:

nano /etc/default/nginx

und einfügen:

# Hinweis: Sie möchten möglicherweise die folgende Seite ansehen, bevor Sie das ULIMIT festlegen.
#  http://wiki.nginx.org/CoreModule#worker_rlimit_nofile
# Setzen Sie die ulimit-Variable, wenn Sie die Standardwerte ändern müssen.
#  Beispiel: ULIMIT="-n 4096"
#ULIMIT="-n 4096"

Zu guter Letzt, wenn Sie nginx beim Booten automatisch starten möchten, können Sie Folgendes ausführen:

update-rc.d nginx defaults

8 Besondere Modul-Direktiven

Wir werden hier nicht durch die nginx-Konfiguration und vhost-Dateien gehen, aber die folgenden Direktiven aus unseren Modulen sind interessant:

# SPDY-Modul (vhost)
listen 443 ssl spdy;
# more_headers-Modul (http)
more_clear_headers 'Server'; # entfernt Serverinformationen

naxsi

naxsi ist etwas komplexer. Zuerst sollten die globalen Konfigurationsregeln im http-Abschnitt der nginx-Konfigurationsdatei enthalten sein:

nano /etc/nginx/nginx.conf

und einfügen:

http {
    [...]
        include /etc/nginx/naxsi_core.rules;
    [...]
}

Achtung: Stellen Sie sicher, dass diese Datei existiert. Sie können die naxsi-Konfigurationsdateien aus dem heruntergeladenen Archiv kopieren (siehe: Zusätzliche 3rd-Party-Module).

Als nächstes müssen Sie die Standardregeln in Ihre vhost-Vorlage einfügen:

[...]
location / {
    include /etc/nginx/naxsi.rules;
    [...]
}
[...]

und einen Standort für blockierte Anfragen:

[...]
location /blocked {
    return 403;
    #proxy_pass http://127.0.0.1:4242; # Lernmodus
}
[...]

Achtung: Stellen Sie sicher, dass der Standort für blockierte Anfragen mit dem aus der Konfigurationsdatei /etc/nginx/naxsi.rules übereinstimmt:

LearningMode;
SecRulesEnabled;
#SecRulesDisabled;
DeniedUrl "/blocked";
[...]

Wie Sie sehen können, hat naxsi einige seltsame Optionen, aber sie sind nicht seltsam. Sie sollten sich die Dokumentation ansehen, um zu lesen, wie Sie es am besten zum Laufen bringen. Ein Hinweis, nach dem ich sehr lange gesucht habe: Sie müssen ein Python-Skript ausführen und blockierte Anfragen während des Lernmodus an es übergeben, um eine Whitelist für falsche Alarme zu erstellen.

9 Links / Credits

Share: X/Twitter LinkedIn

Erhalte neue Beiträge in deinem Posteingang.

Kein Spam. Jederzeit abmelden.