La société Cloudflare a publié la version 0.7 du framework Pingora, destiné au développement de services réseau sécurisés et performants en langage Rust. Le proxy construit avec Pingora est utilisé depuis plus de deux ans par le réseau de diffusion de contenu Cloudflare à la place de nginx et traite plus de 40 millions de requêtes par seconde. Le code est écrit en Rust et publié sous la licence Apache 2.0.
Fonctionnalités principales de Pingora :
- Prise en charge de HTTP/1 et HTTP/2 (HTTP/3 prévu), ainsi que la possibilité de créer des services utilisant leurs propres protocoles ou UDP/TCP.
- Prise en charge du traitement multithreading des requêtes en mode asynchrone.
- Possibilité d'attacher des gestionnaires de rappel et des filtres, permettant de gérer différentes étapes du traitement de la requête ainsi que de modifier, rediriger, bloquer et journaliser les requêtes et les réponses.
- Proxy gRPC et WebSocket.
- Load balancers plugables.
- Possibilité de modification de la configuration sans redémarrage.
- Support de mise à jour du code de l'application sans interruption des connexions.
- Outils pour le basculement en cas de défaillance.
- Intégration avec différents systèmes de surveillance et de journalisation (Syslog, Prometheus, Sentry, OpenTelemetry).
- Prise en charge du chiffrement TLS (utilise OpenSSL, BoringSSL ou Rustls).
- Paquets Rust prêts à l'emploi pour créer des proxy HTTP, travailler avec des protocoles réseau, analyser des en-têtes HTTP, comptabiliser et limiter le trafic, équilibrer la charge, gérer une table de hachage distribuée Ketama, maintenir un cache en mémoire et traiter les délais d'attente de manière asynchrone.
Parmi les changements dans la nouvelle version :
- Une nouvelle variable « extension » a été ajoutée à la structure SslDigest, et pour le trait TlsAccept, un gestionnaire handshake_complete_callback a été mis en œuvre, permettant d'attacher des données spécifiques à l'application à la connexion TLS. En exemple, il est démontré comment utiliser cette fonctionnalité pour créer de serveurs, lisant des informations à partir du certificat client et les renvoyant dans la réponse HTTP.
- Un trait ConnectionFilter a été ajouté pour filtrer les connexions TCP à l'étape avant l'accord des paramètres TLS, permettant ainsi d'économiser des ressources en abandonnant les connexions à un stade précoce.
- Le support des flux de transport virtuels (Virtual L4 Streams) a été ajouté, permettant d'intégrer dans pingora-proxy des implémentations propres de protocoles réseau.
- Il est désormais possible d'utiliser les options verify_cert et verify_hostname dans les configurations avec rustls.
- L'accès à la structure HttpProxy a été autorisé pour les crate externes afin de redéfinir la logique de proxy des requêtes.
- La possibilité de dédier des gestionnaires de fond pour les sous-requêtes en dehors du gestionnaire principal de session a été autorisée.
- La possibilité de suivre la taille des corps des requêtes HTTP1 et HTTP2, ainsi que les métriques de fonctionnement du proxy, a été fournie.
- Il est désormais possible de créer des sessions personnalisées pour le trafic HTTP encapsulé.
- Des limitations ont été imposées sur l'utilisation des versions de la bibliothèque lru (0.16.3 ou supérieure) à cause d'une vulnérabilité dans l'implémentation de l'itérateur IterMut, entraînant un plantage dû à la vérification des emprunts (borrow checker).
Source : opennet.ru
