Product

Product Features How to Compare Docs Screenshots Why

Start here

Getting started Download Guides Frequently asked questions

More

Security Support Roadmap About
Free and open source MIT licensed Ubuntu 22.04 and newer

Run your nginx boxes as one load balancer.

Failover LB puts a web page in front of nginx. Sites, backend pools with real health checks, certificates that renew themselves across a cluster, a firewall for your applications, and failover that works even when a whole server is gone. It costs nothing and it is yours to keep.

$0per node, per year, forever
2servers is the whole shopping list
7.5Mrequests served in a one hour test
82nginx modules compiled in
root@lb-01: ~
Install, start to finish 0:00 / 0:00

Replay of a real install run on a clean Ubuntu 26.04 machine. Press play to watch it again.

The problem

Two nginx servers is not a pair of load balancers

It is two servers that happen to run the same software and will slowly stop agreeing with each other. The gap between those two things is what this software fills.

Config drift

Somebody fixes one box at two in the morning and forgets the other. Six weeks later a failover puts traffic on a server with last quarter's rules on it.

A dead backend nobody noticed

Free nginx only finds out a backend is broken after a real visitor already got the error. Somebody always has to be first, and that somebody is a customer.

Certificates that quietly stop renewing

In a cluster, only the node that currently owns the public address can answer the challenge. Which node that is changes, and the usual setup never notices.

A typo that takes the fleet down

One bad directive pushed to both servers and nginx refuses to start on both. The rollback is a person with a terminal and a bad feeling.

The commercial answer costs real money

NGINX Plus is about $1,500 a node a year, and its firewall is roughly $2,000 more. Appliances start higher. Plenty of people simply do not have that.

Failover that only moves what arrives

If a whole server is gone, nothing reaches it, so nothing it might have done matters. Only the DNS lookup can send people somewhere else.

What it does

Every change is checked on every node before any node uses it

You press one button. The whole configuration is built from the database, staged on each server, and tested with the real nginx binary on each one. Only when every server agrees does any server reload.

If one node says no, both staged copies are thrown away and nothing goes live. A configuration that would stop nginx starting cannot get halfway across your fleet. A server that was switched off during the change gets it queued and replayed when it comes back, so it catches up instead of drifting.

apply log
A good apply, then a bad one 0:00 / 0:00

A walk through of what the apply prints, including the case where one node refuses.

Watch it work

From an empty screen to a live site

A guided walkthrough of the real screens, in the order you would actually use them. Press play, or step through it yourself.

https://lb-01.example.net/lb
Step 1

Putting a site live 0:00 / 0:00

Built from screenshots of a live node. Use the arrows, or the left and right keys, to move at your own pace.

The short list

What you get on day one

There are more than forty feature pages on this site. These are the ones people install it for.

Real health checks

Every node probes every backend on a schedule and rewrites the upstream with the bad one marked down. This is the headline feature of the paid nginx, done from out here.

Read more

Certificates that work in a cluster

The fleet works out which node can answer the challenge at every renewal, pushes the token everywhere first, and copies the result to every node.

Read more

A real web application firewall

ModSecurity with the OWASP Core Rule Set, per site, starting in watching mode. Learn from real testing, keep the few exceptions you need, then block.

Read more

Post quantum key exchange

Built against OpenSSL 3.5.7, so X25519MLKEM768 is offered first with the classic curves behind it. Traffic captured today stays private later.

Read more

DNS failover between sites

Your nodes answer DNS for a zone you delegate to them, and leave out any node that is not healthy. This is the part that survives a whole building going dark.

Read more

Reach backends with no public address

One command on the machine and it dials out to every load balancer over WireGuard. No firewall change, no public address, no ticket to anybody.

Read more

No central controller

Every node holds the entire configuration and syncs with its peers. There is nothing extra to install and nothing whose loss stops you managing the rest.

Read more

Import the nginx you already run

Paste in your current config and see exactly what it would become. Nothing is written until you say so, and nothing is dropped without telling you.

Read more

One file rebuilds the fleet

An encrypted archive with every site, pool, zone, setting, account and certificate in it. Enough to stand the whole thing up on new servers.

Read more

How it fits together

One container per nginx server, and nothing in the middle

The manager has to live on the same machine as the nginx it drives, because it talks to a small root agent over a socket on that box. Your application servers never learn that any of this exists.

Your browser TCP 7443 nginx server 1 · active Manager container uid 10001, no privileges, read only unix socket Host agent root, fixed verb list, path allow list writes and reloads nginx, built from source serves TCP 80 and 443, plus UDP 443 for HTTP/3 nginx server 2 · standby Manager container same image, same config unix socket Host agent root, fixed verb list, path allow list writes and reloads nginx, built from source serves TCP 80 and 443, plus UDP 443 for HTTP/3 mTLS + HMAC TCP 7444 Your application servers · nothing installed here app-01 10.0.0.11:8080 app-02 10.0.0.12:8080 app-03 10.0.0.13:8080 They never know the manager exists. They just answer requests.
live traffic and signed peer messages standby and background work
One manager container per nginx server, sitting above a small root agent. There is no central controller to install and nothing extra to lose when a box dies.

Certificates

The fiddly part, handled properly

Getting a free certificate on one server is easy. Getting one on a cluster where the public address moves is where most setups quietly break two months later.

  • Which node can answer is worked out fresh at every renewal, against public DNS.
  • The challenge token goes to every node before validation starts, because the certificate authority chooses which one it connects to.
  • The issued certificate and key are copied to every node, with the key kept at 0600 and owned by root.
  • The certbot timer is switched off on purpose, so you do not get a mailbox of failures from the nodes that could never have answered.
  • Paid authorities that speak ACME work the same way, including the account credentials your supplier gives you.
renewal log
A renewal, start to finish 0:00 / 0:00

What a renewal prints when nobody is watching, which is most of the time.

An honest comparison

We score ourselves second out of four

The comparison page in the product rates 39 capabilities against NGINX Plus, Kemp LoadMaster and HAProxy ALOHA. Eighteen of those rows go against us, and each one says why. That is the same table, published here.

#1

140

HAProxy ALOHA
out of 195 stars

#2

138

Failover LB
this project, and it is free

#3

130

NGINX Plus
about $1,500 a node a year

#4

128

Kemp LoadMaster
from about $2,500 once

Adding up stars is the crudest reading of a table like that. It says a request queue and a support contract weigh the same, and they do not. The row we lose worst is the first one: there is nobody to ring at three in the morning. That is the real price.

Why this exists

It was built for a non profit, and then given away

I run hackrange.com, a non profit. Its web infrastructure had grown into something that needed a proper load balancer: one place to terminate TLS, certificates that renew without anybody remembering, a firewall in front of the applications, and a second server that could take over.

The commercial products all do this. They also cost more per year than the whole project spends on hosting. So I built the thing I needed, on free nginx, and made it configurable from a web page so it did not need me to run it.

It is free because plenty of other people are in the same position. A charity, a school, a small team, a hobby project that got popular. None of them should have to choose between a load balancer they can manage and a load balancer they can afford.

What the non profit actually needed

Centralize
One place that owns every public hostname, instead of rules spread across a dozen boxes.
Offload TLS
Terminate at the edge, with certificates that renew on their own and land on every node.
Protect
A WAF in front of applications that were never written with the public internet in mind.
Modern crypto
Post quantum key exchange, because traffic captured today gets decrypted later.
Survive a failure
A second server that takes over on its own, including when the first one is gone entirely.
Cost nothing
No license, no per node fee, no renewal that has to be argued for every year.

Measured, not estimated

An hour of continuous traffic against a real two node fleet

Real site, real backends, real certificates. These are the numbers that came out, not the numbers anybody hoped for.

7,541,340requests in one hour
2,095/ssustained rate
204.88 GBtransferred
0timeouts
0failed connections
8%of 16 cores at peak

The honest caveat

The test could not find the limit. Throughput stopped rising at about 3,000 requests a second, and at that moment the load balancers were using roughly 6% of their processors. What ran out was bandwidth on the machine generating the load, not anything belonging to the fleet. So the real capacity is higher than these numbers, possibly a lot higher, and we do not know by how much.

Getting started

Two commands on a fresh server

You need one or two servers running Ubuntu 22.04 or newer, with internet access and root. That is the entire shopping list. The installer is safe to run again if something goes wrong.

1. Install the manager

sudo git clone https://git.failoverlb.net/failoverlb.git /data/docker/failoverlb \
  && sudo /data/docker/failoverlb/failoverlb_setup.sh

2. Build nginx

sudo /data/docker/failoverlb/nginx-installer.sh install

The second one takes the longest, because it compiles nginx 1.30.4 from source against OpenSSL 3.5.7 with every module the GUI knows how to configure. Then open the address the installer printed and sign in.

root@lb-02: ~
Adding a second server 0:00 / 0:00

The second server joins the first with a token that works once and expires in two hours.

It is free, and it is meant to be used

No license key, no per node fee, no sales call. Clone it, run the installer, and see whether it does what you need. If it does not, nothing has been spent.