Cloudflare opublikowało wydanie frameworka Pingora 0.7, przeznaczonego do tworzenia bezpiecznych, wydajnych usług sieciowych w języku Rust. Serwer proxy zbudowany przy użyciu Pingory jest używany w sieci dostarczania treści Cloudflare zamiast Nginx od ponad dwóch lat i przetwarza ponad 40 milionów żądań na sekundę. Kod napisany jest w języku Rust i opublikowany na licencji Apache 2.0.
Najważniejsze cechy Pingory:
- Wsparcie dla HTTP/1 i HTTP/2 (w planach HTTP/3), a także możliwość tworzenia usług z wykorzystaniem własnych protokołów lub UDP/TCP.
- Wsparcie dla wielowątkowego przetwarzania żądań w trybie asynchronicznym.
- Możliwość dołączenia procedur obsługi wywołań zwrotnych i filtrów, które pozwalają zarządzać różnymi etapami przetwarzania żądań, a także modyfikować, przekierowywać, blokować i rejestrować żądania i odpowiedzi.
- Proxowanie gRPC i WebSocket.
- Możliwość podłączenia modułów równoważących obciążenie.
- Możliwość zmiany konfiguracji bez ponownego uruchamiania.
- Obsługa aktualizacji kodu aplikacji bez zrywania połączeń.
- Środki do przełączania obciążenia w przypadku awarii (przełączenia awaryjnego).
- Integracja z różnymi systemami monitorowania i logowania (Syslog, Prometheus, Sentry, OpenTelemetry).
- Obsługa szyfrowania TLS (przy użyciu OpenSSL, BoringSSL lub Rustls).
- Gotowe pakiety Rust do tworzenia serwerów proxy HTTP, pracy z protokołami sieciowymi, parsowania nagłówków HTTP, rozliczania i ograniczania ruchu, równoważenia obciążenia, pracy z rozproszoną tablicą mieszającą Ketama, utrzymywania pamięci podręcznej w pamięci RAM i asynchronicznego przetwarzania timeoutów.
Wśród zmian w nowej wersji:
- Do struktury SslDigest dodano pole „rozszerzenie”, a dla cechy TlsAccept zaimplementowano obsługę handshake_complete_callback, umożliwiającą dołączenie dowolnych danych specyficznych dla aplikacji do połączenia TLS. Pokazano przykład użycia tej funkcji do tworzenia serwer, który odczytuje informacje z certyfikatu klienta i zwraca je w odpowiedzi HTTP.
- Dodano cechę ConnectionFilter umożliwiającą filtrowanie połączeń TCP przed negocjacją parametrów TLS, co pozwala oszczędzać zasoby poprzez wcześniejsze zrywanie połączeń.
- Dodano obsługę strumieni warstwy transportu wirtualnego (wirtualne strumienie L4), co pozwala na integrację własnych implementacji protokołów sieciowych z pingora-proxy.
- Dodano możliwość użycia opcji verify_cert i verify_hostname w konfiguracjach z rustls.
- Zewnętrzne pakiety skrzynek mogą teraz uzyskiwać dostęp do struktury HttpProxy, aby zastąpić logikę proxy żądań.
- Umożliwia oddzielenie obsługi podżądań w tle od obsługi sesji głównej.
- Dodano możliwość śledzenia rozmiaru żądań HTTP1 i HTTP2 oraz metryk wydajności serwera proxy.
- Dodano możliwość tworzenia niestandardowych sesji dla ruchu HTTP w formie kapsułki.
- Wprowadzono ograniczenia w korzystaniu z wersji biblioteki lru (0.16.3 i nowszych) ze względu na lukę w zabezpieczeniach implementacji iteratora IterMut, która prowadzi do awarii w wyniku uruchomienia modułu sprawdzającego pożyczenie.
Źródło: opennet.ru
