mrkeyoor.com_
Sun 20 Sept 17:47 UTC
Dev Toolsevaluationupdated 20 Sept 2026

pingora review

Pingora is a Rust framework for building HTTP proxies, load balancers, and other network services. It supplies connection pooling, TLS choices, request filters, graceful upgrades, and load-balancing pieces, while your team writes the policy and ships the resulting server.

Verdict

Our Pingora checkout built in 407 seconds, but 36 of 2,284 tests failed, so a successful compile is not a sufficient release gate. Use Pingora when custom proxy behavior justifies owning a Rust network service and Linux is your main target. Choose a finished proxy when your needs fit configuration, or wait if stable caching, HTTP/3, or a clean isolated test run is mandatory.

We ran it

Lab card: what happened when we ran pingoraScreenshot of pingora (github.com/cloudflare/pingora)
Install✓ · 18s342 packages
Build✓ · 407s
Tests✗ · 369s2248 passed · 36 failed of 2284 (cargo test)
Repo402 files~112,425 lines of source · 11.1 MB · 5 CI workflows · Dockerfile

Answers from our run

Does pingora build from source?

Dependencies installed in 18 seconds (342 packages), and the build succeeded in 407 seconds. We cloned commit 4487f7b into a clean Debian container with 3 CPUs and no project-specific setup.

Do pingora's tests pass?

Not all of them: 2248 of 2284 passed and 36 failed when we ran the project's own test command (cargo test). Some failures need services or credentials a bare container does not have.

Who should not use pingora?

Teams looking for a ready-made reverse proxy configured with a few files: Pingora is a framework, so you write and maintain the service.

What are the alternatives to pingora?

Envoy, HAProxy, hyper. Our Pingora checkout built in 407 seconds, but 36 of 2,284 tests failed, so a successful compile is not a sufficient release gate.

Setup2/5407-second build passed; 36 of 2,284 tests failed
Docs4/5Clear quick start and lifecycle guides; cache docs remain thin
Community5/527,489 stars with active September issues and pull requests
Maturity4/5Cloudflare-proven core, but caching and some APIs still move

Who it’s for

Rust teams building a proxy whose routing, retries, or request handling cannot be expressed in a normal configuration file.
Infrastructure groups prepared to own a custom network service in production.
Linux operators who need programmable HTTP/1 and HTTP/2 proxying with graceful upgrades.
Developers who value Cloudflare's production lineage but will validate their own workload and failure modes.

Who it’s NOT for

Teams looking for a ready-made reverse proxy configured with a few files: Pingora is a framework, so you write and maintain the service.
Products that require HTTP/3 or QUIC today: the README documents HTTP/1 and HTTP/2, while issue 95 remains an open request for HTTP/3 support.
Windows deployments that need first-party parity: Linux is tier 1 and the README calls Windows support preliminary and community-led.
Operators who need stable caching interfaces: the README labels proxy caching experimental and its APIs highly volatile.
Air-gapped builders expecting a hermetic suite: issue 999 documents connector tests that contact the public 1.1.1.1, although our log tail does not prove that caused our failures.
Services enabling Brotli without their own client checks: open issue 1013 reports incomplete streams from Pingora 0.9.0 that strict decoders reject.

Setup reality

At commit 4487f7b, our sandbox installed 342 packages in 18 seconds and built the workspace in 407 seconds. Tests failed after 369 seconds: 2,248 passed and 36 failed out of 2,284. The checkout had 402 files, about 112,425 source lines, and occupied 11.1 MB.

Building selected crates can require Clang for BoringSSL and Perl 5 for OpenSSL. A real service also needs Rust proxy code, listener and upstream configuration, certificates for TLS, logging, and a deployment supervisor. Pingora itself does not require a hosted account or API key.

Linux is the tier 1 target; macOS may miss features and Windows support is preliminary. The log tail shows 18 failures in pingora-proxy --test test_basic but not their causes. The repository has a Dockerfile and 5 CI workflow files, yet a fresh checkout did not clear our full suite.

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.

Alternatives

ProjectWhat it isPick it when
Envoy gh↗A deployable edge and service proxy with a large configuration and extension surface.pick this instead when you want a finished proxy controlled through configuration and APIs rather than a Rust framework.
HAProxyA mature load balancer and reverse proxy operated mainly through configuration.pick this instead when standard routing, health checks, and load balancing cover the job without custom Rust code.
hyperA lower-level Rust HTTP library for clients and servers.pick this instead when you need HTTP building blocks and want to design more of the server architecture yourself.

What people are saying

  1. [github-trending] cloudflare/pingora
  2. [hackernews] We could save petabytes of cache storage with Zstandard and Pingora

Sources

  1. Pingora README
  2. Pingora quick start
  3. Pingora proxy phase guide
  4. Pingora 0.9.0 release
  5. Issue 999: connector tests use public egress
  6. Issue 1013: incomplete Brotli streams
  7. Issue 95: HTTP/3 and QUIC request

More dev tools reviews

neomacs · smolvm · wx-cli · modern-software-dev-assignments · skills · Apktool · the whole board →