BLOG | NGINX

Wiederherstellung nach einem fehlgeschlagenen NGINX Plus-Upgrade: „Modul „M“ Version X statt Y“

NGINX-Teil-von-F5-horiz-schwarz-Typ-RGB
Liam Crilly Miniaturbild
Liam Crilly
Veröffentlicht am 14. März 2017

Wenn Sie dynamische Module verwenden, wird beim Upgrade auf eine neue Version von NGINX oder NGINX Plus möglicherweise ein Fehler wie dieser angezeigt:

Einrichten von nginx-plus (1.11.10-1~xenial) ... nginx: [emerg] Modul „/etc/nginx/modules/ngx_http_geoip_module.so“ Version 1011005 statt 1011006 in /etc/nginx/nginx.conf:7 nginx: Test der Konfigurationsdatei /etc/nginx/nginx.conf fehlgeschlagen invoke-rc.d: Initscript nginx, Aktion „Upgrade“ fehlgeschlagen.

Der wahrscheinlichste Grund ist, dass Sie das angegebene dynamische Modul ( .so- Datei) nicht aktualisiert haben:

  • Wenn Sie NGINX Open Source ausführen, müssen dynamische Module für die Version kompiliert werden, auf die Sie aktualisieren.
  • Wenn Sie NGINX Plus ausführen, müssen dynamische Module mit der Open Source-Version von NGINX kompiliert werden, die der NGINX Plus-Version entspricht, auf die Sie aktualisieren.

Der Kürze halber beziehen wir uns im Folgenden nur noch auf NGINX Plus.

Keine Panik!

Seien Sie versichert, dass diese Fehlermeldung nicht darauf hinweist, dass Ihr NGINX Plus-Server ausgefallen ist. NGINX Plus-Upgrades erfolgen nahtlos, sodass die alte Version weiter ausgeführt wird, wenn ein Upgrade fehlschlägt. Das Upgrade ist jedoch unvollständig und Ihr System befindet sich in einem inkonsistenten Zustand:

  • NGINX Plus-Prozesse im Speicher führen die alte Version aus
  • Alle Dateien auf der Festplatte, die sich auf NGINX Plus beziehen, entsprechen der neuen Version
  • Das in der Fehlermeldung erwähnte dynamische Modul wurde mit der alten Version kompiliert

Führen Sie keinen manuellen Neustart von nginx oder des Systems durch. Dies führt zu Ausfallzeiten, da neue NGINX Plus-Prozesse nicht gestartet werden können, während dynamische Module nicht mit der neuen NGINX Plus-Version synchronisiert sind.

Beachten Sie, dass sich die Fehlermeldung nur auf das erste inkompatible Modul bezieht, das während des Upgrade-Vorgangs gefunden wurde. Daher ist es wichtig, alle load_module- Direktiven in Ihrer Konfiguration zu finden und sicherzustellen, dass jedes Modul mit der entsprechenden NGINX-Version kompiliert wird. Für jede NGINX Plus-Version werden korrekte Versionen aller von NGINX erstellten und zertifizierten dynamischen Module von Drittanbietern bereitgestellt, sodass Sie nur nicht zertifizierte Module neu kompilieren müssen. In diesem Artikel wird beschrieben, wie Sie den Upgrade-Prozess sicher abschließen.

Was ist schiefgelaufen?

NGINX 1.11.5 und NGINX Plus R11 führten die Möglichkeit ein, dynamische Module mit NGINX Open Source zu kompilieren und in NGINX Plus zu laden. Diese binäre Kompatibilität erfordert, dass das Modul und NGINX Plus dieselbe Open-Source-Basisversion verwenden. Das Upgrade von NGINX Plus ohne vorherige Installation dynamischer Module, die auf der entsprechenden Open-Source-Version von NGINX basieren, schlägt aufgrund dieser Versionsinkongruenz fehl.

Wenn Ihr dynamisches Modul von einem Drittanbieter bereitgestellt wurde, müssen Sie sich an den Anbieter wenden, um eine neue Version zu erhalten, die der NGINX-Version für die NGINX Plus-Version entspricht, auf die Sie aktualisieren möchten. Wenn Ihr dynamisches Modul aus dem Quellcode kompiliert wurde (und Sie Zugriff auf die Quellen haben), lesen Sie weiter.

Der Weg zur Genesung

Schritt 0: Vorbereiten der Build-Umgebung

Wir empfehlen dringend, dynamische Module auf einem separaten System zu kompilieren, das wir hier als „Build-Umgebung“ bezeichnen. Dadurch werden das Risiko und die Komplexität des Systems minimiert, auf dem Sie NGINX Plus mit dem dynamischen Modul ausführen (wir bezeichnen dies als „Produktionsumgebung“). Die Build-Umgebung muss über dasselbe Betriebssystem und dieselbe Version wie die Produktionsumgebung verfügen . Darüber hinaus müssen die folgenden Komponenten installiert sein:

  • UnZip-Dienstprogramm
  • Compiler und Make-Dienstprogramm
  • Perl-kompatible Bibliothek für reguläre Ausdrücke (Entwicklungsdateien)
  • Zlib-Komprimierungsbibliotheken (Entwicklungsdateien)

Um sicherzustellen, dass diese Voraussetzungen in Ihrer Build-Umgebung installiert sind, führen Sie den folgenden Befehl aus.

  • Für Ubuntu/Debian:

    buildenv$ sudo apt-get install unzip gcc make libpcre3-dev zlib1g-dev
  • Für CentOS/RHEL/Oracle Linux:

    buildenv$ sudo yum install unzip gcc make pcre-devel zlib-devel

Schritt 1: NGINX Open Source herunterladen

  1. Führen Sie in der Produktionsumgebung den folgenden Befehl aus, um die Open Source-Version von NGINX zu ermitteln, die der laufenden NGINX Plus-Version entspricht. In dieser Ausgabe ist es orange hervorgehoben: NGINX 1.11.10, das entspricht NGINX Plus R12.

    Produktion$ nginx -v nginx-Version: nginx/ 1.11.10 (nginx-plus-r12)
  2. Laden Sie in der Build-Umgebung die Quellen für die entsprechende NGINX Open Source-Version herunter.

    build-env$ wget -qO - http://nginx.org/download/nginx-1.11.10 .tar.gz | tar zxfv -

Schritt 2: Abrufen der dynamischen Modulquellen

Kopieren Sie den Quellcode für das dynamische Modul in das Build-Verzeichnis Ihrer Wahl. Hier kopieren wir ein Beispielmodul „Hallo Welt“ von NGINX aus seinem GitHub-Repository.

buildenv$ git clone https://github.com/perusio/nginx-hello-world-module.git Klonen in „nginx-hello-world-module“ …

Schritt 3: Kompilieren des dynamischen Moduls

  1. Kompilieren Sie das dynamische Modul, indem Sie zuerst das NGINX- Konfigurationsskript mit dem Argument --with-compat ausführen, um das dynamische Modul binärkompatibel mit NGINX Plus zu machen. Führen Sie dann „make module“ aus, um nur das Modul zu kompilieren.

    buildenv$ cd nginx-1.11.10/ buildenv$ ./configure --with-compat --add-dynamic-module=../nginx-hello-world-module buildenv$ make-Module
  2. Stellen Sie sicher, dass der Build-Prozess das dynamische Modul als .so- Datei im Unterverzeichnis objs erstellt hat.

    buildenv$ ls objs/*.so objs/ngx_http_hello_world.so
  3. Erstellen Sie eine Kopie der Moduldatei mit der NGINX Open Source-Version im Dateinamen. Dies vereinfacht die Verwaltung mehrerer Versionen des dynamischen Moduls in der Produktionsumgebung.

    Buildumgebung$ cp objs/ngx_http_hello_world.so ./ngx_http_hello_world_1.11.10.so

Schritt 4: Kopieren des dynamischen Moduls in die Produktionsumgebung

Da wir das dynamische Modul mit der NGINX Open Source-Version im Dateinamen erstellt haben, können wir es sicher in die Produktionsumgebung kopieren, ohne den Betrieb zu beeinträchtigen.

buildenv$ scp ./ngx_http_hello_world_1.11.10.so Produktion:/etc/nginx/modules

Schritt 5: Tauschen Sie das dynamische Modul aus

Arbeiten Sie in der Produktionsumgebung und ersetzen Sie die aktuelle Datei durch die neue .so- Datei. Dies kann an dieser Stelle sicher durchgeführt werden, da dynamische Module nur dann in den Speicher geladen werden, wenn nginx neu gestartet oder die Konfiguration neu geladen wird.

Produktion$ cd /etc/nginx/modules Produktion$ cp ngx_http_hello_world.so ngx_http_hello_world_ROLLBACK.so Produktion$ ln -fs ngx_http_hello_world_1.11.10.so ngx_http_hello_world.so Produktion$ ls -gG -rw-r--r-- 1 243576 31. Januar 16:18 ngx_http_hello_world_1.11.10.so -rw-r--r-- 1 243576 20. Oktober 10:40 ngx_http_hello_world_ROLLBACK.so lrwxrwxrwx 1 24 31. Januar 16:26 ngx_http_hello_world.so -> ngx_http_hello_world_1.11.10.so

Schritt 6: Schließen Sie das Upgrade von NGINX Plus ab.

  1. Führen Sie den folgenden Befehl aus, um zu testen, ob die Modulversion korrekt ist und ob NGINX Plus bereit ist, den Upgrade-Vorgang abzuschließen.

    Produktion$ nginx -t nginx: die Syntax der Konfigurationsdatei /etc/nginx/nginx.conf ist in Ordnung nginx: der Test der Konfigurationsdatei /etc/nginx/nginx.conf ist erfolgreich
  2. Schließen Sie den Upgrade-Vorgang ab, damit NGINX Plus die neue Version und die dynamischen Module verwendet.

    Produktion$ Service Nginx-Upgrade. Neues Master-Nginx wird gestartet: [OK] Ordentliches Herunterfahren des alten Nginx: [OK]

Verhindern des Upgrade-Fehlers

Wenn Sie beim nächsten Upgrade von NGINX Plus Zeit sparen und Fehler vermeiden, können Sie diese Anweisungen vor dem Upgrade befolgen, sodass aktualisierte dynamische Module bereits verfügbar sind, wenn Sie den Upgrade-Prozess starten.


„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."