Vendredi 23 novembre 2018 (Modifié le Vendredi 23 novembre 2018)

Compiler et personnaliser Nginx sous Debian 8

Source : nginx.org

C’est bien connu, Nginx est incapable de charger de nouveaux modules à chaud contrairement à Apache et si vous souhaitez personnaliser votre installation de Nginx avec un module complémentaire de votre cru ou bien un module de la communauté, il va falloir recompiler Nginx à la main.
Avant de vous lancer à corps perdu dans la compilation, sachez que les dépôts Debian proposent plusieurs versions de Nginx contenant différentes options de compilation et différents modules. À vous de voir si ce que vous cherchez n’est pas déjà présent dans les dépôts. D’ailleurs en parlant de dépôt, vous vous apercevrez que ceux de la version stable de Debian 7.x proposent une ancienne version de Nginx. Nous allons donc plutôt utiliser les dépôts « backport source », afin de profiter des dernières fonctionnalités de Nginx. Le module que je vais installer en complément est un module de limitation de bande passante qui permet d’affecter une bande passante maximale par IP, et non par connexion comme le propose nativement Nginx. Ce module s’intitule nginx_limit_speed_module et les sources sont disponibles sur GitHub.

Debian 7 ,vérifier la présence des dépôts Backports

Les dépôts Backports permettent d’intégrer à votre version stable de Debian un paquet issu de la version Testing. En effet lorsqu’un paquet est publié en version Debian Stable, celui-ci n’est normalement plus mis à jour en termes de nouvelles fonctionnalités. Seuls les correctifs de sécurité seront publiés. C’est donc une possibilité pour obtenir les dernières version de certains paquets, tout en restant sur la version Stable de Debian.

Le fichier /etc/apt/sources.list doit contenir les lignes suivantes :

[...]
deb http://ftp.fr.debian.org/debian/ wheezy-backports main
deb-src http://ftp.fr.debian.org/debian/ wheezy-backports main

Puis sudo apt-get update après avoir ajouté les lignes.

Debian 8 ,vérifier la présence des dépôts sources

Les dépôts sources permettent la compilation
Le fichier /etc/apt/sources.list doit contenir les lignes suivantes :

[...]
deb-src http://ftp.fr.debian.org/debian/ jessie-updates main
deb-src http://ftp.fr.debian.org/debian/ jessie main
deb-src http://security.debian.org/ jessie/updates main

Puis sudo apt-get update après avoir ajouté les lignes.

Récupérer les sources Nginx depuis les dépôts

Maintenant que les dépôts sont correctement configurés, nous allons récupérer les sources Nginx.
Mais avant nous allons installer quelques dépendances contenant les outils nécessaires à la compilation, ainsi que les dépendances Nginx.
sudo apt-get install unzip
Pour la compilation, et…
sudo apt-get build-dep nginx
… pour les dépendances. Il ne reste plus qu’à récupérer les sources.
Les placer dans /usr/src/nginx-custom
Créer et se placer dans le dossier puis télécharger les sources :
sudo mkdir /usr/src/nginx-custom
cd /usr/src/nginx-custom
sudo apt-get source nginx

Personnaliser l’installation de Nginx

Normalement votre dossier doit ressembler à quelque chose comme ceci :

ls -l
total 1400
drwxr-xr-x 10 root root   4096 août  25 14:09 nginx-1.6.2
-rw-r--r--  1 root root 609344 juin   1 12:19 nginx_1.6.2-5+deb8u2.debian.tar.xz
-rw-r--r--  1 root root   2873 juin   1 12:19 nginx_1.6.2-5+deb8u2.dsc
-rw-r--r--  1 root root 804164 févr. 10  2016 nginx_1.6.2.orig.tar.gz

Pour ajouter le nouveau module, il faut aller dans le dossier nginx-1.6.2 :
cd /usr/src/nginx-custom/nginx-1.6.2/debian/modules
Et c’est ici qu’il faut copier les modules supplémentaires.
Ils sont en majorité sur GitHub ,faire juste un git clone.

Chiffrement déchiffrement pour les variables nginx
git clone https://github.com/openresty/encrypted-session-nginx-module.git
Capacité d’échappement,encodage et décodage hexa,MD5,SHA1,Bsae32,Base64 ,etc…
git clone https://github.com/openresty/set-misc-nginx-module
Le dossier doit ressembler à ceci :

ls -l
total 60
drwxr-xr-x 6 root root 4096 août  25 14:20 encrypted-session-nginx-module
drwxr-xr-x 6 root root 4096 févr. 10  2016 headers-more-nginx-module
drwxr-xr-x 2 root root 4096 févr. 10  2016 nginx-auth-pam
drwxr-xr-x 3 root root 4096 févr. 10  2016 nginx-cache-purge
drwxr-xr-x 2 root root 4096 févr. 10  2016 nginx-dav-ext-module
drwxr-xr-x 9 root root 4096 févr. 10  2016 nginx-development-kit
drwxr-xr-x 6 root root 4096 févr. 10  2016 nginx-echo
drwxr-xr-x 4 root root 4096 févr. 10  2016 nginx-http-push
drwxr-xr-x 9 root root 4096 févr. 10  2016 nginx-lua
drwxr-xr-x 3 root root 4096 févr. 10  2016 nginx-upload-progress
drwxr-xr-x 2 root root 4096 févr. 10  2016 nginx-upstream-fair
drwxr-xr-x 2 root root 4096 févr. 10  2016 ngx-fancyindex
drwxr-xr-x 5 root root 4096 févr. 10  2016 ngx_http_substitutions_filter_module
-rw-r--r-- 1 root root 1525 févr. 10  2016 README.Modules-versions
drwxr-xr-x 6 root root 4096 août  25 14:21 set-misc-nginx-module

Configurer la compilation

Maintenant que notre module a été ajouté aux sources, il va falloir ajouter quelques paramètres au processus de compilation pour que le module soit pris en compte.
Pour cela, il va falloir éditer le fichier /usr/src/nginx-custom/nginx-1.6.2/debian/rules et trouver les blocs qui commencent par light_configure_flags, full_configure_flags et extras_configure_flags.
Chacun de ces blocs définissent les options de compilations des différents paquets que nous obtiendront à la fin du processus.
Ils contiennent tous une ou plusieurs lignes commençant par –add-module. Vous l’avez deviné, c’est par ici que ça se passe ! Personnellement comme je ne souhaite modifier que la version «extra», je modifie le bloc extras_configure_flags :

extras_configure_flags := \
                        $(common_configure_flags) \
                        [...]
                        --add-module=$(MODULESDIR)/ngx_http_substitutions_filter_module \
                        --add-module=$(MODULESDIR)/encrypted-session-nginx-module \
                        --add-module=$(MODULESDIR)/set-misc-nginx-module                      

Modification fichier du module « fancyindex » pour avoir 500 caractères max par ligne :
cd /usr/src/nginx-custom/nginx-1.6.2/debian/modules/ngx-fancyindex/
sudo nano ngx_http_fancyindex_module.c
Modifier la ligne suivante
#define NGX_HTTP_FANCYINDEX_NAME_LEN 500

Mise à jour du changelog

Cette étape permet d’éviter d’avoir des conflits de version.
Éditez le fichier /usr/src/nginx-custom/nginx-1.6.2/debian/changelog, et ajoutez par exemple ‘-yan’ au numéro de version.

nginx (1.6.2-5+deb8u2-yan) jessie-security; urgency=medium
 
  [ Christos Trochalakis ]

Compilation

Le moment est venu de compiler !
Placez-vous dans le dossier /usr/src/nginx-custom/nginx-1.6.2
cd /usr/src/nginx-custom/nginx-1.6.2
Installer les dépendances manquantes
sudo apt install autotools-dev dh-systemd libgd2-dev libgeoip-dev libluajit-5.1-dev libmhash-dev libpam0g-dev libpcre3-dev libperl-dev libxslt1-dev
Lancez la commande suivante pour la compilation :
sudo dpkg-buildpackage -b
À la fin du processus, le dossier /usr/src/nginx-custom doit contenir nos nouveaux paquets :

total 13028
drwxr-xr-x 10 root root    4096 août  25 13:35 nginx-1.6.2
-rw-r--r--  1 root root   72238 août  25 15:58 nginx_1.6.2-5+deb8u2-custom_all.deb
-rw-r--r--  1 root root    4055 août  25 15:58 nginx_1.6.2-5+deb8u2-custom_amd64.changes
-rw-r--r--  1 root root  609344 juin   1 12:19 nginx_1.6.2-5+deb8u2.debian.tar.xz
-rw-r--r--  1 root root    2873 juin   1 12:19 nginx_1.6.2-5+deb8u2.dsc
-rw-r--r--  1 root root  804164 févr. 10  2016 nginx_1.6.2.orig.tar.gz
-rw-r--r--  1 root root   86606 août  25 15:58 nginx-common_1.6.2-5+deb8u2-custom_all.deb
-rw-r--r--  1 root root   83818 août  25 15:58 nginx-doc_1.6.2-5+deb8u2-custom_all.deb
-rw-r--r--  1 root root  595002 août  25 15:58 nginx-extras_1.6.2-5+deb8u2-custom_amd64.deb
-rw-r--r--  1 root root 4975024 août  25 15:58 nginx-extras-dbg_1.6.2-5+deb8u2-custom_amd64.deb
-rw-r--r--  1 root root  429670 août  25 15:58 nginx-full_1.6.2-5+deb8u2-custom_amd64.deb
-rw-r--r--  1 root root 3141562 août  25 15:58 nginx-full-dbg_1.6.2-5+deb8u2-custom_amd64.deb
-rw-r--r--  1 root root  332540 août  25 15:58 nginx-light_1.6.2-5+deb8u2-custom_amd64.deb
-rw-r--r--  1 root root 2176366 août  25 15:58 nginx-light-dbg_1.6.2-5+deb8u2-custom_amd64.deb

J’ai eu quelques souci pour compiler à cause d’une clé GPG manquante pour signer les paquets.
La signature de paquet n’est pas obligatoire et peut être passée en ajoutant l’option -uc. OU vous pouvez toujours chercher la clé manquante sur Internet

Installation de notre version de Nginx

Après la compilation, l’installation !
Vous l’avez vu on se retrouve avec différentes versions de Nginx correspondant en fait aux différentes versions proposées dans les dépôts.
Vous trouvez plus d’informations concernant ces différences sur wiki Debian.
Par défaut, lorsque vous installez le paquet « nginx », on veut la version extra
sudo dpkg -i nginx-extras_1.6.2-5+deb8u2-custom_amd64.deb nginx-common_1.6.2-5+deb8u2-custom_all.deb nginx_1.6.2-5+deb8u2-custom_all.deb
Pourquoi installer trois paquets ?
Le premier correspond à la version de Nginx choisie, les deux autres contiennent des dépendances indispensables.
Si jamais vous rencontrez d’autres problèmes de dépendances supplémentaires, utilisez :
sudo apt-get -f install
Et voilà, vous disposez maintenant d’une version de Nginx personnalisée !
sudo nginx -V
devrait afficher vos modules supplémentaires