Направьте несколько поддоменов на один бэкэнд с помощью haproxy

10

Я использую haproxy для прямого маршрута для нескольких приложений, работающих на одном сервере. Для одного из используемых доменов существует несколько десятков поддоменов, которые должны быть направлены в одно из нескольких приложений.

В настоящее время я перечисляю все эти субдомены в отдельной строке. Моя конфигурация внешнего интерфейса выглядит так:

frontend http-in
    bind *:80

    acl alpha     hdr(host) -i alpha.com
    acl beta      hdr(host) -i beta.com
    acl gamma00   hdr(host) -i apple.gamma.com
    acl gamma01   hdr(host) -i banana.gamma.com
    acl gamma02   hdr(host) -i cherry.gamma.com
    acl gamma03   hdr(host) -i durian.gamma.com
    acl gamma04   hdr(host) -i elderberry.gamma.com
    acl gamma05   hdr(host) -i fig.gamma.com
    acl gamma06   hdr(host) -i grapefruit.gamma.com
    acl gamma     hdr(host) -i gamma.com

    use_backend a if alpha
    use_backend b if beta
    use_backend sub1 if gamma00
    use_backend sub1 if gamma01
    use_backend sub1 if gamma02
    use_backend sub2 if gamma03
    use_backend sub2 if gamma04
    use_backend sub2 if gamma05
    use_backend sub2 if gamma06
    use_backend g if gamma

    default_backend default

Есть ли способ добиться аналогичного результата в более сжатой форме? Является ли такой листинг эффективным, или в какой-то момент лучше перейти на регулярное выражение?

Юбер О.Г.
источник
Хех, твой вопрос содержит ключевое слово regex, которое, по-моему, и есть твой ответ. Также обратите внимание, что вы можете использовать hdr_begвместо hdrтак, чтобы вы могли перечислить только субдомены. Наконец, должна быть возможность свернуть ваши gamma00-06ACL до двух ACL, один для sub1и один для sub2, просто используя их acl <title>в строке ACL.
Феликс Фрэнк

Ответы:

15

Чтобы сохранить максимальную производительность (избегая регулярных выражений при каждом ударе), но все же очистить конфигурацию, я бы использовал здесь внешний файл для ваших ACL. Например, допустим, у вас есть файл с именем /etc/haproxy/sub1urls, который был именно таким:

apple.gamma.com
banana.gamma.com
cherry.gamma.com

Тогда в вашем конфиге ACL может быть просто:

acl is_sub1 hdr(host) -i -f /etc/haproxy/sub1urls

Размещение других хостов в sub2urlsфайле таким же образом уменьшает ваши настройки до:

frontend http-in
    bind *:80

    acl alpha     hdr(host) -i alpha.com
    acl beta      hdr(host) -i beta.com
    acl is_sub1   hdr(host) -i -f /etc/haproxy/sub1urls
    acl is_sub2   hdr(host) -i -f /etc/haproxy/sub2urls
    acl gamma     hdr(host) -i gamma.com

    use_backend a if alpha
    use_backend b if beta
    use_backend sub1 if is_sub1
    use_backend sub2 if is_sub2
    use_backend g if gamma

    default_backend default

Это позволяет очень легко поддерживать эти другие файлы, так как они являются просто списками хостов. Он открывает список тех, кто может их редактировать, а также подвергает меньшему риску. Например, у нас есть люди, редактирующие эти списки ACL, подобные этому, в puppet, которым совсем не нужно знать синтаксис конфигурации HAProxy.

Ник Крейвер
источник