nginx dynamic modules kompilieren und nutzen

Wenn man nginx um ein Modul erweitern will, aber nicht das gesamte nginx neu kompilieren möchte oder kann, z.b. weil man fertige Pakete aus einer Paketquelle installiert hat, kann man das gewünschte Modul dynamisch nachträglich einbinden.

Das ganze ist eigentlich recht einfach. Wir benötigen den Quellcode unserer gerade installierten nginx Version, sowie den Quellcode des gewünschten Moduls. Dann bauen wir beides zusammen, nehmen aber nur das erstelle Modul und binden es in die vorhandene nginx Installation ein. Wie so immer müssen wir jedoch auf das ein oder andere Detail achten.

Wir brauchen den Quellcode der nginx Version die wir bereits installiert haben. Diese bekomen wir mit folgendem Befehl:

nginx -v

Das Ergbnis sieht so aus:

Jetzt wissen wir also dass wir aktuell Version 1.15.8 installiert haben und können uns davon den Quellcode herunterladen:

wget http://nginx.org/download/nginx-1.15.8.tar.gz 
tar -xzvf nginx-1.15.8.tar.gz

Nun benötigen wir den Quellcode des gewünschten Moduls. Als Beispiel nehme ich hier das NAXSI Modul:

git clone https://github.com/nbs-system/naxsi.git

Jetzt wechseln wir in den nginx Ordner

cd nginx-1.15.8

Bevor wir nun aber nginx und das Modul bauen können, benötigen wir noch die Build Flags des bereits installierten nginx, sonst bekommen wir später folgende Meldung:

dynamic module is not binary compatible with nginx

Um die Flags festzustellen nutzen wir den Befehl

nginx -V

Was uns die gesuchten Flags anzeigt

Der nun zu verwendente Buildbefehl sieht so aus und muss durch die gerade festgestellten Flags erweitert werden:

./configure --with-compat --add-dynamic-module=../naxsi/naxsi_src

Was dann bei mir so aussieht:

./configure --with-compat --add-dynamic-module=../naxsi/naxsi_src  
--prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt='-g -O2 -fdebug-prefix-map=/data/builder/debuild/nginx-1.15.8/debian/debuild-base/nginx-1.15.8=. -specs=/usr/share/dpkg/no-pie-compile.specs -fstack-protector-strong -Wformat -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fPIC' --with-ld-opt='-specs=/usr/share/dpkg/no-pie-link.specs -Wl,-z,relro -Wl,-z,now -Wl,--as-needed -pie'

Nachdem der Befehl erfolgreich abgeschlossen wurde, erstellen wir noch die Module mit

make modules

Nun ist das Modul bereit zu Verwendung. Dazu kopieren wir es in den nginx modules Ordner

cp objs/ngx_http_naxsi_module.so /etc/nginx/modules

Und aktivieren es in der nginx.conf

load_module modules/ngx_http_naxsi_module.so;

Das war es auch schon. Nginx abschließend neustarten und das Modul wird geladen.

1 Kommentar

  1. Guter Beitrag.
    Ich kompliliere immer das NGINX Brotli Modul hinzu. Allerdings ohne die ganzen NGINX Flags.

    Sprich einfach nach Anleitung:
    $ cd nginx-1.x.x
    $ ./configure –with-compat –add-dynamic-module=/path/to/ngx_brotli
    $ make modules

    Habe so (warum auch immer) noch nie Probleme gehabt. Der Vorgang ist immer sauber durchgelaufen.

Kommentar hinterlassen

E-Mail Adresse wird nicht veröffentlicht.


*