Code-Garage #81 - La compression Gzip

Durée: 10038m29s

Date de sortie: 14/11/2023

Pourquoi activer la compression sur un serveur web ? Comment ça marche et quels sont les avantages de cette technologie ?

Notes de l'épisode :

Salut et bienvenue dans ce nouvel épisode du podcast de Code Garage.
Je m'appelle Nicolas Brandin-Bernard
et aujourd'hui on va parler de la compression jésip,
comprendre un petit peu ce que c'est et comment ça fonctionne.
Alors si vous utilisez des outils d'analyse des performances de votre site web,
comme Google Lighthouse par exemple,
vous avez sûrement vu ce conseil passé,
activer la compression jésip sur votre serveur web
pour réduire le poids des réponses HTTP.
Mais qu'est-ce que ça signifie exactement ?
Alors d'abord on va reprendre la base pourquoi est-ce qu'on doit compresser
et notamment compresser les réponses de notre serveur web.
Même si aujourd'hui nos infrastructures réseaux
essaient de plus en plus performantes,
la performance de nos machines en termes de nombre de calculs effectués à la seconde
évolue, lui, beaucoup plus vite.
C'est ce que prédisait la loi de Mour il y a déjà des dizaines d'années,
bon, qui est un petit peu moins vrai aujourd'hui,
mais on ne va pas rentrer dans les détails.
Alors ça signifie notamment qu'en termes de performance,
c'est aujourd'hui plus efficace de perdre quelques millisecondes
pour compresser une donnée avant de l'envoyer
et de repérer quelques millisecondes pour la décompresser à l'arrivée
que de l'envoyer brut en termes de taux de transfert.
Alors est-ce que c'est toujours le cas ?
En fait comme toute compression,
il y a certains cas particuliers où la compression
n'est pas suffisamment efficace pour être intéressante,
mais c'est vraiment très rare.
Alors si jamais vous n'êtes pas familiers avec le concept de compression sans perte,
je vous invite à écouter un précédent épisode
dans lequel on parle de l'algorithme RLE
qui est une très bonne introduction justement à l'algorithmie de compression sans perte.
Et ça vous permettra de vous familiariser avec quelques concepts
comme justement l'auto de compression
qui lui va varier selon les algorithmes
et également les données à compresser.
Alors c'est quoi l'utilité de jzip exactement ?
Vous connaissez sûrement le concept d'archives compressées qu'on appelle zip,
eh bien jzip tire son nom de cette technologie
et signifie en réalité GNU zip.
Mais attention parce que même si l'un tire son nom de l'autre,
eh bien les deux technologies pardon sont vraiment différentes.
Un fichier zip c'est une archive
qui contient un ou plusieurs fichiers compressés individuellement
et qui sont regroupés ensemble dans un dossier.
Alors il y a de nombreux algorithmes de compression compatible
pour créer une archive zip.
Donc zip il faut garder en tête que c'est une archive.
Jzip c'est différent.
C'est un logiciel de compression, d'écompression,
de fichiers uniques mais également de flux de données.
C'est ce qui en fait un outil vraiment formidable
pour traiter des données qui arrivent directement du réseau.
Puisque les données qui arrivent du réseau,
elles arrivent en plusieurs paquets,
ce qu'on appelle l'ensemble de ces paquets qui arrivent au fil du temps,
on appelle ça justement un flux.
Et c'est justement cette capacité-là qui va le faire exploser,
faire exploser son utilisation dans le monde du web.
Et la compression coffre jzip, elle est vraiment pas anodine
parce qu'on parle d'un taux de compression moyen d'environ 15%.
Alors c'est quoi l'algorithme derrière jzip ?
Le logiciel jzip, il utilise l'algorithme qui s'appelle deflate
et qui est lui-même une combinaison entre un algorithme appelé LZ77
et le codage de Huffman.
Alors je ne vais pas rentrer dans les détails de l'implémentation
de cet algorithme dans l'épisode, ce serait trop long,
mais je vais juste vous évoquer les grands principes
et les avantages qu'offrent ces principes.
Si jamais vous voulez comprendre l'implémentation au complet de l'algorithme,
notamment LZ170, je vous conseille une petite série de vidéos
que je vous mets directement dans les notes de l'épisode.
Alors LZ170, c'est un algorithme de compression sans perte, comme je l'ai dit,
basé sur un dictionnaire de motifs.
Ça signifie qu'en gros, l'algorithme,
il va parcourir les données binaires du fichier.
Alors quand on dit binaires, ça peut être les données hexadecimales,
mais c'est pour dire que ce n'est pas du texte compréhensible par un humain.
Il va indexer chaque nouveau motif découvert dans le dictionnaire.
Alors un motif très rapidement, qu'est-ce que c'est ?
Eh bien par exemple, coucou, le mot coucou,
on pourrait le décomposer en plusieurs motifs.
Alors on ne prend pas les caractères tout seuls,
mais on pourrait décomposer en motif CO.
Le motif CO, on le retrouve deux fois dans coucou.
Ça peut être COU qu'on retrouve également deux fois dans coucou.
Et ça peut être le motif COUC,
qui pour le coup, on le retrouve qu'une seule fois dans coucou.
C'est ça un motif.
C'est un truc qui va pouvoir se répéter,
un ensemble de données qui va pouvoir se répéter.
Et donc, il va indexer chaque nouveau motif découvert dans un dictionnaire.
Et il va remplacer le motif qui a été trouvé par son index dans le dictionnaire,
qui sera ensuite le fichier compressé.
Le parcours du fichier, il se fait avec une fenêtre glissante.
Ça veut dire qu'il va parcourir chaque caractère
et l'associer au N caractère précédent
pour détecter un motif qui existe déjà ou non.
S'il existe, il va simplement être référencé avec l'index du dictionnaire
et s'il n'existe pas, il va être ajouté dans le dictionnaire.
Alors avec N supérieur ou égal à 1,
ça veut dire que la plus petite taille de motif,
ce sera forcément deux caractères.
On n'aura jamais un caractère tout seul.
Cette méthode de compression possède un gros avantage.
C'est qu'il n'y a pas besoin de posséder l'entierté du fichier
pour commencer la décompression.
Effectivement, le dictionnaire est situé au début du fichier compressé.
Donc une fois qu'on a ce dictionnaire,
la détection des motifs comme elle est linéaire,
caractère par caractère,
il suffit de relier chaque index à son motif
qui correspond dans le dictionnaire pour retrouver le fichier d'origine.
Et c'est notamment ce concept-là
qui fait qu'on peut l'utiliser dans des flux de données comme le réseau.
Alors pour activer la compression, j'hésite sur un site.
Il y a deux grandes étapes.
Il y a une étape qui va se faire côté client,
il y a une étape qui va se faire côté serveur.
Pour activer la compression des réponses HTTP,
il faut que le client et le serveur travaillent main dans la main
pour se mettre d'accord sur une méthode de compression à utiliser.
Pour indiquer au serveur de compresser les données,
le client, quand on parle de client, c'est évidemment le navigateur,
doit ajouter une entête spécifique à toutes les requêtes.
Cette entête, c'est Accept Encoding.
Et la valeur de cette entête, en l'occurrence,
ça va être jésip en minuscule.
Mais heureusement, tous les navigateurs modernes
ajoutent automatiquement cette entête par défaut.
Vous aurez donc en réalité rien à faire,
c'est fait automatiquement.
Cette entête, elle indique au serveur,
si tu peux me compresser cette réponse,
enfin la réponse que tu vas me donner en jésip,
alors fais-le, mais rien n'oblige le serveur à le faire,
s'il n'a pas cette possibilité là, il ne fera simplement pas.
Et côté serveur,
lui, il doit compresser les données contenues
qui vont être contenues dans la réponse,
mais il doit également indiquer au client
que la réponse a été compressée
avec une entête spécifique,
qui est Elle Content Encoding
et qui, pareil, va avoir la valeur jésip.
En l'occurrence, c'est là où le serveur dit
oui, j'ai réussi à compresser ces données
ou non, je n'ai pas réussi à compresser ces données.
Alors pour l'activer, cette compression côté serveur,
si on prend les deux grands serveurs web,
qui sont NGNX et Apache,
pour activer la compression jésip sur NGNX,
il suffit, dans le fichier de configuration NGNX.conf,
d'ajouter une petite directive qui va être
jésip on.
Alors, évidemment, il y a plein de configurations
qui sont possibles.
Si jamais vous voulez le détail, je vous mettrai la documentation officielle
dans les notes de l'épisode.
Et pour Apache,
pour Apache version 2 et plus,
il faudra d'abord activer le module,
qui est le module Deflate,
qui est l'algorithme de compression,
et il faudra redémarrer le service Apache
pour que le module soit pris en compte.
Donc ça, je vous mettrai
une petite article d'origine de cet épisode
dans les notes justement de cet épisode.
Comme ça, vous aurez la liste des commandes
si jamais vous en avez besoin.
Et ensuite, il faudra ajouter
une directive dans le fichier
Apache2.conf,
c'est directive, c'est if-mod-deflate-c
et bien après,
vous ajoutez des types
pour tous les types MIM
présents dans les réponses HTTP.
Et ensuite, vous avez évidemment plein de configurations,
pareil, vous retrouvez ça
dans les notes de l'épisode.
Alors avant de se quitter,
il faut noter quelque chose,
et il faut faire attention parce que,
utiliser JASIP, ça n'exclue pas le fait
de devoir minifier ces fichiers source.
La compression ne remplace
jamais la minification.
C'est deux choses qui sont complémentaires.
Et il faut savoir aussi que
JASIP, il est conçu que
pour compresser des fichiers uniques,
mais il est possible de le coupler
avec un système d'archives,
notamment l'archive TAR
pour créer une archive
compressée que vous aurez peut-être déjà
vu, notamment si vous êtes sous des systèmes Linux
ou MacOS, et on n'utilise pas
ZIP, on utilise des
pointar.jz,
et bien ça veut dire que c'est une archive
TAR qui est compressée avec JASIP.
J'espère que cet épisode vous aura été utile,
que vous aurez appris des choses.
Moi je vous donne rendez-vous la semaine prochaine
pour un prochain épisode du podcast,
ou directement sur code-garage.fr
pour retrouver tous nos podcasts, nos articles de blog,
toutes nos formations, et là
il y a énormément de nouvelles fonctionnalités
notamment autour de la communauté.
Vous pouvez créer votre portfolio directement
sur code-garage et ajouter
vos projets, mettre en avant vos projets.
Je vous conseille vraiment de les référer un tour,
il y a des fonctionnalités qui sortent toutes les semaines,
donc il ne faudrait pas louper ça.
Moi je vous dis à la semaine prochaine, salut !

Les infos glanées

Je suis une fonctionnalité encore en dévelopement

Signaler une erreur

Code-Garage

Découvrons ensemble des sujets passionnants autour du métier de dev et de la programmation en général !
Tags
Card title

Lien du podcast

[{'term': 'Technology', 'label': None, 'scheme': 'http://www.itunes.com/'}]

Go somewhere