Связка haproxy + nginx + apache 6


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

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

  • 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.


6 мыслей про “Связка haproxy + nginx + apache

  • eujin

    правильно ли я понимаю , что отображение реального IP клиента будет работать только для HTTP ?

  • Rascal От автора

    А это уже совершенно другая история, своя для каждого типа БД.

  • Alex

    а как синхронизировать БД, мастер-мастер?

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