Afficher/cacher Sommaire
Comment compiler des modules NGINX dynamiques
Article original écrit par Chris Oliver le 20 juin 2018
Compiler des modules dynamiques NGINX est quelque chose qui est difficile à trouver en ligne. Surtout si vous voulez les compiler pour une copie compilée existante de NGINX. Ce guide va parcourir la compilation du module Upload pour NGINX sur Ubuntu 18.04 en utilisant nginx depuis leurs dépôts.
NGINX a déjà été compilé pour nous avec différentes options. Si vous installez le paquet nginx-extras, vous obtenez NGINX compilé avec un tas de modules, mais vous pouvez aussi utiliser les paquets nginx-full ou juste nginx pour obtenir moins de modules.
Pour compiler notre nouveau module dynamique, nous devrons télécharger le code source de NGINX, installer toutes les dépendances utilisées lorsque les responsables du paquet Ubuntu l’ont compilé, et utiliser les mêmes indicateurs qu’eux.
Installation des dépendances
Vous devrez d’abord installer toutes les dépendances pour les modules NGINX que vous compilez. Pour moi, j’avais besoin de ce qui suit :
sudo apt install libperl-dev libgeoip-dev libgd-dev
Téléchargement du code source du NGINX et du module
Vous devrez compiler ceci avec la même version de NGINX que celle qui est actuellement installée. Vous pouvez trouver cela en exécutant nginx -v. Pour moi, nous utilisons la version 1.14.0 donc nous allons télécharger les sources de cette version.
wget https://nginx.org/download/nginx-1.14.0.tar.gz
tar zxf nginx-1.14.0.tar.gz
Ensuite, nous devons télécharger les sources de notre module. Nous utilisons le module Upload qui se trouve sur Github. On prendra la dernière fermeture éclair.
wget https://github.com/fdintino/nginx-upload-module/archive/master.zip
unzip master.zip
Trouvez les drapeaux de compilation du NGINX
Pour rendre notre module compatible avec le binaire NGINX existant, nous devons utiliser les mêmes drapeaux de compilation. Nous pouvons les trouver en exécutant la commande suivante :
nginx -V
# nginx version: nginx/1.14.0 (Ubuntu)
built with OpenSSL 1.1.0g 2 Nov 2017
TLS SNI support enabled
configure arguments: \
--with-cc-opt='-g -O2 -fdebug-prefix-map=/build/nginx-mcUg8N/nginx-1.14.0=. -fstack-protector-strong -Wformat -Werror=format-security -fPIC -Wdate-time -D_FORTIFY_SOURCE=2' \
--with-ld-opt='-Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -fPIC' \
--prefix=/usr/share/nginx \
--conf-path=/etc/nginx/nginx.conf \
--http-log-path=/var/log/nginx/access.log \
--error-log-path=/var/log/nginx/error.log \
--lock-path=/var/lock/nginx.lock \
--pid-path=/run/nginx.pid \
--modules-path=/usr/lib/nginx/modules \
--http-client-body-temp-path=/var/lib/nginx/body \
--http-fastcgi-temp-path=/var/lib/nginx/fastcgi \
--http-proxy-temp-path=/var/lib/nginx/proxy \
--http-scgi-temp-path=/var/lib/nginx/scgi \
--http-uwsgi-temp-path=/var/lib/nginx/uwsgi \
--with-debug \
--with-pcre-jit \
--with-http_ssl_module \
--with-http_stub_status_module \
--with-http_realip_module \
--with-http_auth_request_module \
--with-http_v2_module \
--with-http_dav_module \
--with-http_slice_module \
--with-threads \
--with-http_addition_module \
--with-http_flv_module \
--with-http_geoip_module=dynamic \
--with-http_gunzip_module \
--with-http_gzip_static_module \
--with-http_image_filter_module=dynamic \
--with-http_mp4_module \
--with-http_perl_module=dynamic \
--with-http_random_index_module \
--with-http_secure_link_module \
--with-http_sub_module \
--with-http_xslt_module=dynamic \
--with-mail=dynamic \
--with-mail_ssl_module \
--with-stream=dynamic \
--with-stream_ssl_module \
--with-stream_ssl_preread_module \
--add-dynamic-module=/build/nginx-mcUg8N/nginx-1.14.0/debian/modules/http-headers-more-filter \
--add-dynamic-module=/build/nginx-mcUg8N/nginx-1.14.0/debian/modules/http-auth-pam \
--add-dynamic-module=/build/nginx-mcUg8N/nginx-1.14.0/debian/modules/http-cache-purge \
--add-dynamic-module=/build/nginx-mcUg8N/nginx-1.14.0/debian/modules/http-dav-ext \
--add-dynamic-module=/build/nginx-mcUg8N/nginx-1.14.0/debian/modules/http-ndk \
--add-dynamic-module=/build/nginx-mcUg8N/nginx-1.14.0/debian/modules/http-echo \
--add-dynamic-module=/build/nginx-mcUg8N/nginx-1.14.0/debian/modules/http-fancyindex \
--add-dynamic-module=/build/nginx-mcUg8N/nginx-1.14.0/debian/modules/nchan \
--add-dynamic-module=/build/nginx-mcUg8N/nginx-1.14.0/debian/modules/http-lua \
--add-dynamic-module=/build/nginx-mcUg8N/nginx-1.14.0/debian/modules/rtmp \
--add-dynamic-module=/build/nginx-mcUg8N/nginx-1.14.0/debian/modules/http-uploadprogress \
--add-dynamic-module=/build/nginx-mcUg8N/nginx-1.14.0/debian/modules/http-upstream-fair \
--add-dynamic-module=/build/nginx-mcUg8N/nginx-1.14.0/debian/modules/http-subs-filter
Maintenant c’est beaucoup de drapeaux, mais nous pouvons ignorer ceux de –add-dynamic-module parce que nous n’avons pas besoin de compiler ces modules, juste notre nouveau. Il nous reste les drapeaux suivants :
--with-cc-opt='-g -O2 -fdebug-prefix-map=/build/nginx-mcUg8N/nginx-1.14.0=. -fstack-protector-strong -Wformat -Werror=format-security -fPIC -Wdate-time -D_FORTIFY_SOURCE=2' \
--with-ld-opt='-Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -fPIC' \
--prefix=/usr/share/nginx \
--conf-path=/etc/nginx/nginx.conf \
--http-log-path=/var/log/nginx/access.log \
--error-log-path=/var/log/nginx/error.log \
--lock-path=/var/lock/nginx.lock \
--pid-path=/run/nginx.pid \
--modules-path=/usr/lib/nginx/modules \
--http-client-body-temp-path=/var/lib/nginx/body \
--http-fastcgi-temp-path=/var/lib/nginx/fastcgi \
--http-proxy-temp-path=/var/lib/nginx/proxy \
--http-scgi-temp-path=/var/lib/nginx/scgi \
--http-uwsgi-temp-path=/var/lib/nginx/uwsgi \
--with-debug \
--with-pcre-jit \
--with-http_ssl_module \
--with-http_stub_status_module \
--with-http_realip_module \
--with-http_auth_request_module \
--with-http_v2_module \
--with-http_dav_module \
--with-http_slice_module \
--with-threads \
--with-http_addition_module \
--with-http_flv_module \
--with-http_geoip_module=dynamic \
--with-http_gunzip_module \
--with-http_gzip_static_module \
--with-http_image_filter_module=dynamic \
--with-http_mp4_module \
--with-http_perl_module=dynamic \
--with-http_random_index_module \
--with-http_secure_link_module \
--with-http_sub_module \
--with-http_xslt_module=dynamic \
--with-mail=dynamic \
--with-mail_ssl_module \
--with-stream=dynamic \
--with-stream_ssl_module \
--with-stream_ssl_preread_module
AVERTISSEMENT Si vous ne le faites pas, vous finirez par avoir une erreur plus tard lorsque vous essayerez de charger le module qui ressemble à ceci : # module "/usr/lib/nginx/modules/ngx_http_upload_module.so" is not binary compatible in /etc/nginx/modules-enabled/50-mod-http-upload.conf:1
Assurez-vous d’utiliser ces mêmes drapeaux lors de la compilation afin de ne pas obtenir cette erreur.
Compilation du module
Il ne nous reste plus qu’à sauter dans le répertoire source de nginx et compiler le module. Nous ajouterons le drapeau pour compiler notre nouveau module dynamique à la fin après les autres drapeaux --add-dynamic-module=../nginx-upload-module-module-master
cd nginx-1.14.0
./configure \
--with-cc-opt='-g -O2 -fdebug-prefix-map=/build/nginx-mcUg8N/nginx-1.14.0=. -fstack-protector-strong -Wformat -Werror=format-security -fPIC -Wdate-time -D_FORTIFY_SOURCE=2' \
--with-ld-opt='-Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -fPIC' \
--prefix=/usr/share/nginx \
--conf-path=/etc/nginx/nginx.conf \
--http-log-path=/var/log/nginx/access.log \
--error-log-path=/var/log/nginx/error.log \
--lock-path=/var/lock/nginx.lock \
--pid-path=/run/nginx.pid \
--modules-path=/usr/lib/nginx/modules \
--http-client-body-temp-path=/var/lib/nginx/body \
--http-fastcgi-temp-path=/var/lib/nginx/fastcgi \
--http-proxy-temp-path=/var/lib/nginx/proxy \
--http-scgi-temp-path=/var/lib/nginx/scgi \
--http-uwsgi-temp-path=/var/lib/nginx/uwsgi \
--with-debug \
--with-pcre-jit \
--with-http_ssl_module \
--with-http_stub_status_module \
--with-http_realip_module \
--with-http_auth_request_module \
--with-http_v2_module \
--with-http_dav_module \
--with-http_slice_module \
--with-threads \
--with-http_addition_module \
--with-http_flv_module \
--with-http_geoip_module=dynamic \
--with-http_gunzip_module \
--with-http_gzip_static_module \
--with-http_image_filter_module=dynamic \
--with-http_mp4_module \
--with-http_perl_module=dynamic \
--with-http_random_index_module \
--with-http_secure_link_module \
--with-http_sub_module \
--with-http_xslt_module=dynamic \
--with-mail=dynamic \
--with-mail_ssl_module \
--with-stream=dynamic \
--with-stream_ssl_module \
--with-stream_ssl_preread_module \
--add-dynamic-module=../nginx-upload-module-master
make modules
S’il vous manque des dépendances, ces commandes configure et make peuvent échouer. Assurez-vous d’installer toutes les dépendances manquantes et réessayez.
Installation du module compilé
La dernière étape consiste simplement à déplacer le module compilé à un endroit que NGINX peut trouver et dire à NGINX de le charger. Nous allons déplacer le module dynamique compilé vers /usr/lib/nginx/modules
où vivent les autres modules et ensuite créer un fichier de configuration disant à NGINX de charger ce module.
sudo mv objs/ngx_http_upload_module.so /usr/lib/nginx/modules
echo 'load_module /usr/lib/nginx/modules/ngx_http_upload_module.so;' | sudo tee /etc/nginx/modules-enabled/50-mod-http-upload.conf
Test du module
Enfin et surtout, nous voulons confirmer que tout fonctionne bien. Une vérification rapide est que nous pouvons exécuter la commande suivante pour vérifier notre configuration. Si tout s’est bien passé, vous devriez obtenir le résultat suivant.
sudo nginx -t
# nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
# nginx: configuration file /etc/nginx/nginx.conf test is successful
Et pour le vrai test, vous pouvez ajouter les lignes du module à votre bloc serveur nginx, redémarrer nginx, et vous assurer qu’elles fonctionnent réellement.
Conclusion
Les modules dynamiques sont géniaux. Bien qu’ils puissent être un peu plus difficiles à compiler, nous n’avons plus à nous soucier de recompiler TOUT NGINX si nous voulons utiliser un nouveau plugin. Nous espérons que ce guide vous aidera à compiler des modules pour votre système d’exploitation afin que vous puissiez continuer à utiliser la copie de NGINX fournie par votre référentiel.