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.