Назад | Перейти на главную страницу

HAProxy не может привязать сокет для прокси на удаленном компьютере

Я использую HAProxy для балансировки нагрузки входящих запросов на моих двух внутренних серверах Tomcat. В файле конфигурации, когда я указываю HAProxy для прослушивания того же компьютера, на котором установлен HAProxy, все в порядке, и он начинает работать как шарм. Мне нужен HAProxy для прослушивания виртуального IP-адреса на другом компьютере (чтобы я мог установить другой LB в качестве аварийного переключения), но когда я настраиваю HAProxy для этого, я получаю эту ошибку при запуске HAProxy:

не может привязать сокет для прокси http_proxy. Прерывание.

вот мой файл конфигурации:

global
    maxconn 4096 # Total Max Connections. This is dependent on ulimit
    daemon
    nbproc 4 
defaults
    mode http
    clitimeout 60000
    srvtimeout 30000
    contimeout 4000
    option httpclose # Disable Keepalive

listen http_proxy 10.0.5.99:80 #the virtual IP I want to listen to
    mode http
    stats enable
    stats auth xxx:xxx
    balance source # Load Balancing algorithm
    option httpchk
    option forwardfor # This sets X-Forwarded-For
    ## Define your servers to balance
    server web1 10.0.5.102:8080 weight 1 maxconn 512 check
    server web2 10.0.5.103:8080 weight 1 maxconn 512 check

Я использую CentOS 5.1, установленную на некоторых виртуальных машинах. Необходимо сказать, что я полностью остановил службу iptables на удаленном компьютере, и проблема все еще существует. Я предполагаю, что что-то мешает haproxy на удаленной машине. Любые идеи?

Вы также можете разрешить процессу связываться с нелокальным (то есть несуществующим IP), добавив net.ipv4.ip_nonlocal_bind=1 к /etc/sysctl.conf и бег sysctl -p. Но что такое sysadmin1138: вы можете посмотреть, как вы спроектировали аварийное переключение.

При выполнении конфигурации аварийного переключения, как вы говорите, вы хотите, я обнаружил, что лучше позволить механизму кластеризации обрабатывать перемещение IP-адресов, чем каким-либо образом делать это в HAProxy. Вы настраиваете виртуальный IP-адрес для перемещения между узлами, а затем настраиваете его, чтобы служба (HAproxy) следовала за этим виртуальным IP. Затем вы настраиваете HAProxy для прослушивания только виртуального IP. Это работает, потому что это программное обеспечение для кластеризации который запускает и останавливает процесс HAproxy по мере его перемещения, вы не делаете этого из обычных служб.

Вы получаете сообщение об ошибке, потому что haproxy пытается прослушивать несуществующий IP-адрес. Похоже, вы запускаете процесс haproxy до того, как VIP будет назначен машине.

Одно из решений - прослушивать все интерфейсы 0.0.0.0. Затем вы можете ограничить доступ к VIP, используя iptables если нужно.

Другой вариант - прослушивать VIP, но вам нужно убедиться, что VIP существует при запуске haproxy. Это можно сделать, разрешив программному обеспечению кластеризации (например, keepalived) запускать haproxy для вас, когда оно получает VIP.

См. Ответы выше о настройке net.ipv4.ip_nonlocal_bind=1.

Если это не сработает, проверьте, есть ли у вас уже существующая служба, прослушивающая порт, к которому вы пытаетесь привязаться, с помощью sudo lsof -i :80.