Si vous utilisez des modules dynamiques, vous risquez de voir une erreur comme celle-ci lors de la mise à niveau vers une nouvelle version de NGINX ou NGINX Plus :
Configuration de nginx-plus (1.11.10-1~xenial) ... nginx : [emerg] module "/etc/nginx/modules/ngx_http_geoip_module.so" version 1011005 au lieu de 1011006 dans /etc/nginx/nginx.conf:7 nginx : fichier de configuration /etc/nginx/nginx.conf test échoué invoke-rc.d : initscript nginx, action "upgrade" a échoué.
La raison la plus probable est que vous n'avez pas mis à niveau le module dynamique spécifié (fichier .so ) :
Par souci de concision, nous ferons désormais uniquement référence à NGINX Plus.
Soyez assuré que ce message d’erreur n’indique pas que votre serveur NGINX Plus est en panne. Les mises à niveau de NGINX Plus sont transparentes, de sorte que l'ancienne version continue de fonctionner lorsqu'une mise à niveau échoue. Cependant, la mise à niveau est incomplète et votre système est dans un état incohérent :
Ne redémarrez pas manuellement nginx
ou ne redémarrez pas le système. Cela entraînera des temps d'arrêt car les nouveaux processus NGINX Plus ne pourront pas démarrer tant que des modules dynamiques ne seront pas synchronisés avec la nouvelle version de NGINX Plus.
Notez que le message d'erreur concerne uniquement le premier module incompatible détecté lors du processus de mise à niveau. Il est donc important de rechercher toutes les directives load_module
dans votre configuration et de vous assurer que chaque module est compilé avec la version NGINX appropriée. Des versions correctes de tous les modules dynamiques tiers créés et certifiés par NGINX sont fournies pour chaque version de NGINX Plus. Vous devez donc recompiler uniquement les modules non certifiés. Cet article décrit comment effectuer le processus de mise à niveau en toute sécurité.
NGINX 1.11.5 et NGINX Plus R11 ont introduit la possibilité de compiler des modules dynamiques avec NGINX Open Source et de les charger dans NGINX Plus. Cette compatibilité binaire nécessite que le module et NGINX Plus partagent la même version open source de base. La mise à niveau de NGINX Plus sans installer au préalable les modules dynamiques créés avec la version NGINX Open Source correspondante échoue en raison de cette incompatibilité de version.
Si votre module dynamique a été fourni par un fournisseur tiers, vous devez contacter le fournisseur pour obtenir une nouvelle version, adaptée à la version NGINX de la version NGINX Plus vers laquelle vous souhaitez effectuer la mise à niveau. Si votre module dynamique a été compilé à partir des sources (et que vous avez accès aux sources), continuez à lire.
Nous vous recommandons fortement de compiler les modules dynamiques sur un système séparé, que nous appelons ici « environnement de build ». Cela minimise le risque et la complexité du système sur lequel vous exécutez NGINX Plus avec le module dynamique (nous appelons cela « l’environnement de production »). L'environnement de build doit avoir le même système d'exploitation et la même version que l'environnement de production ; de plus, les composants suivants doivent être installés :
Pour vous assurer que votre environnement de build dispose de ces prérequis installés, exécutez la commande suivante.
Pour Ubuntu/Debian :
buildenv$ sudo apt-get install unzip gcc make libpcre3-dev zlib1g-dev
Pour CentOS/RHEL/Oracle Linux :
buildenv$ sudo yum install unzip gcc make pcre-devel zlib-devel
En travaillant dans un environnement de production, exécutez la commande suivante pour identifier la version NGINX Open Source qui correspond à la version NGINX Plus en cours d’exécution. Il est surligné en orange dans cette sortie : NGINX 1.11.10, qui correspond à NGINX Plus R12.
production$ nginx -v nginx version: nginx/ 1.11.10 (nginx-plus-r12)
En travaillant dans l'environnement de construction, téléchargez les sources de la version NGINX Open Source appropriée.
build-env$ wget -qO - http://nginx.org/download/nginx-1.11.10 .tar.gz | tar zxfv -
Copiez le code source du module dynamique dans le répertoire de build de votre choix. Ici, nous copions un exemple de module NGINX « hello world » à partir de son référentiel GitHub.
buildenv$ git clone https://github.com/perusio/nginx-hello-world-module.git Clonage dans 'nginx-hello-world-module'...
Compilez le module dynamique en exécutant d’abord le script de configuration
NGINX avec l’argument --with-compat
pour rendre le module dynamique compatible binaire avec NGINX Plus. Exécutez ensuite make
modules
pour compiler uniquement le module.
buildenv$ cd nginx-1.11.10/ buildenv$ ./configure --with-compat --add-dynamic-module=../nginx-hello-world-module buildenv$ créer des modules
Vérifiez que le processus de construction a créé le module dynamique en tant que fichier .so dans le sous-répertoire objs .
buildenv$ ls objs/*.so objs/ngx_http_hello_world.so
Créez une copie du fichier de module avec la version NGINX Open Source dans le nom de fichier. Cela simplifie la gestion de plusieurs versions du module dynamique dans l'environnement de production.
buildenv$ cp objs/ngx_http_hello_world.so ./ngx_http_hello_world_1.11.10.so
Étant donné que nous avons créé le module dynamique avec la version NGINX Open Source dans le nom de fichier, nous pouvons le copier en toute sécurité dans l'environnement de production sans affecter le fonctionnement.
buildenv$ scp ./ngx_http_hello_world_1.11.10.so production:/etc/nginx/modules
En travaillant dans l'environnement de production, remplacez le nouveau fichier .so par le fichier actuel. Cela peut être fait en toute sécurité à ce stade, car les modules dynamiques ne sont chargés en mémoire que lorsque nginx
redémarre ou que la configuration est rechargée.
production$ cd /etc/nginx/modules production$ cp ngx_http_hello_world.so ngx_http_hello_world_ROLLBACK.so production$ ln -fs ngx_http_hello_world_1.11.10.so ngx_http_hello_world.so production$ ls -gG -rw-r--r-- 1 243576 31 janv. 16:18 ngx_http_hello_world_1.11.10.so -rw-r--r-- 1 243576 20 oct. 10:40 ngx_http_hello_world_ROLLBACK.so lrwxrwxrwx 1 24 janv. 31 16:26 ngx_http_hello_world.so -> ngx_http_hello_world_1.11.10.so
Exécutez la commande suivante pour vérifier que la version du module est correcte et que NGINX Plus est prêt à terminer le processus de mise à niveau.
production$ nginx -t nginx : la syntaxe du fichier de configuration /etc/nginx/nginx.conf est correcte nginx : le test du fichier de configuration /etc/nginx/nginx.conf est réussi
Terminez le processus de mise à niveau afin que NGINX Plus utilise la nouvelle version et les modules dynamiques.
production$ service nginx upgrade Démarrage du nouveau maître nginx : [ OK ] Arrêt normal de l'ancien nginx : [ OK ]
La prochaine fois que vous mettrez à niveau NGINX Plus, vous pourrez gagner du temps et éviter les erreurs en suivant ces instructions avant la mise à niveau afin que les modules dynamiques mis à jour soient déjà disponibles lorsque vous démarrez le processus de mise à niveau.
« Cet article de blog peut faire référence à des produits qui ne sont plus disponibles et/ou qui ne sont plus pris en charge. Pour obtenir les informations les plus récentes sur les produits et solutions F5 NGINX disponibles, explorez notre famille de produits NGINX . NGINX fait désormais partie de F5. Tous les liens NGINX.com précédents redirigeront vers un contenu NGINX similaire sur F5.com."