«А чего дома сидеть?»

network load balancing HA ProxyСтоит задача получить балансировщик сетевой нагрузки для WEB серверов с поддержкой SSL и в тоже время поддержкой Сookie (SSL Network Load Balancer). Причем сервера (два или больше) стоящие за NLB слушаю только 443 порт. Все реализованно на Linux машине и opensours продуктах Pound и HAProxy. Такой бесплатный NLB сравним с знаменитым балансеровщиком F5 или Amazon NLB.

Конфигурация применима как к виртуальным машинам так и к физически хостам. Linux хост может иметь один или два физических интерфейса. В зависимости от этого будет отличаться конфигурация Pound. Мои примеры сделаны для Linux хоста с одним физическим интерфейсом 10.0.0.3:443. Pound будет отвечать за де-крипшин входящего трафика и проксирования трафика к HAProxy. HAProxy работает на 127.0.0.1:8083. HAProxy примет решение на какой сервер передать трафик в зависимости от Сookie или рендомнно, в зависимости от настроек и передаст трафик на конкретный порт для Pound 127.0.0.1:8081/8082. Pound снова криптует пакеты от HAProxy и отправляет их на указаный сервер за NLB 10.0.0.1 или 10.0.0.2.
Обратный трафик в обратном порядке. В тестовой лаборатории собиралась инфраструктура с тремя выделленными серверами Pound - HAProxy - Pound - все прекрасно работало. Принято решение объеденить все на одном сервере, так как сетевая нагрузка на NLB большая не предполагалась, а важное значение имело отказоустойчивость и доступность сервисов за NLB.
Я опускаю установку Linux хоста, Pound и HAProxy. Просто ставьте последние версии, правьте конфиги под свою IP адресацию и SSL сертификаты и рестартуйте Pound и HAProxy.
Так же хорошо натроить таймауты под свои локальные серьвера, в зависимости от таймаутов их кешей.

Конфигурация Pound.
## Minimal sample pound.cfg
##
## see pound(8) for details
######################################################################
## global options:
User            "www-data"
Group           "www-data"
#RootJail       "/chroot/pound"
## Logging: (goes to syslog by default)
##      0       no logging
##      1       normal
##      2       extended
##      3       Apache-style (common log format)
LogLevel        0
## check backend every X secs:
Alive           60
TimeOut         60
## use hardware-accelleration card supported by openssl(1):
#SSLEngine      ""
# poundctl control socket
Control "/var/run/pound/poundctl.socket"
######################################################################
## https to http, redirect all requests on port 8083 ("ListenHTTP") to HAProxy
############################# WEB ####################################
ListenHTTPS
        Address 10.0.0.3
        Port    443
        ## Certificate
        Cert    "/etc/ssl/mycerts/myserver.pem"
        ## allow PUT and DELETE also (by default only GET, POST and HEAD if 1 or 2)
        ## super important !!!
        xHTTP           3
        Service
                BackEnd
                        Address 127.0.0.1
                Port    8083
                End
        End
End
######################################################################
## http to https, redirect all requests from 127.0.0.1 to local webservers 
############################# WEB ####################################
ListenHTTP
        Address 127.0.0.1
        Port    8081
        ## allow PUT and DELETE also (by default only GET, POST and HEAD)?:
        xHTTP           3
        Service
                BackEnd
                        Address 10.0.0.1
                        Port    443
                        Https "/etc/ssl/mycerts/myserver.pem"
                End
        End
End
ListenHTTP
        Address 127.0.0.1
        Port    8082
        ## allow PUT and DELETE also (by default only GET, POST and HEAD)?:
        xHTTP           3
        Service
                BackEnd
                        Address 10.0.0.2
                        Port    443
                        Https "/etc/ssl/mycerts/myserver.pem"
                End
        End
End

Конфигурация HAProxy.

global
  log 127.0.0.1 local1 notice
  maxconn 4096
  user haproxy
  group haproxy
  daemon
defaults
  log global
  maxconn 4096
  mode http
  timeout connect 60s
  timeout client 30m
  timeout server 30m
  timeout tunnel 60m
# WEB
frontend http_frontend
  bind 127.0.0.1:8083
  mode http
  default_backend web_https
#!!!!!!!!!!  WEB loadbalancer  !!!!!!!!!!!!!!!!!!!!!!!!!
backend web_https
  mode http
  stats enable
  balance roundrobin
#  balance leastconn
#  balance source
#  balance rdp-cookie
# cookie [ rewrite | insert | prefix ] [ indirect ] [ nocache ] [ postonly ]
# [ preserve ] [ httponly ] [ secure ] [ domain ]* [ maxidle ]
# [ maxlife ]
  cookie JSESSIONID prefix indirect nocache maxlife 30m
  server s1 127.0.0.1:8081 cookie s1 #web1
  server s2 127.0.0.1:8082 cookie s2 #web2
listen stats :8085
  mode http
  stats enable
#  stats hide-version
  stats realm Haproxy\ Statistics
  stats uri /
  stats auth admin:admin

Вот и все. Статистика NLB доступна на порту 8085