BackendApr 20263 min read

Envoy vs Nginx — Proxy Wars: Modern Microservices vs Battle-Tested Simplicity

Envoy wins for cloud-native complexity, Nginx for straightforward web serving. Pick based on whether you're building a distributed system or just need a reliable reverse proxy.

🧊Nice Pick

Envoy

Envoy's dynamic configuration and deep observability make it the clear choice for microservices. Nginx's static configs can't keep up with modern service mesh demands.

Different Philosophies, Different Eras

Envoy and Nginx are both proxies, but they're built for different worlds. Nginx emerged in the 2000s as a high-performance web server and reverse proxy, designed to handle HTTP traffic with minimal fuss. It's the reliable workhorse that powers half the internet. Envoy, born at Lyft in 2016, is a cloud-native proxy built from the ground up for microservices. It assumes your infrastructure is dynamic, with services constantly scaling and moving. While Nginx asks 'what traffic do I route?', Envoy asks 'what services are alive right now?'

Where Envoy Wins

Envoy dominates in three areas Nginx can't touch. First, dynamic configuration via APIs (like xDS) means you can update routing rules without restarting—critical when pods are spinning up every minute. Second, deep observability with built-in stats, tracing, and access logs that integrate directly with Prometheus and Jaeger. Third, advanced load balancing that understands health checks, circuit breaking, and outlier detection at the protocol level. Envoy doesn't just pass traffic; it understands your service mesh. The fact that Istio uses Envoy as its data plane isn't an accident—it's the only proxy that can handle that complexity.

Where Nginx Holds Its Own

Nginx still crushes Envoy in two important scenarios. For simple web serving, nothing beats Nginx's performance and simplicity. Its event-driven architecture handles thousands of concurrent connections with minimal memory, and its static configuration files are human-readable and predictable. Nginx also has a massive ecosystem: modules for everything from image resizing to Lua scripting, and support that goes back decades. If you're running a monolith or a few services behind a load balancer, Nginx is faster to set up and easier to debug. Plus, it's battle-tested at scale—Netflix and WordPress.com aren't switching anytime soon.

The Gotcha: Configuration Complexity

Envoy's power comes with a steep learning curve. While Nginx uses a simple text-based config (nginx.conf) that any sysadmin can understand, Envoy requires YAML or JSON configurations that can run hundreds of lines. Setting up dynamic discovery means integrating with control planes like Istio or Consul—another layer of complexity. Nginx, by contrast, is a single binary with a config file. The hidden friction? Envoy assumes you have a Kubernetes cluster and a DevOps team. Nginx assumes you have SSH access to a server. If you're not ready for the cloud-native toolchain, Envoy will feel like overkill.

If You're Starting Today...

Choose Envoy if you're building microservices on Kubernetes and need service mesh features. The integration with Istio or Linkerd gives you traffic management, security, and observability out of the box. Choose Nginx if you're serving static websites, APIs, or a monolith—it's faster to deploy and easier to manage. For a concrete scenario: if you're migrating a legacy app to the cloud, start with Nginx. If you're greenfielding a distributed system, go Envoy. And remember: both are open-source and free, so you can prototype with either.

What Most Comparisons Get Wrong

Most reviews treat these as direct competitors—they're not. The real question isn't 'which is better?' but 'what problem are you solving?' Envoy excels at east-west traffic (service-to-service) in a dynamic environment. Nginx excels at north-south traffic (client-to-server) with stable backends. Comparing their HTTP/2 performance misses the point: Envoy's value is in protocol translation (gRPC to HTTP/1.1) and fine-grained routing, while Nginx's is in raw throughput. Pick based on your architecture, not benchmark scores.

Quick Comparison

FactorEnvoyNginx
ConfigurationDynamic via xDS APIs, YAML/JSON, requires control planeStatic text files (nginx.conf), reload on change
Load BalancingAdvanced: round-robin, least request, ring hash, health checksBasic: round-robin, least connections, IP hash
ObservabilityBuilt-in stats, tracing, access logs, Prometheus integrationAccess logs, basic metrics, requires third-party tools
PerformanceHigh, optimized for microservices latencyVery high, optimized for web serving throughput
EcosystemCloud-native: Istio, Consul, KubernetesWeb-focused: modules for caching, scripting, security
Learning CurveSteep, requires understanding of service meshGentle, documented for decades
Use CaseMicroservices, service mesh, dynamic environmentsWeb serving, reverse proxy, static backends
LicenseApache 2.0, open-sourceBSD-like, open-source (plus commercial Nginx Plus)

The Verdict

Use Envoy if: You're running Kubernetes with microservices and need dynamic traffic management—Envoy's the only proxy that won't hold you back.

Use Nginx if: You're serving web traffic to stable backends or need a simple reverse proxy—Nginx is faster, simpler, and proven.

Consider: HAProxy if you need extreme performance for TCP load balancing without the cloud-native complexity.

🧊
The Bottom Line
Envoy wins

Envoy's dynamic configuration and deep observability make it the clear choice for microservices. Nginx's static configs can't keep up with modern service mesh demands.

Related Comparisons

Disagree? nice@nicepick.dev