# Companion Products and Alternatives

> How HAProxy relates to Apache, NGINX, Varnish, LVS, Envoy, and other load balancers

---

LLMS index: [llms.txt](/llms.txt)

---

<!-- Generated by scripts/generate-haproxy-docs.py from pinned upstream text. -->

HAProxy integrates fairly well with certain products listed below, which is why they are mentioned
here even if not directly related to HAProxy.

## 4.1. Apache HTTP server {#section-4-1}

Apache is the de-facto standard HTTP server. It's a very complete and modular project supporting
both file serving and dynamic contents. It can serve as a frontend for some application servers. It
can even proxy requests and cache responses. In all of these use cases, a front load balancer is
commonly needed. Apache can work in various modes, some being heavier than others. Certain modules
still require the heavier pre-forked model and will prevent Apache from scaling well with a high
number of connections. In this case HAProxy can provide a tremendous help by enforcing the
per-server connection limits to a safe value and will significantly speed up the server and preserve
its resources that will be better used by the application.

Apache can extract the client's address from the X-Forwarded-For header by using the "mod_rpaf"
extension. HAProxy will automatically feed this header when "option forwardfor" is specified in its
configuration. HAProxy may also offer a nice protection to Apache when exposed to the internet,
where it will better resist a wide number of types of DoS attacks.

## 4.2. NGINX {#section-4-2}

NGINX is the second de-facto standard HTTP server. Just like Apache, it covers a wide range of
features. NGINX is built on a similar model as HAProxy so it has no problem dealing with tens of
thousands of concurrent connections. When used as a gateway to some applications (e.g. using the
included PHP FPM) it can often be beneficial to set up some frontend connection limiting to reduce
the load on the PHP application. HAProxy will clearly be useful there both as a regular load
balancer and as the traffic regulator to speed up PHP by decongesting it. Also since both products
use very little CPU thanks to their event-driven architecture, it's often easy to install both of
them on the same system. NGINX implements HAProxy's PROXY protocol, thus it is easy for HAProxy to
pass the client's connection information to NGINX so that the application gets all the relevant
information. Some benchmarks have also shown that for large static file serving, implementing
consistent hash on HAProxy in front of NGINX can be beneficial by optimizing the OS' cache hit
ratio, which is basically multiplied by the number of server nodes.

## 4.3. Varnish {#section-4-3}

Varnish is a smart caching reverse-proxy, probably best described as a web application accelerator.
Varnish doesn't implement SSL/TLS and wants to dedicate all of its CPU cycles to what it does best.
Varnish also implements HAProxy's PROXY protocol so that HAProxy can very easily be deployed in
front of Varnish as an SSL offloader as well as a load balancer and pass it all relevant client
information. Also, Varnish naturally supports decompression from the cache when a server has
provided a compressed object, but doesn't compress however. HAProxy can then be used to compress
outgoing data when backend servers do not implement compression, though it's rarely a good idea to
compress on the load balancer unless the traffic is low.

When building large caching farms across multiple nodes, HAProxy can make use of consistent URL
hashing to intelligently distribute the load to the caching nodes and avoid cache duplication,
resulting in a total cache size which is the sum of all caching nodes. In addition, caching of very
small dumb objects for a short duration on HAProxy can sometimes save network round trips and reduce
the CPU load on both the HAProxy and the Varnish nodes. This is only possible is no processing is
done on these objects on Varnish (this is often referred to as the notion of "favicon cache", by
which a sizeable percentage of useless downstream requests can sometimes be avoided). However do not
enable HAProxy caching for a long time (more than a few seconds) in front of any other cache, that
would significantly complicate troubleshooting without providing really significant savings.

## 4.4. Alternatives {#section-4-4}

Linux Virtual Server (LVS or IPVS) is the layer 4 load balancer included within the Linux kernel. It
works at the packet level and handles TCP and UDP. In most cases it's more a complement than an
alternative since it doesn't have layer 7 knowledge at all.

Pound is another well-known load balancer. It's much simpler and has much less features than HAProxy
but for many very basic setups both can be used. Its author has always focused on code auditability
first and wants to maintain the set of features low. Its thread-based architecture scales less well
with high connection counts, but it's a good product.

Pen is a quite light load balancer. It supports SSL, maintains persistence using a fixed-size table
of its clients' IP addresses. It supports a packet-oriented mode allowing it to support direct
server return and UDP to some extents. It is meant for small loads (the persistence table only has
2048 entries).

NGINX can do some load balancing to some extents, though it's clearly not its primary function.
Production traffic is used to detect server failures, the load balancing algorithms are more
limited, and the stickiness is very limited. But it can make sense in some simple deployment
scenarios where it is already present. The good thing is that since it integrates very well with
HAProxy, there's nothing wrong with adding HAProxy later when its limits have been reached.

Varnish also does some load balancing of its backend servers and does support real health checks. It
doesn't implement stickiness however, so just like with NGINX, as long as stickiness is not needed
that can be enough to start with. And similarly, since HAProxy and Varnish integrate so well
together, it's easy to add it later into the mix to complement the feature set.
