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 unzipDies 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.gzund den Quellcode entpacken:
tar -xzvf nginx-1.3.12.tar.gzWir 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.gzDies 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.gznaxsi
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.tgzSPDY
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.listund 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-freeWir 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/releasesund 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 opensslwas 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.txtsollte 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 --helpDies 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 loggingDies 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.0was 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:
makeAchtung: 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 installDies 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 0Vergessen Sie nicht, chmod auszuführen:
chmod 755 /etc/init.d/nginxWir können auch eine Debian-Standarddatei erstellen:
nano /etc/default/nginxund 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 defaults8 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 Serverinformationennaxsi
naxsi ist etwas komplexer. Zuerst sollten die globalen Konfigurationsregeln im http-Abschnitt der nginx-Konfigurationsdatei enthalten sein:
nano /etc/nginx/nginx.confund 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
Erhalte neue Beiträge in deinem Posteingang.
Kein Spam. Jederzeit abmelden.