Связка haproxy + nginx + apache

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

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

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

У каждого метода есть свои достоинства и недостатки. Я сделал выбор в пользу программного балансировщика haproxy. Собственно с балансировкой веб-трафика неплохо справляется и сам nginx, но выбор в пользу haproxy сделан с перспективой на будущие, поскольку оно позволяет обслуживать любые 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.

6 комментариев “Связка haproxy + nginx + apache”

Комментирование закрыто.