BLOG | NGINX

Kompilieren dynamischer Module von Drittanbietern für NGINX und NGINX Plus

NGINX-Teil-von-F5-horiz-schwarz-Typ-RGB
Owen Garrett Miniaturbild
Owen Garrett
Veröffentlicht am 25. Oktober 2016

Editor – Der Blogbeitrag, der die ursprüngliche Veröffentlichung der Unterstützung dynamischer Module (in NGINX Open Source 1.9.11, Februar 2016) ankündigt, leitet hierher weiter. Der in diesem Beitrag beschriebene Build-Prozess ist veraltet.

Dieser Beitrag ist Teil einer zweiteiligen Reihe zur Verwendung dynamischer Module von Drittanbietern mit NGINX Open Source und NGINX Plus.

  • Dieser Beitrag enthält schrittweise Anleitungen zum Kompilieren dynamischer Module von Drittanbietern, die zur Laufzeit von NGINX Open Source oder NGINX Plus geladen werden können.
  • Der zweite Beitrag enthält Anleitungen und Tools zum Automatisieren dynamischer Modulbuilds von Drittanbietern für eine Produktionsumgebung. Es wird erläutert, wie installierbare Pakete für dynamische Module von Drittanbietern erstellt werden, die eine Versionsabhängigkeitsprüfung beinhalten.

 

NGINX Open Source 1.11.5 und NGINX Plus Release R11 führten die Binärkompatibilität für dynamische Module ein. In diesem Artikel wird erläutert, wie Sie Module von Drittanbietern für die Verwendung mit NGINX Open Source und NGINX Plus in einer Entwicklungsumgebung kompilieren. Anweisungen zum Erstellen, Bereitstellen und Aktualisieren dynamischer Module von Drittanbietern in einer Produktionsumgebung finden Sie unter Erstellen installierbarer Pakete für dynamische Module .

Der Kürze halber bezieht sich der Rest dieses Beitrags nur auf NGINX Plus, außer wenn der Unterschied zwischen diesem und NGINX Open Source relevant ist. Sofern nicht anders angegeben, gelten alle Aussagen zu NGINX Plus auch für NGINX Open Source.

Übersicht über dynamische Module

Module, die in NGINX Plus geladen werden können, sind in C geschrieben und entsprechen der in „Extending NGINX“ im NGINX-Wiki beschriebenen API. Es gibt ein großes Ökosystem an Modulen von Drittanbietern , von Sprachinterpreten bis zu Sicherheitslösungen, und einige davon sind in NGINX Plus enthalten und werden darin unterstützt .

Andere Module von Drittanbietern und Module, die Sie selbst erstellt haben, müssen unabhängig kompiliert und zur Laufzeit dynamisch in NGINX Plus geladen werden. Sie können diese Module für die Verwendung mit NGINX Plus kompilieren, indem Sie sie mit NGINX Open Source erstellen, wie in den beiden folgenden Beispielen dargestellt:

  1. Erhalten Sie die passende NGINX Open Source-Version
  2. Besorgen Sie sich die Modulquellen und ändern Sie bei Bedarf die Konfigurationsdatei des Moduls.
  3. Erstellen Sie das dynamische Modul für die NGINX Open Source-Version mit dem Argument --with-compat für den Konfigurationsbefehl .
  4. Laden Sie das resultierende dynamische Modul (die .so- Datei) in NGINX Plus und verwenden Sie es, als wäre es ein integriertes Modul

Beispiel: Ein einfaches „Hallo Welt“-Modul

Dieses Beispiel verwendet ein einfaches „Hello World“-Modul, um zu zeigen, wie die Quelle für ein Modul aktualisiert und in NGINX Plus geladen wird. Das Modul „Hallo Welt“ implementiert eine einfache Direktive ( hello_world ), die auf Anfragen mit einer einfachen Nachricht antwortet.

Schritt 1: Erhalten Sie die NGINX Open Source-Version

  1. Bestimmen Sie die NGINX Open Source-Version, die Ihrer NGINX Plus-Installation entspricht. In diesem Beispiel ist es NGINX 1.11.5.

    $ nginx -v nginx-Version: nginx/1.11.5 (nginx-plus-r11)
    
  2. Laden Sie das entsprechende NGINX Open Source-Paket unter nginx.org/download herunter:

    $ wget https://nginx.org/download/nginx-1.11.5.tar.gz $ tar -xzvf nginx-1.11.5.tar.gz
    

Schritt 2: Beziehen der Modulquellen

  1. Besorgen Sie sich den Quellcode für das NGINX-Modul „Hello World“ von GitHub :

    $ git clone https://github.com/perusio/nginx-hello-world-module.git
    
  2. Die Konfigurations- Shell-Datei für ein Modul definiert, wie es erstellt wird, und ihr Format ist für dynamische Module anders als für Module, die statisch in eine NGINX Open Source-Binärdatei integriert werden.

    Ändern Sie die Datei nginx-hello-world-module/config, sodass sie Folgendes enthält:

    ngx_addon_name=ngx_http_hello_world_module
    
    wenn test -n "$ngx_module_link"; dann
    ngx_module_type=HTTP
    ngx_module_name=ngx_http_hello_world_module
    ngx_module_srcs="$ngx_addon_dir/ngx_http_hello_world_module.c"
    
    . auto/module
    sonst
    HTTP_MODULES="$HTTP_MODULES ngx_http_hello_world_module"
    NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/ngx_http_hello_world_module.c"
    fi
    

Ausführliche Informationen zum Kompilieren dynamischer Module, einschließlich Anweisungen zum Aktualisieren der Konfigurationsdatei eines Moduls vom alten Format, finden Sie im NGINX-Wiki .

Schritt 3: Kompilieren des dynamischen Moduls

  1. Kompilieren Sie das Modul, indem Sie zuerst das Konfigurationsskript mit dem Argument --with-compat ausführen, wodurch eine standardmäßige Build-Umgebung erstellt wird, die sowohl von NGINX Open Source als auch von NGINX Plus unterstützt wird. Führen Sie dann make module aus, um das Modul zu erstellen:

    $ cd nginx-1.11.5/ $ ./configure --with-compat --add-dynamic-module=../nginx-hello-world-module $ Module erstellen
    
  2. Kopieren Sie die Modulbibliothek ( .so- Datei) nach /etc/nginx/modules :

    $ sudo cp objs/ngx_http_hello_world_module.so /etc/nginx/modules/
    

Schritt 4: Laden und Verwenden des Moduls

  1. Um das Modul in NGINX Plus zu laden, fügen Sie die Direktive load_module im Kontext der obersten Ebene (Hauptkontext) Ihrer Konfigurationsdatei nginx.conf hinzu (nicht im HTTP- oder Streamkontext ):

    Lademodulmodule/ngx_http_hello_world_module.so;
    
  2. Fügen Sie im HTTP- Kontext einen Standortblock mit der Direktive „hello_world“ hinzu, die vom Modul „Hello World“ bereitgestellt wird. Anfragen an den Standort geben die Antwort „Hallo Welt“ zurück.

    Server {
    listen 80;
    
    Standort / {
    hallo_welt;
    }
    }
    
  3. Laden Sie Ihre NGINX Plus-Konfiguration neu und testen Sie sie mit einer einfachen Anfrage:

    $ nginx -s reload $ curl http://localhost/ hallo Welt
    

Beispiel: Die NAXSI Web Application Firewall

NAXSI ist eine benutzerfreundliche, leistungsstarke Web Application Firewall (WAF), die Heuristiken und ein Bewertungssystem verwendet, um verdächtige Anfragen wie XSS- und SQL-Injection-Angriffe zu identifizieren.

Die NAXSI-Quelle wurde aktualisiert, um dem neuen Format für die Konfigurations- Shell-Datei zu entsprechen. Daher ist das Erstellen eines dynamischen Moduls für NGINX Plus unkompliziert. Der Vorgang basiert auf den NAXSI-Installationsanweisungen :

$ git clone https://github.com/nbs-system/naxsi.git $ cd nginx-1.11.5/ $ ./configure --with-compat --add-dynamic-module=../naxsi/naxsi_src $ Module erstellen $ sudo cp objs/ngx_http_naxsi_module.so /etc/nginx/modules

Laden Sie das Modul in den NGINX Plus-Kern, indem Sie die Direktive load_module zum Hauptkontext in Ihrer Datei nginx.conf hinzufügen:

lade_Modulmodule/ngx_http_naxsi_module.so;

Die NAXSI-Konfiguration wird in der Projektdokumentation ausführlich beschrieben. Die folgende NGINX-Konfiguration veranschaulicht das Modul in Aktion:

# Bearbeiten Sie diese 'include'-Anweisung, um auf Ihre Datei naxsi_core.rules zu verweisen
include /home/owen/src/naxsi/naxsi_config/naxsi_core.rules;

server {
listen 80;

location / {
root /usr/share/nginx/html;

# NAXSI aktivieren
SecRulesEnabled;

# Definieren Sie, wohin blockierte Anfragen gehen
DeniedUrl "/50x.html";

# CheckRules, die bestimmen, wann NAXSI Maßnahmen ergreifen muss
CheckRule "$SQL >= 8" BLOCK;
CheckRule "$RFI >= 8" BLOCK;
CheckRule "$TRAVERSAL >= 4" BLOCK;
CheckRule "$EVADE >= 4" BLOCK;
CheckRule "$XSS >= 8" BLOCK;

# Vergessen Sie nicht das error_log, in dem blockierte Anfragen protokolliert werden
error_log /tmp/naxsi.log;
}

error_page 500 502 503 504 /50x.html;
}

Sie können die korrekte Funktion von NAXSI mit ein paar einfachen HTTP-Anfragen überprüfen:

  • curl http://localhost/ gibt die standardmäßige NGINX Plus-Indexseite zurück, die in /usr/share/nginx/html gespeichert ist.
  • curl "http://localhost/?a=<>" löst die XSS-Erkennung von NAXSI aus und blockiert die Anforderung. Dadurch wird die Standardfehlerseite 50x.html von /usr/share/nginx/html zurückgegeben. Außerdem wird eine Meldung im error_log protokolliert.

Für Produktionsbereitstellungen können Sie auch signierte NAXSI-Versionen unter https://github.com/nbs-system/naxsi/tags herunterladen und auf ähnliche Weise kompilieren.

So unterstützen wir dynamische Module in NGINX Plus

Notiz: Die Informationen in diesem Abschnitt gelten nur für NGINX Plus. Der Satz dynamischer Module, der mit vorgefertigten NGINX Open Source-Paketen geliefert wird, kann sich von denen unterscheiden, die mit NGINX Plus geliefert werden. Mit NGINX Open Source verwendete dynamische Module werden auf die gleiche Weise unterstützt wie der NGINX-Quellcode und vorgefertigte Binärdateien.

NGINX Plus wird mit einer Reihe dynamischer Module geliefert, die Sie auch direkt aus unserem Modul-Repository herunterladen können. Eine Liste finden Sie auf der Seite „Dynamische Module“ . Es gibt zwei Typen dieser Module:

  • NGINX Plus-Module werden vom NGINX-Entwicklungsteam geschrieben und/oder gepflegt. Wir nehmen sie aus technischen Gründen nicht in NGINX Plus auf (z. B. weil sie zusätzliche Abhängigkeiten haben) oder weil sie sich in einem Vorschauzustand befinden. Vorschaumodule befinden sich in der aktiven Entwicklung und sollten nur mit großer Sorgfalt bereitgestellt werden. Ansonsten werden NGINX Plus-Module vollständig von NGINX unterstützt. Um eine Liste anzuzeigen, filtern Sie auf der Seite „Dynamische Module“ nach Autor NGINX .
  • NGINX Plus-zertifizierte Community-Module sind beliebte Module von Drittanbietern, die von NGINX getestet und vertrieben werden und für die wir Unterstützung bei der Installation und Grundkonfiguration bieten. Wir garantieren, dass diese Module den ordnungsgemäßen Betrieb von NGINX Plus nicht beeinträchtigen und aktualisieren sie bei Bedarf bei jeder NGINX Plus-Version oder bei einem Sicherheitsrelease. Um eine Liste zu erhalten, filtern Sie auf der Seite „Dynamische Module“ nach der Autor -Community .

Darüber hinaus zertifiziert NGINX Module von kommerziellen Anbietern, die an unserem NGINX Plus Certified Modules -Programm teilnehmen. Diese Module werden von ihren Anbietern vertrieben und unterstützt. Um eine Liste zu erhalten, filtern Sie auf der Seite „Dynamische Module“ nach dem Autor „Zertifizierter Partner“ .

NGINX testet oder unterstützt keine Module, die Sie selbst kompiliert haben (andere Community-Module, Module von Drittanbietern, die nicht Teil des NGINX Plus Certified Modules-Programms sind, und benutzerdefinierte Module). Wenn Sie wegen eines Problems technischen Support suchen, fordert Sie das NGINX-Supportteam im Rahmen unseres technischen Supportprozesses möglicherweise auf, ein nicht unterstütztes Modul zu entfernen und den Fehler zu reproduzieren, damit überprüft werden kann, ob der Fehler durch das nicht unterstützte Modul verursacht wird oder nicht.

Zusammenfassung

Der dynamische Modul-Build-Prozess für NGINX Plus ermöglicht Ihnen, das breite Ökosystem der NGINX Open Source-Module zu nutzen und sie auf dem umfangreichen und vollständig unterstützten NGINX Plus-Kern auszuführen.

Wenn Sie derzeit NGINX Open Source mit Erweiterungen von Drittanbietern verwenden, können diese Erweiterungen höchstwahrscheinlich kompiliert und in NGINX Plus geladen werden.

Wenn Sie kommerzielle oder Community-Module entwickeln, können Ihre Benutzer Ihre Module dank des neuen Build-Prozesses mit NGINX Plus bereitstellen. Weitere Informationen zur Zertifizierung eines kommerziellen Moduls finden Sie unter NGINX Plus-zertifizierte Module .

Wenn Sie Hilfe bei der Entwicklung eines Moduls oder der Aktualisierung seiner Shell -Konfigurationsdatei benötigen, sehen Sie sich bitte die folgenden Ressourcen an:

Die Mailingliste der NGINX-Entwickler ist die Anlaufstelle für Community-Unterstützung und auch unser Professional Services-Team hilft Ihnen gerne weiter.

Um dynamische Module mit NGINX Plus selbst auszuprobieren, starten Sie noch heute eine kostenlose 30-Tage-Testversion oder kontaktieren Sie uns, um Ihre Anwendungsfälle zu besprechen .


„Dieser Blogbeitrag kann auf Produkte verweisen, die nicht mehr verfügbar und/oder nicht mehr unterstützt werden. Die aktuellsten Informationen zu verfügbaren F5 NGINX-Produkten und -Lösungen finden Sie in unserer NGINX-Produktfamilie . NGINX ist jetzt Teil von F5. Alle vorherigen NGINX.com-Links werden auf ähnliche NGINX-Inhalte auf F5.com umgeleitet."