Я пытаюсь настроить очень простой балансировщик нагрузки 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