nginx selbst kompilieren mit Zusatzmodulen

Zusatzmodule müssen bei nginx mit einkompiliert werden. Diese Anleitung zeigt, wie du das Debian-Paket neu baust und dabei alle Annehmlichkeiten der Paketinstallation behältst.

Redaktion Webspacevergleich.net Stand: 8 Minuten Lesezeit

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/stable Paket 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

  1. Contabo

    Cloud VPS 4

    vServer monatlich kündbar

    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

    Zum Tarif
    • 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
  2. dogado

    Cloud Server S 4.0

    vServer 1 Jahr Laufzeit

    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

    Zum Tarif
    • 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
  3. webtropia

    Cloud VPS Linux S2

    vServer monatlich kündbar

    CPU
    4 Kerne
    RAM
    8 GB
    Speicher
    100 GB NVMe
    Traffic
    40 TB, 1 Gbit/s

    5,99 €/Monat

    Ø 5,99 € über 24 Monate

    Zum Tarif
    • 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

Alle 33 Tarife vergleichen

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.

Weiterlesen