Связка haproxy + nginx + apache

Жил да был один веб-сервер, работали на нем как бэкенд и как фронтэнд. Крутился на всем этом сайт. Но вот потребовалось гео-резервировать сервер, и обеспечить непрерывность работы этого сайта. Настроить сервер в другом дата-центре не большая проблема, можно даже обеспечить репликацию данных (например так). А вот как корректно распределять трафик между серверами?

Для этого есть два основных метода:

  • Round robin DNS
  • Load Balancer (аппаратный или программный)

У каждого метода есть свои достоинства и недостатки. Я сделал выбор в пользу программного балансировщика . Собственно с балансировкой веб-трафика неплохо справляется и сам nginx, но выбор в пользу сделан с перспективой на будущие, поскольку оно позволяет обслуживать любые tcp-соединения (работает на 4-ом уровне OSI).

Сам балансировщик можно разместить в 3-ем дата-центре или, как это сейчас популярно, в облаке.

Приведу пример конфиурации haproxy для балансировки http и https трафика между двумя равноценными серверами.

 global log 127.0.0.1 local1 notice maxconn 4096 chroot /usr/share/haproxy user haproxy group haproxy daemon defaults log global mode http option httplog option dontlognull retries 3 option redispatch maxconn 2000 contimeout 5000 clitimeout 50000 srvtimeout 50000 listen http :80 mode http balance roundrobin option httpclose option forwardfor option httpchk HEAD /index.htm HTTP/1.0 server www1 192.168.1.1:80 weight 1 check inter 10000 fall 3 server www2 192.168.2.1:80 weight 1 check inter 10000 fall 3 listen stat :8080 mode http stats enable stats auth user:secret listen https :443 mode tcp balance roundrobin stick-table type ip size 200k expire 30m stick on src option tcplog server www1 192.168.1.1:443 weight 1 check inter 10000 fall 3 server www2 192.168.2.1:443 weight 1 check inter 10000 fall 3 

В данной конфигурации включен доступ к статистике haproxy пользователю user с паролем secret, а сама статистика вынесена на отдельный порт 8080.

Этого достаточно чтобы все работало. Однако, если требуется чтобы в логах веб-сервера были реальные ip-адреса клиентов, а не ip-адрес балансировщика — нужно добавить несколько опций в конфигурационный файл nginx:

 http { ... set_real_ip_from 192.168.3.1; real_ip_header X-Forwarded-For; port_in_redirect off; ... } 

Где 192.168.3.1 — ip-адрес сервера на котором работает haproxy.

В изменении параметра RPAFproxy_ips для apache необходимости нет, для него проксирующим сервером по прежнему остается nginx.