HAProxy (High Availability Proxy) is a powerful, open-source load balancer and reverse proxy. It sits between clients and your backend servers, distributing traffic, checking server health, optionally offloading TLS, and enabling flexible routing rules (layer 4 or layer 7). Because it’s lightweight, mature, and highly configurable, HAProxy is widely used in production environments.
On DigitalOcean, you can run HAProxy on a Droplet (a Linux VM) just as you would on any server. HAProxy will bind to your Droplet’s public IP, accept client requests, and proxy them to one or more backend servers (which might be on the same host or remote).
In a simple scenario, the traffic path is:
Client → DNS (your domain) → Droplet public IP → HAProxy → one or more backend servers- HAProxy listens on port 80/443 (HTTP/HTTPS)
- It routes (or load-balances) requests to your backend servers
- It can perform health checks to avoid sending traffic to failed nodes
- It can terminate TLS (so backends see unencrypted HTTP) or pass TLS through
Later, you can expand to more complex setups (e.g. multiple HAProxy nodes for HA, VRRP/keepalived, floating IP, etc.).
Step 1: Provision your DigitalOcean Droplet
- In your DigitalOcean dashboard, create a new Droplet. Use Ubuntu 22.04 LTS or Debian (versions with current package support).
- Choose a size appropriate for your expected load (e.g. 2 vCPU, 8 GB RAM is a reasonable start for moderate traffic).
- Add your SSH keys for secure access.
- Optionally enable private networking if you’ll have backend servers in the same data center.
- Once the Droplet is ready, take note of its public IP (and private IP if assigned).
SSH into the server:
ssh root@<droplet_ip>Step 2: Install HAProxy
On the Droplet:
apt update && apt upgrade -y
apt install -y haproxyEnable and start the HAProxy service:
systemctl enable haproxy
systemctl start haproxyYou can check the version:
haproxy -vStep 3: Basic HAProxy configuration
We’ll modify /etc/haproxy/haproxy.cfg. It has several sections; the key ones are global, defaults, frontend, and backend.
Here’s a minimal example for HTTP (no TLS) load balancing to two backend servers (using private IPs):
global
log /dev/log local0
maxconn 2048
daemon
defaults
log global
mode http
option httplog
option dontlognull
timeout connect 5s
timeout client 50s
timeout server 50s
frontend http_front
bind *:80
default_backend web_back
backend web_back
balance roundrobin
server web1 10.0.0.11:80 check
server web2 10.0.0.12:80 checkfrontend http_frontlistens on port 80 for all interfaces (*).default_backend web_backmeans all traffic goes to that backend.- In
backend web_back, two servers are defined withcheckso HAProxy will perform health checks. - The balancing method is
roundrobin(it cycles between servers).
After editing, test the configuration:
haproxy -c -f /etc/haproxy/haproxy.cfgIf it’s valid, reload HAProxy:
systemctl reload haproxyNow requests to your Droplet’s public IP should be routed to one of the backend servers.
Step 4: Add HTTPS / TLS termination
You’ll usually want to secure traffic with TLS. HAProxy can handle SSL termination so that backends receive plain HTTP.
Generate or obtain certificates
You can use Let’s Encrypt to issue a certificate for your domain (e.g. dropletdrift.com). Suppose you have the fullchain.pem and privkey.pem.
Concatenate them into a single PEM file:
cat fullchain.pem privkey.pem > /etc/haproxy/certs/dropletdrift.com.pem
chmod 600 /etc/haproxy/certs/dropletdrift.com.pemUpdate HAProxy configuration for TLS
Modify (or supplement) the frontend section:
frontend https_front
bind *:443 ssl crt /etc/haproxy/certs/dropletdrift.com.pem
default_backend web_back
frontend http_redirect
bind *:80
redirect scheme https code 301 if !{ ssl_fc }https_frontlistens on port 443 with SSL using your certificate.http_redirectlistens on 80 and redirects all traffic to HTTPS.ssl_fcis an HAProxy predicate meaning “client connected over SSL”.
You retain the same backend section.
Reload HAProxy again after changes.
At this point, clients requesting https://dropletdrift.com should see the secured site, and HAProxy handles decryption.
Step 5: Health checks & failure handling
The check keyword in server lines activates active health checks (TCP-level by default). If HAProxy cannot connect, it marks the server down and stops forwarding traffic there.
You can customize health checks. For example:
backend web_back
balance roundrobin
server web1 10.0.0.11:80 check inter 5s rise 2 fall 3
server web2 10.0.0.12:80 check inter 5s rise 2 fall 3inter 5smeans check every 5 secondsrise 2means two consecutive successes to mark upfall 3means three failures to mark down
You can also use HTTP checks (e.g. check a particular path, response code). For instance:
backend web_back
option httpchk GET /health
server web1 10.0.0.11:80 check
server web2 10.0.0.12:80 checkHere HAProxy sends GET /health to see if the backend is responsive and returns a valid HTTP status.
Step 6: DNS & domain pointing
Configure your DNS (at your registrar or DNS host) to point your domain (or subdomain) to the HAProxy Droplet’s public IP using an A record:
dropletdrift.com → 203.0.113.10
www.dropletdrift.com → 203.0.113.10Allow time for propagation, then test in a browser.
Step 7: Logging, metrics & monitoring
- Ensure HAProxy logs are enabled. Usually, HAProxy logs via
rsyslogorsyslogand outputs to/var/log/haproxy.logor/var/log/syslog. - You can enable the
statsinterface (a web UI) by adding a section like:
listen stats
bind *:8404
mode http
stats enable
stats uri /stats
stats auth admin:YourStrongPassThen you can visit http://your-droplet-ip:8404/stats to see live metrics.
- Monitor CPU, memory, connections, dropped requests. Tools like Prometheus + HAProxy exporter + Grafana are often used in production.
Step 8: Scaling and High Availability (HA) considerations
Once this basic setup works, you may want redundancy — a single HAProxy server is itself a point of failure. Common strategies include:
- Floating / Reserved IP: Assign a reserved IP in DigitalOcean and move it between HAProxy nodes on failure.
- Keepalived / VRRP: Use
keepalivedalongside HAProxy to manage failover of virtual IPs between two HAProxy servers. (This is covered in DigitalOcean’s HA proxy HA guide) - Health-based failover scripts: Automate reassignment of IPs when health checks fail.
- Multiple HAProxy nodes behind DNS failover: Using low-DNS TTL and health-aware DNS.
- Use DigitalOcean’s Managed Load Balancer product: If you prefer a managed, fault-tolerant solution rather than DIY HA.
Summary & next steps
You now have:
- A DigitalOcean Droplet running HAProxy
- A working HAProxy configuration routing traffic to backend servers
- TLS termination for HTTPS
- Basic health checks
- Logging and metrics interface
From here you can:
- Add more backend nodes to scale
- Harden security (firewall, restrict backend access)
- Automate certificate renewal (e.g. with Certbot + scripts)
- Implement HA (Keepalived, reserved IP)
- Integrate with orchestration (Docker, Kubernetes, etc.)