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

HAProxy: use_backend игнорируется, потому что у backend нет возможности внешнего интерфейса

У меня есть файл конфигурации HAProxy, который создается программно, и я получаю следующую ошибку для каждого определенного бэкэнда:

[WARNING] 073/153725 (1663) : parsing [/etc/haproxy/haproxy.cfg:964] : 'use_backend' ignored because backend 'bk_10716' has no frontend capability.

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

Мой файл конфигурации состоит из этого:

global
    tune.ssl.default-dh-param 2048
    log     127.0.0.1 local1 debug
    chroot  /var/lib/haproxy
    user    haproxy
    group   haproxy
    maxconn 4000
    daemon

defaults
    log     global
    mode    http
    option  httplog
    option  dontlognull
    timeout connect 5000
    timeout client 50000
    timeout server 50000
    errorfile 400 /etc/haproxy/errors/400.http
    errorfile 403 /etc/haproxy/errors/403.http
    errorfile 408 /etc/haproxy/errors/408.http
    errorfile 500 /etc/haproxy/errors/500.http
    errorfile 502 /etc/haproxy/errors/502.http
    errorfile 503 /etc/haproxy/errors/503.http
    errorfile 504 /etc/haproxy/errors/504.http

listen stats
    bind *:1234
    stats auth admin:bdi2016
    stats uri /
    stats realm Haproxy\ Statistics
    stats enable
    mode http

frontend http:
    bind *:80
    mode http
    option httpclose
    option forwardfor

за которыми следует множество из них:

use_backend bk_10011 if { hdr_end(host) -i somedomainname.com }
    backend bk_10011
        server server_10011   127.0.0.1:10011 check

Я просто упускаю что-то очевидное / глупое?

Это был просто тупая ошибка. Мне нужно было указать все мои use_backend if операторы внутри интерфейса, а не над каждым отдельным сервером. Вот почему он работал только с одним сервером, потому что независимо от отступа первый use_backend "принадлежал frontend http: и каждый последующий бэкэнд оказывался осиротевшим.

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

Так что на интерфейсе это будет примерно так:

frontend http:
id 1
bind *:80
mode http
option httpclose
option forwardfor

и вот так на бэкэнде (ах):

use_backend bk_10011 if { hdr_end(host) -i somedomainname.com }
backend bk_10011
    server server_10011   127.0.0.1:10011 id 1 check

По крайней мере, у меня это сработало.