ΠΠΎΠΌΠΏΠ°Π½ΠΈΡ Cloudflare ΠΏΡΡΠ½Π° Π²Π΅ΡΡΠΈΡ 0.7 Π½Π° ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠ° Pingora, ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½ Π·Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ°ΡΠ° Π½Π° Π·Π°ΡΠΈΡΠ΅Π½ΠΈ ΠΈ Π²ΠΈΡΠΎΠΊΠΎΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΈ ΠΌΡΠ΅ΠΆΠΎΠ²ΠΈ ΡΡΠ»ΡΠ³ΠΈ Π½Π° Π΅Π·ΠΈΠΊΠ° Rust. ΠΡΠΎΠΊΡΠΈ ΡΡΠ·Π΄Π°Π΄Π΅Π½ΠΈ Ρ Pingora Π²Π΅ΡΠ΅ ΠΏΠΎΠ²Π΅ΡΠ΅ ΠΎΡ Π΄Π²Π΅ Π³ΠΎΠ΄ΠΈΠ½ΠΈ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ Π² ΠΌΡΠ΅ΠΆΠ°ΡΠ° Π·Π° Π΄ΠΎΡΡΠ°Π²ΠΊΠ° Π½Π° ΡΡΠ΄ΡΡΠΆΠ°Π½ΠΈΠ΅ Π½Π° Cloudflare Π²ΠΌΠ΅ΡΡΠΎ nginx ΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ²Π°Ρ Π½Π°Π΄ 40 ΠΌΠΈΠ»ΠΈΠΎΠ½Π° Π·Π°ΡΠ²ΠΊΠΈ Π² ΡΠ΅ΠΊΡΠ½Π΄Π°. ΠΠΎΠ΄ΡΡ Π΅ Π½Π°ΠΏΠΈΡΠ°Π½ Π½Π° Π΅Π·ΠΈΠΊΠ° Rust ΠΈ Π΅ ΠΏΡΠ±Π»ΠΈΠΊΡΠ²Π°Π½ ΠΏΠΎΠ΄ Π»ΠΈΡΠ΅Π½Π·ΠΈΡ Apache 2.0.
ΠΡΠ½ΠΎΠ²Π½ΠΈ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ Π½Π° Pingora:
- ΠΠΎΠ΄Π΄ΡΡΠΆΠΊΠ° Π½Π° HTTP/1 ΠΈ HTTP/2 (Π² ΠΏΠ»Π°Π½ΠΎΠ²Π΅ΡΠ΅ Π΅ Π΄ΠΎΠ±Π°Π²ΡΠ½Π΅ΡΠΎ Π½Π° HTTP/3), ΠΊΠ°ΠΊΡΠΎ ΠΈ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π·Π° ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ Π½Π° ΡΡΠ»ΡΠ³ΠΈ, ΠΊΠΎΠΈΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΡΠ²ΠΎΠΈ ΡΠΎΠ±ΡΡΠ²Π΅Π½ΠΈ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»ΠΈ ΠΈΠ»ΠΈ UDP/TCP.
- ΠΠΎΠ΄Π΄ΡΡΠΆΠΊΠ° Π½Π° ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° Π·Π°ΡΠ²ΠΊΠΈ Π² Π°ΡΠΈΠ½Ρ ΡΠΎΠ½Π΅Π½ ΡΠ΅ΠΆΠΈΠΌ.
- ΠΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π·Π° ΠΏΡΠΈΠΊΡΠ΅ΠΏΠ²Π°Π½Π΅ Π½Π° callback ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΡΠΈ ΠΈ ΡΠΈΠ»ΡΡΠΈ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π°ΡΠΈ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π΅ΡΠ°ΠΏΠΈ Π½Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° Π·Π°ΡΠ²ΠΊΠΈΡΠ΅, ΠΊΠ°ΠΊΡΠΎ ΠΈ ΠΌΠΎΠ΄ΠΈΡΠΈΡΠΈΡΠ°Π½Π΅, ΠΏΡΠ΅Π½Π°ΡΠΎΡΠ²Π°Π½Π΅, Π±Π»ΠΎΠΊΠΈΡΠ°Π½Π΅ ΠΈ Π»ΠΎΠ³Π²Π°Π½Π΅ Π½Π° Π·Π°ΡΠ²ΠΊΠΈ ΠΈ ΠΎΡΠ³ΠΎΠ²ΠΎΡΠΈ.
- ΠΡΠΎΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° gRPC ΠΈ WebSocket.
- ΠΠΎΠ΄ΠΊΠ»ΡΡΠ°Π΅ΠΌΠΈ Π±Π°Π»Π°Π½ΡΠΈΡΠΎΠ²ΡΠΈΡΠΈ Π½Π° Π½Π°ΡΠΎΠ²Π°ΡΠ²Π°Π½Π΅ΡΠΎ.
- ΠΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π·Π° ΠΏΡΠΎΠΌΡΠ½Π° Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° Π±Π΅Π· ΡΠ΅ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅.
- ΠΠΎΠ΄Π΄ΡΡΠΆΠΊΠ° Π½Π° ΠΎΠ±Π½ΠΎΠ²ΡΠ²Π°Π½Π΅ Π½Π° ΠΊΠΎΠ΄Π° Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ Π±Π΅Π· ΡΠ°Π·ΠΊΡΡΠ²Π°Π½Π΅ Π½Π° ΡΡΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡΡΠ°.
- Π‘ΡΠ΅Π΄ΡΡΠ²Π° Π·Π° ΠΏΡΠ΅Π²ΠΊΠ»ΡΡΠ²Π°Π½Π΅ Π½Π° Π½Π°ΡΠΎΠ²Π°ΡΠ²Π°Π½Π΅ΡΠΎ Π² ΡΠ»ΡΡΠ°ΠΉ Π½Π° ΠΏΡΠΎΠ²Π°Π» (failover).
- ΠΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΡΠΈΡΡΠ΅ΠΌΠΈ Π·Π° ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³ ΠΈ Π»ΠΎΠ³ΠΈΡΠ°Π½Π΅ (Syslog, Prometheus, Sentry, OpenTelemetry).
- ΠΠΎΠ΄Π΄ΡΡΠΆΠΊΠ° Π½Π° TLS ΡΠΈΡΡΠΎΠ²Π°Π½Π΅ (ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΡΠ΅ OpenSSL, BoringSSL ΠΈΠ»ΠΈ Rustls).
- ΠΠΎΡΠΎΠ²ΠΈ Rust ΠΏΠ°ΠΊΠ΅ΡΠΈ Π·Π° ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° HTTP ΠΏΡΠΎΠΊΡΠΈΡΠ°, ΡΠ°Π±ΠΎΡΠ° Ρ ΠΌΡΠ΅ΠΆΠΎΠ²ΠΈ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»ΠΈ, Π°Π½Π°Π»ΠΈΠ· Π½Π° HTTP Π·Π°Π³Π»Π°Π²ΠΈΡ, ΠΏΡΠΎΡΠ»Π΅Π΄ΡΠ²Π°Π½Π΅ ΠΈ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ°Π²Π°Π½Π΅ Π½Π° ΡΡΠ°ΡΠΈΠΊΠ°, Π±Π°Π»Π°Π½ΡΠΈΡΠΎΠ²ΠΊΠ° Π½Π° Π½Π°ΡΠΎΠ²Π°ΡΠ²Π°Π½Π΅ΡΠΎ, ΡΠ°Π±ΠΎΡΠ° Ρ ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π° Ρ Π΅Ρ-ΡΠ°Π±Π»ΠΈΡΠ° Ketama, ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ°Π½Π΅ Π½Π° ΠΊΠ΅Ρ Π² ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠ²Π½Π°ΡΠ° ΠΏΠ°ΠΌΠ΅Ρ ΠΈ Π°ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΠΎ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ²Π°Π½Π΅ Π½Π° ΡΠ°ΠΉΠΌΠ°ΡΡΠΈ.
Π‘ΡΠ΅Π΄ ΠΏΡΠΎΠΌΠ΅Π½ΠΈΡΠ΅ Π² Π½ΠΎΠ²Π°ΡΠ° Π²Π΅ΡΡΠΈΡ:
- Π ΡΡΡΡΠΊΡΡΡΠ°ΡΠ° SslDigest Π΅ Π΄ΠΎΠ±Π°Π²Π΅Π½ΠΎ ΠΏΠΎΠ»Π΅ βextensionβ, Π° Π·Π° ΡΠΈΠΏΠ°ΠΆΠ° TlsAccept Π΅ ΡΠ΅Π°Π»ΠΈΠ·ΠΈΡΠ°Π½ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ handshake_complete_callback, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π°Ρ ΠΏΡΠΈΠΊΡΠ΅ΠΏΡΠ½Π΅ Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»Π½ΠΈ Π΄Π°Π½Π½ΠΈ, ΡΠΏΠ΅ΡΠΈΡΠΈΡΠ½ΠΈ Π·Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ, ΠΊΡΠΌ TLS-ΡΡΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ΡΠΎ. ΠΠ°ΡΠΎ ΠΏΡΠΈΠΌΠ΅Ρ Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ ΠΊΠ°ΠΊ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ ΡΠ°Π·ΠΈ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π·Π° ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ ΡΡΡΠ²ΡΡ, ΠΊΠΎΠΉΡΠΎ ΠΏΡΠΎΡΠΈΡΠ° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎΡ ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠΈΡ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°Ρ ΠΈ Ρ Π²ΡΡΡΠ° Π² HTTP-ΠΎΡΠ³ΠΎΠ²ΠΎΡΠ°.
- ΠΠΎΠ±Π°Π²Π΅Π½ Π΅ ΡΠΈΠΏΠ°ΠΆ ConnectionFilter Π·Π° ΡΠΈΠ»ΡΡΠΈΡΠ°Π½Π΅ Π½Π° TCP-ΡΡΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ Π½Π° Π΅ΡΠ°ΠΏΠ° ΠΏΡΠ΅Π΄ΠΈ ΡΡΠ³Π»Π°ΡΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΡΠ΅ Π½Π° TLS, ΠΊΠΎΠ΅ΡΠΎ ΡΠΏΠ΅ΡΡΡΠ²Π° ΡΠ΅ΡΡΡΡΠΈ, ΠΊΠ°ΡΠΎ ΡΠ±ΡΠ°ΡΡΠ²Π° ΡΡΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡΡΠ° Π½Π° ΡΠ°Π½Π΅Π½ Π΅ΡΠ°ΠΏ.
- ΠΠΎΠ±Π°Π²Π΅Π½Π° Π΅ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ° Π½Π° Π²ΠΈΡΡΡΠ°Π»Π½ΠΈ ΠΏΠΎΡΠΎΡΠΈ Π½Π° ΡΡΠ°Π½ΡΠΏΠΎΡΡΠ½ΠΎ Π½ΠΈΠ²ΠΎ (Virtual L4 Streams), ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π°ΡΠΈ ΠΈΠ½ΡΠ΅Π³ΡΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° ΡΠΎΠ±ΡΡΠ²Π΅Π½ΠΈ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π½Π° ΠΌΡΠ΅ΠΆΠΎΠ²ΠΈ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»ΠΈ Π² pingora-proxy.
- Π Π΅Π°Π»ΠΈΠ·ΠΈΡΠ°Π½Π° Π΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΠ° Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΠΎΠΏΡΠΈΠΈ verify_cert ΠΈ verify_hostname Π² ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ Ρ rustls.
- ΠΠ° Π²ΡΠ½ΡΠ½ΠΈ crate-ΠΏΠ°ΠΊΠ΅ΡΠΈ Π΅ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ Π΄ΠΎΡΡΡΠΏ Π΄ΠΎ ΡΡΡΡΠΊΡΡΡΠ°ΡΠ° HttpProxy Π·Π° ΠΏΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π΅ Π½Π° Π»ΠΎΠ³ΠΈΠΊΠ°ΡΠ° Π½Π° ΠΏΡΠΎΠΊΡΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° Π·Π°ΡΠ²ΠΊΠΈ.
- Π Π°Π·ΡΠ΅ΡΠ΅Π½ΠΎ Π΅ ΠΈΠ·Π²Π΅ΠΆΠ΄Π°Π½Π΅ΡΠΎ Π½Π° ΡΠΎΠ½ΠΎΠ²ΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΡΠΈ Π½Π° ΠΏΠΎΠ΄Π·Π°ΡΠ²ΠΊΠΈ ΠΎΡ ΠΎΡΠ½ΠΎΠ²Π½ΠΈΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ Π½Π° ΡΠ΅ΡΠΈΡΡΠ°.
- ΠΡΠ΅Π΄ΠΎΡΡΠ°Π²Π΅Π½Π° Π΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π·Π° ΠΏΡΠΎΡΠ»Π΅Π΄ΡΠ²Π°Π½Π΅ Π½Π° ΡΠ°Π·ΠΌΠ΅ΡΠ° Π½Π° ΡΠ΅Π»Π°ΡΠ° Π½Π° HTTP1 ΠΈ HTTP2 Π·Π°ΡΠ²ΠΊΠΈ, ΠΊΠ°ΠΊΡΠΎ ΠΈ ΠΌΠ΅ΡΡΠΈΠΊΠΈ Π·Π° ΡΠ°Π±ΠΎΡΠ°ΡΠ° Π½Π° ΠΏΡΠΎΠΊΡΠΈΡΠΎ.
- ΠΠΎΠ±Π°Π²Π΅Π½Π° Π΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π·Π° ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° ΡΠΎΠ±ΡΡΠ²Π΅Π½ΠΈ ΡΠ΅ΡΠΈΠΈ Π·Π° ΠΈΠ½ΠΊΠ°ΠΏΡΡΠ»ΠΈΡΠ°Π½ HTTP-ΡΡΠ°ΡΠΈΠΊ.
- ΠΠΎΡΡΠ°Π²Π΅Π½ΠΈ ΡΠ° ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° Π²Π΅ΡΡΠΈΠΈ Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΡΠ° lru (0.16.3 ΠΈΠ»ΠΈ ΠΏΠΎ-Π½ΠΎΠ²ΠΈ) ΠΏΠΎΡΠ°Π΄ΠΈ ΡΡΠ·Π²ΠΈΠΌΠΎΡΡ Π² ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡΡΠ° Π½Π° ΠΈΡΠ΅ΡΠ°ΡΠΎΡΠ° IterMut, ΠΊΠΎΡΡΠΎ Π²ΠΎΠ΄ΠΈ Π΄ΠΎ Π°Π²Π°ΡΠΈΠΉΠ½ΠΎ Π·Π°Π²ΡΡΡΠ²Π°Π½Π΅ Π·Π°ΡΠ°Π΄ΠΈ ΠΏΡΠΎΠ²Π΅ΠΆΠ΄Π°ΡΠ°ΡΠ° ΡΠ΅ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° Π·Π°ΠΈΠΌΡΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈΡΠ΅ (borrow checker).
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: opennet.ru
