Pingora 0.9.0 is a framework, not a proxy binary
Pingora 0.9.0 gives Rust developers the pieces for an HTTP proxy or load balancer, but it does not give operators a finished NGINX-style service. The quick start creates a Rust project, implements the ProxyHttp trait, chooses upstreams, adds a listener, and compiles an application. That is the attraction and the cost. Routing decisions live in normal code, while your team owns that code every time traffic behavior or a dependency changes.
Cloudflare says Pingora has served more than 40 million internet requests per second in its own infrastructure for several years. That production lineage matters, but it is not a benchmark of the server you will write. Your filters, TLS provider, cache policy, upstreams, and runtime settings can change the result. Adopt it for control over proxy behavior, not because a famous deployment transfers its performance to your binary.
HTTP/1 and HTTP/2 requests pass through programmable filters
HTTP/1 and HTTP/2 proxying sits behind callbacks for early checks, upstream selection, request rewriting, response handling, errors, and logging. Each request can carry a custom context object through those phases. The framework also has load-balancing selectors, health checks, connection pooling, failover hooks, gRPC and WebSocket proxying, several TLS backends, and graceful process upgrades. This is enough to express policy that would be awkward in a conventional proxy configuration.
Code-level policy brings code-level mistakes. Pingora lets a failure callback mark work retryable, but its guide warns against retrying a non-idempotent request after data may have reached the upstream. Response filters also run on different sides of cache processing, so choosing the wrong hook can change what gets stored or sent. The API gives you precise placement. It cannot decide whether your retry, mutation, or log-suppression rule is safe.
What happened when we ran it
Our sandbox installed 342 packages in 18 seconds at commit 4487f7b. The build succeeded in 407 seconds. cargo test then ran for 369 seconds and exited with code 101: 2,248 tests passed and 36 failed out of 2,284. The repository had 402 files, roughly 112,425 source lines, and an 11.1 MB checkout. We also found 5 CI workflow files and a Dockerfile.
The final log lines show many crates finishing cleanly, then pingora-proxy --test test_basic ending with 4 passed and 18 failed. They do not name the failed cases or explain the other 18 failures, so the lab result cannot support a cause. Open issue 999 separately documents connector tests that reach the real 1.1.1.1, making part of the suite dependent on public egress. That issue may be relevant to isolated builders, but it does not prove why our full run failed.
Caching remains experimental in version 0.9.0
Pingora's README calls proxy-cache integration experimental and says its APIs are highly volatile. The workspace includes memory-cache, cache-lock, and eviction pieces, while the 0.9.0 release added admission hooks, freshness updates, dictionary compression, and stale-serving controls. Those are substantial ingredients. The warning still means a team should budget for API changes and correctness tests before making caching part of its delivery path.
Open issue 1013 is a concrete reason to test encoded responses. The report says Pingora 0.9.0 flushes Brotli output without finishing the stream, which lenient browsers accept but strict Node decoders reject. We did not reproduce that report in our lab, and the issue was still open when checked. A service using response compression should test every enabled encoding against its actual clients instead of treating successful browser playback as enough.
Linux is tier 1, while HTTP/3 is still requested
Rust 1.85 is the documented workspace minimum, though the 0.9.0 notes say pingora-foundations declares 1.88. BoringSSL builds need Clang and OpenSSL builds need Perl 5. Linux is the main platform. The project tries to compile on Unix-like systems such as macOS, with possible missing features, and describes Windows as preliminary community work. That support matrix is narrower than Rust's general platform reach.
Protocol scope has a similar boundary. The README promises end-to-end HTTP/1 and HTTP/2, gRPC, and WebSocket proxying. Issue 95 asks for HTTP/3 and QUIC integration and remains open. If QUIC is on your launch checklist, do not turn that request into an implied roadmap. Put another edge in front, choose an alternative, or wait for shipped code and documentation.
September activity supports the core, not every extension
Release 0.9.0 was published on September 9, 2026, and the repository was pushed on September 11. GitHub listed 27,489 stars and 285 combined issues and pull requests when fetched. New September work covered parsing limits, tunnel behavior, connection-pool races, shutdown, documentation, and the Brotli report. That mix shows active maintenance around the difficult parts of a proxy, while the combined count should not be mistaken for 285 bugs.
Pingora makes sense when your proxy is an application and your team is ready to treat it like one. The 407-second build and 36 failed tests raise the admission price for casual evaluation, while the filter model rewards engineers who truly need custom behavior. If a configuration file can express your routing and health checks, HAProxy or Envoy leaves less bespoke network code for your team to defend at 3 a.m.

