nginx installieren: Eine Einführung
Üblicherweise wird nginx unter Ubuntu folgendermaßen installiert:
apt-get install nginx
Das war es schon.
Damit bekommt man aber nie die aktuellste Version. Um diese zu bekommen, muss das Repository hinzugefügt werden. Dann sieht das ganze so aus:
sudo add-apt-repository -y ppa:nginx/stable
sudo apt-get update
sudo apt-get install nginx
Damit bekommt man zwar die aktuellste stabile Version installiert, allerdings hat man auch hier nicht die Möglichkeit, zusätzliche Module (wie z. B. Google Pagespeed oder das HTTP Upload Modul) hinzuzufügen. Im Gegensatz zum Apache Webserver müssen Zusatzmodule bei nginx mit einkompiliert werden. Nur die Änderung der Serverkonfiguration reicht dabei nicht aus.
Um die Zusatzmodule nutzen zu können, muss nginx also selbst kompiliert werden.
Normalerweise ist es ziemlich einfach, den nginx Server einfach neu zu kompilieren. Damit würde man aber auf viele wichtige Annehmlichkeiten verzichten, die das Debian Paket mit sich bringt. Das Paket ppa:nginx/stable sorgt u.a. dafür, dass nginx überwacht und nach dem booten automatisch gestartet wird. Auch die Rotation der Logfiles wird damit gewährleistet. Wenn man nginx selbst kompiliert müsste man das alles selbst konfigurieren. Wir wollen aber weder darauf verzichten, noch alles von Grund auf neu konfigurieren.
Mit dem Repository können wir:
- die Quellen und deren Abhängigkeiten runterladen
- unsere Zusatzmodule zum
ppa:nginx/stablePaket hinzufügen - das Paket neu erstellen
- nginx neu installieren
Zusatzmodule runterladen
Bevor wir mit den Abhängigkeiten des nginx Paketes weitermachen, downloaden wir erstmal die benötigten Zusatzmodule.
Dazu laden wir zunächst erstmal das Pagespeed Modul (aktuellste Version 1.10.33.1 zum Zeitpunkt der Erstellung des Artikels) nach Anleitung. Der Vollständigkeit halber haben wir das "sudo" noch ergänzt:
sudo mkdir /opt/pagespeed
cd /opt/pagespeed
NPS_VERSION=1.10.33.1
sudo wget https://github.com/pagespeed/ngx_pagespeed/archive/release-${NPS_VERSION}-beta.zip
sudo unzip release-${NPS_VERSION}-beta.zip
cd ngx_pagespeed-release-${NPS_VERSION}-beta/
sudo wget https://dl.google.com/dl/page-speed/psol/${NPS_VERSION}.tar.gz
sudo tar -xzvf ${NPS_VERSION}.tar.gz # entpackt nach psol/
# Erzeugt das Verzeichnis /opt/pagespeed/ngx_pagespeed-release-1.10.33.1-beta
Danach laden wir das HTTP Upload Modul (aktuellste Version ist 2.2) nach Anleitung:
sudo mkdir /opt/httpupload
cd /opt/httpupload
sudo wget https://github.com/vkholodkov/nginx-upload-module/archive/2.2.zip
sudo unzip 2.2.zip
# Erzeugt das Verzeichnis /opt/httpupload/nginx-upload-module-2.2
nginx Quellcode und Abhängigkeiten
Jetzt kommen wir zu dem Teil, der für euch etwas ungewohnt sein könnte. Wir holen uns den nginx Quellcode vom ppa:nginx/stable Paket, passen ihn an, erzeugen das Paket neu und installieren letztlich nginx neu.
Zuerst lassen wir uns diese Datei anzeigen und stellen sicher, dass die deb-src Direktive nicht auskommentiert wurde:
$ cat /etc/apt/sources.list.d/nginx-stable-trusty.list
deb http://ppa.launchpad.net/nginx/stable/ubuntu trusty main
# deb-src http://ppa.launchpad.net/nginx/stable/ubuntu trusty main
Wenn - so wie hier - eure deb-src Zeile auskommentiert ist, bearbeitet (z. B. mit vi oder nano ) diese Datei und entfernt das # Zeichen:
$ cat /etc/apt/sources.list.d/nginx-stable-trusty.list
deb http://ppa.launchpad.net/nginx/stable/ubuntu trusty main
deb-src http://ppa.launchpad.net/nginx/stable/ubuntu trusty main
Anschließend muss ein Update der Paketquellen durchgeführt werden:
sudo apt-get update
Jetzt können wir damit fortfahren, den Quellcode von nginx runterzuladen, ihn anzupassen, das Paket neu zu erstellen und zu installieren!
Zuerst laden wir das Quellcode Paket und alle benötigten Abhängigkeiten:
# Installiert die Tools um das Paket erstellen zu können
sudo apt-get install -y dpkg-dev
sudo mkdir /opt/rebuildnginx
cd /opt/rebuildnginx
# nginx Quellcode runterladen (ppa:nginx/stable)
sudo apt-get source nginx
# benötigte Abhängigkeiten installieren
sudo apt-get build-dep nginx
Danach passen wir die sogenannten build Dateien an, um die Zusatzmodule zu integrieren. Zum Zeitpunkt der Erstellung dieses Artikels ist die aktuellste stabile nginx Version auf Ubuntu Trusty die 1.8.0.
$ ls -lah /opt/rebuildnginx
drwxr-xr-x 10 root root 4096 Dec 14 16:37 nginx-1.8.0/
-rw-r--r-- 1 root root 934244 Dec 14 02:10 nginx_1.8.0-5+trusty0.debian.tar.gz
-rw-r--r-- 1 root root 2798 Dec 14 02:10 nginx_1.8.0-5+trusty0.dsc
-rw-r--r-- 1 root root 804164 Sep 18 21:31 nginx_1.8.0.orig.tar.gz
Um diese Zusatzmodule nun in das Paket zu integrieren, bearbeiten wir die Datei /opt/rebuildnginx/nginx-1.8.0/debian/rules . Bei ppa:nginx/stable kommt nginx in verschiedenen Paketen: common , light , full und extras . Wenn nginx mit apt-get install nginx installiert wird, wird die "full" Version installiert.
Das "common" Paket ist die Basis, auf der die anderen Pakete aufgebaut sind. Das "light" Paket hat sogar noch ein paar weniger Features als das "common" Paket, da hier die --without-* Flags genutzt werden.
Für unser Beispiel bearbeiten wir die "full" Version um unsere Module hinzuzufügen. Das setzt voraus, dass wir bei der Installation dann auch das "full" Paket nutzen.
Die Datei rules beinhaltet die Konfiguration des "full" Paketes. Und so soll es aussehen, wenn unsere Zusatzmodule durch die zwei Zeilen am Ende mit ergänzt wurden:
full_configure_flags := \
$(common_configure_flags) \
--with-http_addition_module \
--with-http_dav_module \
--with-http_geoip_module \
--with-http_gzip_static_module \
--with-http_image_filter_module \
--with-http_spdy_module \
--with-http_sub_module \
--with-http_xslt_module \
--with-mail \
--with-mail_ssl_module \
--add-module=$(MODULESDIR)/nginx-auth-pam \
--add-module=$(MODULESDIR)/nginx-dav-ext-module \
--add-module=$(MODULESDIR)/nginx-echo \
--add-module=$(MODULESDIR)/nginx-upstream-fair \
--add-module=$(MODULESDIR)/ngx_http_substitutions_filter_module \
--add-module=/opt/httpupload/nginx-upload-module-2.2 \
--add-module=/opt/pagespeed/ngx_pagespeed-release-1.10.33.1-beta
Sobald die Datei bearbeitet und gespeichert wurde, können wir das nginx Paket neu erstellen:
cd /opt/rebuildnginx/nginx-1.8.0
sudo dpkg-buildpackage -b
Das kann dann etwas dauern.
nginx installieren
Sobald die Paketerstellung fertig ist, finden wir etliche .deb Dateien im Verzeichnis /opt/rebuildnginx . Diese nutzen wir, um nginx zu installieren.
Wir haben nun das "full" Paket angepasst, also nutzen wir das auch für die Installation. Wenn wir uns die .deb Dateien genauer anschauen, finden wir zwei "full" Pakete:
nginx-full-dbg_1.8.0-5+trusty0_amd64.deb
nginx-full_1.8.0-5+trusty0_amd64.deb
Wenn euer Ubuntu eine 64bit Version ist, dann nehmt das amd64 Paket. Die dbg Version ist eine Debug-Version, die für uns jetzt erstmal nicht relevant ist. Also nutzen wir das andere Paket, um nginx zu installieren:
# .deb Dateien befinden sich eine Ebene über dem `nginx-1.8.0` Verzeichnis
cd /opt/rebuildnginx
sudo dpkg --install nginx-full_1.8.0-5+trusty0_amd64.deb
Die Installation dürfte nicht so lange dauern und schnell erledigt sein.
Unser selbst kompiliertes nginx ist nun fertig installiert. Mit nginx -V (großes V) könnt ihr sehen, welche Module mit einkompiliert wurden:
$ nginx -V
nginx version: nginx/1.8.0
TLS SNI support enabled
configure arguments:
--with-cc-opt='-g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security -D_FORTIFY_SOURCE=2'
# einige Zeilen der Übersichtlichkeit halber entfernt
--add-module=/opt/httpupload/nginx-upload-module-2.2 # hurra!
--add-module=/opt/pagespeed/ngx_pagespeed-release-1.10.33.1-beta # hurra!
Die letzten beiden sind unsere neuen Module!
Pagespeed Modul testen
Um das Pagespeed Modul zu testen, erstellt zuerst ein Cache-Verzeichnis dafür:
sudo mkdir -p /var/cache/ngx_pagespeed/
Danach wird die /etc/nginx/nginx.conf bearbeitet, um das Modul zu aktivieren:
# Zeilen weggelassen
server {
pagespeed On;
pagespeed FileCachePath "/var/cache/ngx_pagespeed/";
pagespeed EnableFilters combine_css,combine_javascript;
# Zeilen weggelassen
}
Dann speichern und die Konfiguration testen:
$ sudo service nginx configtest
* Testing nginx configuration [ OK ]
# Neustart, da offensichtlich alles okay ist
$ sudo service nginx restart
Die Details zur Konfiguration des Pagespeed Moduls werden an dieser Stelle nicht weiter vertieft. Daher verweisen wir auf die Dokumentation bei Google.
Beim HTTP Upload Modul wurde das HTTP Upload Progress Modul nicht integriert. Das kann aber bei Bedarf ebenso nach der obigen Anleitung in die "full" Version integriert werden.
Der Weg heute: dynamische Module
Seit Version 1.9.11 kann nginx Module zur Laufzeit laden. Du musst den Server dafür nicht mehr komplett neu bauen. Es reicht, das Modul selbst passend zur installierten Version zu kompilieren und in der Konfiguration einzubinden.
Vorher lohnt ein Blick in die Paketquellen. Debian und Ubuntu bringen viele verbreitete Module als fertige Pakete mit (libnginx-mod-…), das Repository von nginx.org ebenfalls (nginx-module-…). Ein Paket bekommt Sicherheitsupdates automatisch, ein eigener Build nicht.
Findest du dein Modul dort nicht, prüfst du zuerst, welche Version läuft und ob sie mit --with-compat gebaut wurde:
nginx -v
# nginx version: nginx/1.24.0
nginx -V 2>&1 | grep -o with-compat
# with-compat
Fehlt die Ausgabe with-compat, lassen sich fremde dynamische Module nicht einfach dazuladen. Dann bleibt der Neubau des Pakets wie oben beschrieben.
Ist sie vorhanden, holst du den Quellcode genau dieser Version und das Modul. Als Beispiel dient hier das Modul headers-more:
sudo apt install build-essential libpcre2-dev zlib1g-dev libssl-dev git
cd /usr/local/src
sudo wget https://nginx.org/download/nginx-1.24.0.tar.gz
sudo tar -xzf nginx-1.24.0.tar.gz
sudo git clone https://github.com/openresty/headers-more-nginx-module.git
cd nginx-1.24.0
sudo ./configure --with-compat --add-dynamic-module=../headers-more-nginx-module
sudo make modules
sudo cp objs/ngx_http_headers_more_filter_module.so /usr/lib/nginx/modules/
make modules baut nur die Module, nicht den Server. Das dauert Sekunden statt Minuten.
Eingebunden wird das Modul ganz oben in der /etc/nginx/nginx.conf, außerhalb aller Blöcke wie http oder events:
load_module /usr/lib/nginx/modules/ngx_http_headers_more_filter_module.so;
Danach testest du die Konfiguration und lädst nginx neu:
sudo nginx -t
sudo systemctl reload nginx
Für solche Arbeiten brauchst du Root-Zugriff auf deinen Server. Auf einem Webhosting-Paket geht das nicht, auf jedem vServer dagegen schon.
Günstige Tarife: vServer
- CPU
- 4 Kerne
- RAM
- 8 GB
- Speicher
- 100 GB SSD
- Traffic
- Unbegrenzt (Fair Use)
ab 5,24 €/Monat
24 Monate, danach 6,55 €
Ø 5,24 € über 24 Monate
- 4 vCPU-Kerne (geteilt), 8 GB RAM
- 200 Mbit/s-Port, DDoS-Schutz und Firewall inklusive
- 1 Snapshot(s) inklusive
- IPv4 und IPv6 inklusive
- Speicherart
- SSD
- Domains inkl.
- keine
- Backup
- Auto Backup als Add-on (3,99 € netto/Monat lt. Konfigurator)
- Laufzeit
- monatlich kündbar
- Einrichtung
- keine Angabe
- Geprüft
- CPU
- 2 Kerne
- RAM
- 4 GB
- Speicher
- 100 GB NVMe
- Traffic
- 1.000 Mbit/s Bandbreite
ab 0,99 €/Monat
6 Monate, danach 6,99 €
Ø 5,49 € über 24 Monate
- 2 vCPU, 4 GB RAM
- 1.000 Mbit/s Bandbreite
- 30 Tage Geld-zurück-Garantie
- Alternativ monatlich kündbar für 8,99 €
- Speicherart
- NVMe
- Domains inkl.
- keine
- Backup
- Backup Service optional (Aufpreis)
- Laufzeit
- 1 Jahr Laufzeit
- Einrichtung
- keine Gebühr
- Geprüft
- CPU
- 4 Kerne
- RAM
- 8 GB
- Speicher
- 100 GB NVMe
- Traffic
- 40 TB, 1 Gbit/s
5,99 €/Monat
Ø 5,99 € über 24 Monate
- 4 vCores und 8 GB RAM garantiert
- Linux (Debian, Ubuntu, AlmaLinux, Rocky); Windows-Variante gegen Aufpreis
- Monatlich kündbar, keine Setupgebühr
- 1 .de-Domain inklusive
- Plesk ab 10,50 € im Monat zubuchbar
- Speicherart
- NVMe
- Domains inkl.
- 1
- Backup
- 1 Snapshot-Backup inklusive, Premium-Backup zubuchbar
- Laufzeit
- monatlich kündbar
- Einrichtung
- keine Gebühr
Häufige Fragen
Muss ich nginx für jedes Modul neu kompilieren?
Seit nginx 1.9.11 nicht mehr unbedingt. Module lassen sich als dynamische Module (.so) bauen und mit load_module laden. Dafür kompilierst du nur das Modul passend zur installierten nginx-Version, nicht den ganzen Server. Statische Module, die fest im Binary stecken, brauchen weiterhin einen kompletten Neubau.
Was bedeutet die Fehlermeldung „module is not binary compatible“?
Das dynamische Modul wurde gegen eine andere nginx-Version oder ohne --with-compat gebaut. Prüfe mit nginx -v die laufende Version, lade genau diesen Quellcode und baue das Modul mit ./configure --with-compat --add-dynamic-module=… neu. Nach jedem Update von nginx ist dieser Schritt wieder fällig.
Gibt es fertige Pakete für beliebte nginx-Module?
Ja. Debian und Ubuntu liefern viele Module als Pakete mit dem Namen libnginx-mod-…, etwa für GeoIP2 oder headers-more. Das offizielle Repository von nginx.org bietet Pakete wie nginx-module-njs oder nginx-module-image-filter. Ein fertiges Paket ist fast immer die bessere Wahl als ein eigener Build, weil es Updates mitbekommt.
Brauche ich für eigene nginx-Module einen Root-Server?
Du brauchst Root-Rechte auf dem System, also mindestens einen vServer. Auf normalem Webhosting kannst du den Webserver nicht austauschen und keine Module nachladen. Günstige vServer mit Root-Zugang findest du in unserem Vergleich.