HAproxy - Bagaimana cara meneruskan lalu lintas ke backend dengan header yang cocok?

Misalnya. header berisi: X-DEMO-HOST-VERSION: test - bagaimana saya perlu mengatur konfigurasi haproxy untuk meneruskan ke backend tertentu? Bisakah ini dilakukan di backend atau di frontend?

Mengenai dokumentasinya saya sedikit bingung.


person Pegasus1985    schedule 28.10.2019    source sumber


Jawaban (1)


Anda memerlukan nilai header pemeriksaan (hdr di haproxy) melalui ACL. Cobalah:

frontend header_front
    bind *:80
    mode http
    option forwardfor if-none
    acl demo_host_version hdr(X-DEMO-HOST-VERSION) -i test
    use_backend test_backend if demo_host_version
    default_backend prod_backend

backend test_backend
    ...

backend prod_backend
    ...

Tes untuk tajuk Anda:

    acl demo_host_version hdr(X-DEMO-HOST-VERSION) -i test
    use_backend test_backend if demo_host_version

Logikanya: IF X-DEMO-HOST-VERSION=test gunakan test_backend ELSE gunakan prod_backend


UPD: Jika Anda memerlukan acl untuk jalur di URL (example.com/test/):

    acl demo_host_path path_beg /test/
    use_backend test_backend if demo_host_path

Jika Anda perlu menggunakan dua ACL dalam pernyataan if, gunakanlah:

    acl demo_host_version hdr(X-DEMO-HOST-VERSION) -i test
    acl demo_host_path path_beg /test/
    use_backend test_backend if demo_host_path demo_host_version

UPD untuk memeriksa URL:

Pemeriksaan subdomain. Jika Anda memiliki domain test.example.com atau test.abc.com, cobalah:

acl host_sub_domain hdr_beg(host) -i test

Untuk cek domain lengkap, misal test.example.com, coba:

acl host_full_domain hdr(host) -i test.example.com
person qwsj    schedule 28.10.2019
comment
Terima kasih atas balasan cepat Anda. Saya membuatnya berfungsi di frontend SSL kami. Tapi apakah ada cara untuk menentukan URL tertentu? Sejauh yang saya pahami, saya dapat menggunakan setiap URL yang ditentukan dalam file peta HAproxys atau alamat penyeimbang beban itu sendiri. Bagi saya itu sedikit tidak yakin. Apakah ada jalan? - person Pegasus1985; 28.10.2019
comment
@mrpizzamccony oke, cek update di postingan saya, mungkin ini yang anda butuhkan - person qwsj; 28.10.2019
comment
apakah ada cara untuk tidak menggunakan jalur/URI tetapi URL? Jika saya akan menggunakan jalur dari awal saya tidak memerlukan permintaan header lagi, karena ketika jalur tertentu akan dieksekusi maka jalur tersebut menunjuk ke backend kanan. Menggunakan header khusus DAN URI mungkin agak berlebihan. - person Pegasus1985; 29.10.2019
comment
@mrpizzamccony periksa pembaruan, saya menambahkan acl untuk URL. - person qwsj; 29.10.2019
comment
Terima kasih banyak! Saya membuatnya berfungsi menggunakan use_backend test_backend if host_full_domain demo_host_version. Anda benar-benar membuat hari saya menyenangkan! Satu pertanyaan terakhir: Apakah pencarian pada setiap header dan membandingkannya dengan domain lengkap memiliki dampak kinerja yang besar? - person Pegasus1985; 29.10.2019
comment
@mrpizzamccony sama-sama. tidak, itu adalah praktik normal untuk menggunakan aturan dan acl dalam konfigurasi. kemungkinan besar Anda akan mendapatkan masalah dengan kinerja linux dan batasan sistem, tetapi tidak dengan haproxy. - person qwsj; 29.10.2019
comment
sekarang saya menghadapi masalah karena test.example.com/somepath masih menunjuk ke backend eksperimental menggunakan header itu. Apakah ada kemungkinan untuk mencocokkan test.example.com saja? Maksud saya, ketika test.example.com/somepath akan dicari menggunakan header eksperimental, itu harus mengarah ke backend lain. - person Pegasus1985; 31.10.2019