Arahkan beberapa subdomain ke backend tunggal dengan haproxy

10

Saya menggunakan haproxy untuk mengarahkan rute untuk beberapa aplikasi yang berjalan di satu server. Untuk salah satu domain yang digunakan ada beberapa lusinan subdomain yang harus diarahkan ke salah satu dari beberapa aplikasi.

Saat ini, saya mencantumkan semua subdomain itu dalam garis separte. Konfigurasi frontend saya terlihat seperti ini:

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

Apakah ada cara untuk mencapai hasil yang serupa dalam bentuk yang lebih ringkas? Apakah listing seperti itu efektif, atau lebih baik beralih ke regex di beberapa titik?

Hubert OG
sumber
Heh, pertanyaan Anda mengandung kata kunci regex, yang sebenarnya jawaban Anda, saya yakin. Perhatikan juga bahwa Anda dapat menggunakan hdr_begalih-alih hdrsehingga Anda hanya dapat menghitung subdomain. Akhirnya, mungkin untuk menutup gamma00-06ACL Anda menjadi hanya dua ACL, satu untuk sub1dan satu untuk sub2, hanya dengan menggunakan yang sama acl <title>di baris ACL.
Felix Frank

Jawaban:

15

Untuk menjaga kinerja maksimal (menghindari regex setiap klik) tetapi masih membersihkan konfigurasi, saya akan menggunakan file eksternal untuk ACL Anda di sini. Misalnya, Anda memiliki file yang dipanggil /etc/haproxy/sub1urls, yang persis seperti ini:

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

Maka dalam konfigurasi Anda ACL bisa saja:

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

Menempatkan host lain dalam sub2urlsfile dengan cara yang sama mengurangi konfigurasi Anda ke:

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

Ini membuatnya sangat mudah untuk memelihara file-file lain, karena mereka hanya daftar host. Ini membuka daftar siapa yang dapat mengeditnya dan mengekspos risiko yang lebih kecil juga. Sebagai contoh, kami memiliki orang-orang yang mengedit daftar ACL ini seperti ini di boneka yang sama sekali tidak perlu mengetahui sintaks konfigurasi HAProxy.

Nick Craver
sumber