Après un an de développement, une nouvelle branche stable du serveur HTTP haute performance et du proxy multiprotocole nginx 1.30.0 a été publiée, intégrant les modifications accumulées dans la branche principale 1.29.x. À l'avenir, toutes les modifications de la branche stable 1.30 seront liées à la correction de bugs critiques et de vulnérabilités. Une branche principale nginx 1.31 sera bientôt formée, où le développement de nouvelles fonctionnalités se poursuivra. Pour les utilisateurs ordinaires qui n'ont pas besoin d'assurer la compatibilité avec des modules tiers, il est recommandé d'utiliser la branche principale, dont les versions du produit commercial Nginx Plus sont publiées tous les trois mois. Le code de nginx est écrit en langage C et est distribué sous licence BSD.
Selon le rapport de février de Netcraft, environ 321 millions de sites sont gérés par nginx (245 millions l'année dernière, 243 millions deux ans auparavant, 289 millions trois ans auparavant). Nginx est utilisé sur 16,08 % de tous les sites actifs (17,89 % l'année dernière, 18,15 % deux ans auparavant, 18,94 % trois ans auparavant), ce qui représente la deuxième place en popularité dans cette catégorie (la part d'Apache est de 13,27 % (16,03 % l'année dernière, 20,09 % deux ans auparavant, 20,52 % trois ans auparavant), Cloudflare — 20,62 % (17,81 %, 14,12 %, 11,32 %), Google — 10,65 % (9,89 %, 10,41 %, 9,89 %).
En considérant tous les sites, nginx maintient sa position de leader avec une part de marché de 22,65 % (20,48 % l'année dernière, 22,31 % deux ans auparavant, 25,94 % trois ans auparavant), tandis que la part d'Apache est de 12,19 % (16,03 %, 20,17 %, 20,58 %), Cloudflare — 15,27 % (12,87 %, 11,24 %, 10,17 %), OpenResty (plateforme basée sur nginx et LuaJIT) — 8,01 % (9,36 %, 7,93 %, 7,94 %).
Parmi le million de sites les plus visités au monde, nginx occupe la deuxième place avec une part de 19,85 % (20,37 % l'année dernière, 20,63 % deux ans auparavant, 21,37 % trois ans auparavant). La première place est détenue par Cloudflare — 26,84 % (22,32 %, 22,59 %, 21,62 %). La part d'Apache httpd est de 15,84 % (17,95 %, 20,09 %, 21,18 %). 
Selon W3Techs, nginx est utilisé sur 32,8 % des sites parmi les million les plus visités (en avril de l'année dernière, ce chiffre était de 33,8 %, et de 34,3 %, deux ans auparavant). La part d'Apache a diminué cette année, passant de 26,3 % à 23,9 %, la part de Microsoft IIS a chuté de 4 % à 3,4 %, et la part de Caddy de 0,3 % à 0,2 %. La part de Node.js a augmenté de 4,4 % à 6,0 %, tandis que celle de LiteSpeed a progressé de 14,6 % à 15,2 %.
Les améliorations les plus notables ajoutées lors de la formation de la branche principale 1.29.x :
- Ajout de la prise en charge de l'extension TLS ECH (Encrypted ClientHello), qui poursuit le développement de l'extension ESNI (Encrypted Server Name Indication) et est utilisée pour chiffrer les informations sur les paramètres des sessions TLS, telles que le nom de domaine demandé. La principale différence entre ECH et ESNI est qu'avec ECH, au lieu de chiffrer les champs individuellement, l'ensemble du message ClientHello est chiffré, ce qui permet de bloquer les fuites via des champs qui ne sont pas couverts par ESNI, comme le champ PSK (Pre-Shared Key). L'utilisation d'ECH est activée en spécifiant dans la directive « ssl_ech_file » le fichier de configuration ECHConfig au format PEM. La prise en charge est disponible lors de l'utilisation des versions d'OpenSSL avec ECH.
- Ajout de la prise en charge du protocole Multipath TCP (MPTCP), permettant de livrer des paquets simultanément sur plusieurs chemins via différentes interfaces réseau. Pour l'activer, un paramètre « multipath » a été ajouté à la directive « listen ».
- Ajout de la possibilité de lier les sessions des clients à des serveurs spécifiques dans un groupe. Trois méthodes sont disponibles : « cookie » — transmission des informations sur le choix via un Cookie spécifié ; « route » — le serveur proxy attribue un itinéraire au client lors de la première demande ; « learn » — nginx analyse les réponses du serveur en amont et mémorise les sessions initiées par le serveur. Pour configurer la liaison, la directive « sticky » a été ajoutée au bloc « upstream » du module « http », et les paramètres « route » et « drain » ont été ajoutés à la directive « server ». le serveur Ajout de la directive « early_hints » et mise en œuvre du code HTTP 103 dans les réponses des backends proxy et gRPC. Le code 103 permet d'informer le client sur le contenu de certains en-têtes HTTP immédiatement après la demande, sans attendre que le serveur termine toutes les opérations liées à la demande et commence à délivrer le contenu. De cette manière, des indices sur les éléments liés à la page en cours de livraison peuvent être communiqués, qui peuvent être préchargés (par exemple, des liens vers les fichiers css et javascript utilisés sur la page). En recevant des informations sur de tels ressources, le navigateur commencera à les charger sans attendre que la page principale soit complètement livrée, ce qui permet de réduire le temps total de traitement de la demande.
- Ajout de la directive « early_hints » et mise en œuvre du code HTTP 103 dans les réponses des backends proxy et gRPC. Le code 103 permet d'informer le client sur le contenu de certains en-têtes HTTP immédiatement après la demande, sans attendre que le serveur termine toutes les opérations liées à la demande et commence à délivrer le contenu. De cette manière, des indices sur les éléments liés à la page en cours de livraison peuvent être communiqués, qui peuvent être préchargés (par exemple, des liens vers les fichiers css et javascript utilisés sur la page). En recevant des informations sur de telles ressources, le navigateur commencera à les charger sans attendre que la page principale soit complètement livrée, ce qui permet de réduire le temps total de traitement de la demande.
- Ajout des directives add_header_inherit et add_trailer_inherit, permettant de modifier les règles d'héritage des valeurs spécifiées dans les directives add_header et add_trailer. Le paramètre « off » annule l'héritage des valeurs, tandis que le paramètre « merge » inclut l'ajout des valeurs du niveau précédent aux valeurs du niveau actuel.
- Ajout de la directive « ssl_certificate_compression » pour gérer la compression. des certificats TLS.
- La directive max_headers a été ajoutée, limitant le nombre maximum d'en-têtes HTTP dans une requête. En cas de dépassement de la limite, une erreur 400 (Bad Request) est renvoyée. Cette fonctionnalité a été transférée de FreeNginx.
- Ajout des variables $request_port et $is_request_port. La première variable contient le numéro de port du composant URI ou de l'en-tête « Host », et la seconde contient « : » si la variable $request_port n'est pas vide.
- Ajout des variables $ssl_sigalg et $ssl_client_sigalg, contenant le nom de l'algorithme de signature utilisé pour une connexion TLS.
- Le paramètre « volatile » a été ajouté à la directive « geo », désactivant la mise en cache de la variable. L'utilisation de masques est autorisée dans la directive « include » spécifiée à l'intérieur du bloc « geo ».
- Dans le bloc « upstream », la directive « keepalive » est activée par défaut. À la directive « keepalive » utilisée dans le bloc « upstream », le paramètre « local » a été ajouté. En spécifiant ce paramètre, au lieu de partager une seule connexion avec un serveur upstream commun mentionné dans différents blocs location et server, chaque bloc maintient une connexion séparée vers l'upstream.
- En mode proxy, la version du protocole HTTP/1.1 est par défaut définie avec l'activation du mode keep-alive (dans le module ngx_http_proxy_module, le support keep-alive est activé par défaut et la valeur « 1.1 » est définie dans la directive « proxy_http_version », et l'envoi par défaut de l'en-tête « Connection » est interrompu).
- Le module ngx_http_proxy a été ajouté pour prendre en charge le protocole HTTP/2, ce qui permet d'utiliser HTTP/2 lors des requêtes vers les backends.
- Il est maintenant possible de charger des clés cryptographiques à partir de jetons matériels, en utilisant la bibliothèque OpenSSL comme fournisseur.
- La mise en œuvre du protocole QUIC a été améliorée pour prendre en charge le mode 0-RTT, disponible sur les systèmes avec OpenSSL 3.5.1 et les versions ultérieures.
- Ajout de la possibilité de compiler avec la bibliothèque cryptographique AWS-LC, développée par Amazon.
- La compression des certificats TLSv1.3 est désactivée par défaut.
- La compatibilité avec la bibliothèque OpenSSL 4.0 a été assurée.
Il convient de noter la publication de la version du projet FreeNginx 1.30.0, un fork de Nginx. Le développement de ce fork est dirigé par Maxim Dounin, l'un des développeurs clés de Nginx. FreeNginx se positionne comme un projet non commercial, garantissant le développement de la base de code de Nginx sans intervention corporative. Le code de FreeNginx continue d'être distribué sous la licence BSD. Parmi les changements dans la branche FreeNginx 1.30 : support ajouté pour l'extension TLS ECH (Encrypted Client Hello) ; amélioration du traitement de la directive limit_rate ; ajout des directives send_min_rate et client_body_min_rate ; mise en œuvre de la possibilité de limiter le nombre de connexions et l'intensité des requêtes dans le proxy de messagerie ; ajout du support de la base de données GeoIP2 dans le module GeoIP ; renforcement de la sécurité du module XSLT.
Source : opennet.ru
