Three terms that get mixed up constantly. The actual differences, where each one sits in the request path, when you reach for which, and where the same tool plays all three roles.
These three terms get mixed up constantly — partly because the same software (Nginx, HAProxy, Envoy) plays all three roles depending on how you configure it. The differences are real and worth knowing because they map to different decisions you make when designing a system.
This post is a practical breakdown: what each does, where each sits in the request path, what they're each good and bad at, and the cases where the distinction stops mattering because one tool is doing all three at once.
The first two are about who knows about whom. The third is about how many backends share the work.
A forward proxy is something a client deliberately routes its traffic through. The client says "send my request to the proxy, and have the proxy forward it." The proxy talks to the destination on the client's behalf; the destination sees the proxy's IP, not the client's.
Why anyone runs one:
Common implementations: Squid (the classic), corporate solutions like Zscaler, internal HTTP proxies built on Nginx in proxy mode.
Advantages:
HTTPS_PROXY=...).Disadvantages:
You usually don't need to think about forward proxies unless you're working in an enterprise environment that has one, or you're building a system that does a lot of outbound calls and wants to cache or audit them.
A reverse proxy sits in front of your servers. From the outside, the reverse proxy is the server — browsers connect to it, give it their requests, and receive responses. Behind the scenes, the proxy forwards the request to one of your backend servers and returns the response.
Why everyone runs one:
Common implementations: Nginx, HAProxy, Envoy, Caddy, Traefik. Cloud-managed versions: AWS ALB, CloudFront, Cloudflare.
Advantages:
Disadvantages:
If you're running anything on the public internet, you're almost certainly using a reverse proxy whether you realize it or not. CloudFront in front of a Vercel app? Reverse proxy. Nginx in front of your Node app? Reverse proxy.
A load balancer distributes incoming traffic across multiple backend servers. The "balance" part: it tries to give each backend a fair share of work.
Two flavors:
Why you run one:
Common implementations: cloud LBs (AWS ALB/NLB, GCP Load Balancer), self-hosted (HAProxy, Nginx, Envoy), Kubernetes Services (which are an L4 LB internally).
Advantages:
Disadvantages:
This is where the terminology gets confusing: a reverse proxy that has multiple backends configured is also a load balancer. The same Nginx config block can do both:
upstream app_backends {
server app1.internal:3000;
server app2.internal:3000;
server app3.internal:3000;
}
server {
listen 443 ssl;
server_name www.example.com;
location / {
proxy_pass http://app_backends;
}
}
That's a reverse proxy (terminating TLS, forwarding to backends) AND a load balancer (distributing across three backends). Same tool, same config, two roles.
In practice, the distinction matters most when:
| Aspect | Forward Proxy | Reverse Proxy | Load Balancer |
|---|---|---|---|
| Who knows about it | Client | Destination thinks it's the server | Either, depends on tier |
| Sits between | Client and internet | Internet and your servers | Traffic source and N backends |
| Hides | Client identity | Server topology | Single-backend dependency |
| Primary use | Egress control, caching, anonymity | TLS termination, security, routing | Distributing load, HA |
| Where in stack | Client-side network edge | Server-side network edge | Anywhere there are N replicas |
| Example | Squid, Zscaler | Nginx, ALB, CloudFront | HAProxy, NLB, ALB |
A rough decision flow:
For most production teams, the answer is: deploy a cloud-managed L7 load balancer (ALB on AWS, similar elsewhere) which acts as both the reverse proxy AND the load balancer. The forward proxy use case is separate and usually only matters in enterprise contexts.
A few patterns that trip people up:
Once these three terms stop blurring together, a lot of system designs read more clearly. The same tools play different roles in different positions — Nginx in front of a single backend is a reverse proxy; the same Nginx with multiple backends configured is a load balancer; an Nginx config that clients explicitly route through is a forward proxy. The job, not the binary, is what determines which name applies.
Get the latest tutorials, guides, and insights on AI, DevOps, Cloud, and Infrastructure delivered directly to your inbox.
Explore more articles in this category
Helm gives you a lot of rope. The patterns we used that backfired, the ones we replaced them with, and what to skip if you're starting today.
We run three different job queue systems across our services. The patterns that work across all of them, the differences that matter, and the operational gotchas.
We adopted Backstage for service catalogs and templates. What works, what was over-engineered for our size, and what we'd do differently.