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

У HAProxy нет доступного сервера

Я пытаюсь настроить очень простой балансировщик нагрузки HTTP с бэкэндами node.js в CentOS 7. Бэкэнды - это все HTTP-серверы.

Если я настрою как серверную часть для прослушивания порта 80, так и HAProxy для прослушивания порта 80 и использовать порт 80 на сервере, все будет работать нормально. Вот как выглядит конфигурационный файл в такой конфигурации:

global
    log         127.0.0.1 local2 info
    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     256
    user        haproxy
    group       haproxy
    daemon

defaults
    mode               http
    log                global
    option             httplog
    timeout connect    10s
    timeout client     30s
    timeout server     30s

frontend http-in
    bind               :80
    default_backend    backend_servers
    option             forwardfor

backend backend_servers
    balance            roundrobin
    server             backend1 10.0.4.51:80 check
#    server             backend2 10.0.4.52:80 check
#    server             backend3 10.0.4.53:80 check
#    server             backend4 10.0.4.54:80 check
#    server             backend5 10.0.4.55:80 check
#    server             backend6 10.0.4.56:80 check

Но если я изменю все порты на 8124, HAProxy при запуске покажет следующую ошибку:

haproxy[3324]: backend backend_servers has no server available!

Так выглядит новая конфигурация

global
    log         127.0.0.1 local2 info
    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     256
    user        haproxy
    group       haproxy
    daemon

defaults
    mode               http
    log                global
    option             httplog
    timeout connect    10s
    timeout client     30s
    timeout server     30s

frontend http-in
    bind               :8124
    default_backend    backend_servers
    option             forwardfor

backend backend_servers
    balance            roundrobin
    server             backend1 10.0.4.51:8124 check
#    server             backend2 10.0.4.52:8124 check
#    server             backend3 10.0.4.53:8124 check
#    server             backend4 10.0.4.54:8124 check
#    server             backend5 10.0.4.55:8124 check
#    server             backend6 10.0.4.56:8124 check

Конечно, серверная программа node.js теперь прослушивает порт 8124.

Брандмауэр открыт для порта 8124 в серверной части и следующей команды:

wget http://10.0.4.51:8124/action

отлично работает с балансировщиком нагрузки, что означает, что балансировщик нагрузки действительно может получить доступ к бэкэнду.

В этих обстоятельствах HAProxy, похоже, не запустился, так как я не вижу порт 8124 в LISTEN состояние, когда я использую netstat -an.

Я впервые использую HAProxy, поэтому, возможно, мне не хватает чего-то действительно тривиального.

Что еще я должен проверить?

Я только что разобрался.

Проблема не в конфигурации HAProxy, а в SELinux, который включен и установлен в принудительный режим по умолчанию в CentOS 7. Похоже, что конфигурация SELinux по умолчанию разрешает HAProxy только на порту 80.

Установка SELinux в разрешающий режим, его полное отключение или иное разрешение SELinux разрешить HAProxy использовать другие порты решило проблему.

Вы можете использовать semanage, чтобы разрешить HAProxy использовать порт:

sudo semanage port -a -p tcp -t http_port_t 8124