Жил да был один веб-сервер, работали на нем 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”
правильно ли я понимаю , что отображение реального IP клиента будет работать только для HTTP ?
Правильно
Можно, например, так.
А это уже совершенно другая история, своя для каждого типа БД.
ну а если конкретно для Mysql?
а как синхронизировать БД, мастер-мастер?