nginx selbst kompilieren mit Zusatzmodulen

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.

Aber es gibt eine Möglichkeit, die Installation so bequem wie möglich zu machen.

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
Wenn ihr nginx bereits installiert habt, könnt ihr trotzdem mit der folgenden Anleitung fortfahren. Es empfiehlt sich jedoch, vorher ein Backup von sites-available und sonstigen Konfigurationsdateien anzulegen. Sollte es Probleme bei der Installation geben, könnt ihr nginx auch zuerst entfernen: sudo apt-get remove nginx .

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.

Das setzt voraus, dass ppa:nginx/stable bereits zum Repository hinzugefügt wurde. Bitte stellt sicher, dass die Datei /etc/apt/sources.list/nginx-stable-trusty.list existiert. In diesem Fall heißt es Trusty, weil wir hier Ubuntu Trusty (14.04) verwenden.

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.

Das Tutorial stammt von Chris Fidao und wurde im Original auf serversforhackers.com veröffentlicht.