Files

2.0 KiB

LFCS 2.8: Reverse proxies and load balancers

nginx as a reverse proxy and load balancer, sticky balancing, HAProxy with health checks, and passing on the client's address.

Before you start

The lab runs three back ends on this VM, on 127.0.0.1:8081, 8082 and 8083 (units le-backend@8081 and so on). Each answers with a page that names it, such as Back end 8081, and logs the X-Forwarded-For header it receives (journalctl -u le-backend@8081). nginx and HAProxy aren't installed.

The peer, at 10.99.0.2, is the other VM: test from there with sudo ip netns exec lepeer curl http://10.99.0.1/.

Tasks

  1. Put nginx on port 80 in front of the back end on 8081 (on the RHEL family with SELinux enforcing), so curl http://10.99.0.1/ from the peer returns the back end's page. If firewalld is running, allow it through.
  2. Balance the requests to port 80 across the back ends with nginx: 8081 and 8082 in turn, with 8083 as a backup.
  3. On port 81, balance across the same back ends with nginx, sticky by client address (without backup), so repeated requests from one host always reach the same back end. Allow port 81 through the firewall too, if one runs.
  4. Ubuntu: do the balancing of task 2 with HAProxy on port 8080, with health checks, so a stopped back end leaves the rotation within a few seconds. Allow port 8080 through ufw if it's active.
  5. Make the back ends behind port 80 receive the real client's address in an X-Forwarded-For header.

Hints

  • upstream, proxy_pass, server ... backup, ip_hash; nginx -t, then reload. On Ubuntu, the default site in sites-enabled is the default server for port 80.
  • RHEL: a 502 with SELinux enforcing means ausearch -m avc and setsebool -P httpd_can_network_connect.
  • frontend, backend, balance roundrobin, server ... check, option httpchk GET /; haproxy -c -f /etc/haproxy/haproxy.cfg.
  • proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for.
  • systemctl stop le-backend@8081 to test failover.