HAproxy - จะส่งต่อการรับส่งข้อมูลไปยังแบ็กเอนด์ด้วยส่วนหัวที่ตรงกันได้อย่างไร

เช่น. ส่วนหัวประกอบด้วย: X-DEMO-HOST-VERSION: test - ฉันจะต้องตั้งค่าการกำหนดค่า haproxy เพื่อส่งต่อไปยังแบ็กเอนด์เฉพาะได้อย่างไร สามารถทำได้ภายในแบ็กเอนด์หรือในฟรอนต์เอนด์หรือไม่

เกี่ยวกับเอกสาร ฉันสับสนนิดหน่อย


person Pegasus1985    schedule 28.10.2019    source แหล่งที่มา


คำตอบ (1)


คุณต้องตรวจสอบค่าส่วนหัว (hdr ใน haproxy) ผ่าน ACL ลองมัน:

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
    ...

ทดสอบส่วนหัวของคุณ:

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

ตรรกะ: IF X-DEMO-HOST-VERSION=test ใช้ test_backend ELSE ใช้ prod_backend


UPD: หากคุณต้องการ acl สำหรับเส้นทางใน URL (example.com/test/):

    acl demo_host_path path_beg /test/
    use_backend test_backend if demo_host_path

หากคุณต้องการใช้ ACL สองตัวในคำสั่ง if ให้ใช้:

    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 สำหรับตรวจสอบ URL:

ตรวจสอบโดเมนย่อย หากคุณโดเมน test.example.com หรือ test.abc.com ลอง:

acl host_sub_domain hdr_beg(host) -i test

สำหรับการตรวจสอบโดเมนแบบเต็ม เช่น test.example.com ให้ลองทำดังนี้:

acl host_full_domain hdr(host) -i test.example.com
person qwsj    schedule 28.10.2019
comment
ขอบคุณสำหรับการตอบกลับที่รวดเร็วของคุณ ฉันทำให้มันใช้งานได้กับฟรอนต์เอนด์ SSL ของเรา แต่มีวิธีระบุ URL ที่กำหนดหรือไม่ เท่าที่ฉันเข้าใจ ฉันสามารถใช้ทุก URL ที่กำหนดไว้ในไฟล์แมป HAproxys หรือที่อยู่ของโหลดบาลานเซอร์เอง สำหรับฉันมันค่อนข้างไม่แน่ใจ มีวิธีไหม? - person Pegasus1985; 28.10.2019
comment
@mrpizzamccony ตกลง ตรวจสอบการอัปเดตในโพสต์ของฉัน บางทีนี่อาจเป็นสิ่งที่คุณต้องการ - person qwsj; 28.10.2019
comment
มีวิธีที่ไม่ใช้เส้นทาง/URI แต่เป็น URL หรือไม่ หากฉันใช้เส้นทางตั้งแต่ต้น ฉันจะไม่ต้องการคำขอส่วนหัวอีกต่อไป เพราะเมื่อใดที่เส้นทางที่กำหนดจะถูกดำเนินการ มากกว่าที่จะชี้ไปยังแบ็กเอนด์ด้านขวา การใช้ส่วนหัวพิเศษและ URI อาจจะมากไปสักหน่อย - person Pegasus1985; 29.10.2019
comment
@mrpizzamccony ตรวจสอบการอัปเดต ฉันเพิ่ม acl สำหรับ URL แล้ว - person qwsj; 29.10.2019
comment
ขอบคุณมาก! ฉันทำให้มันใช้งานได้โดยใช้ use_backend test_backend if host_full_domain demo_host_version คุณทำให้วันของฉันเป็นจริง! คำถามสุดท้าย: การค้นหาทุกส่วนหัวและเปรียบเทียบกับโดเมนทั้งหมดมีผลกระทบต่อประสิทธิภาพอย่างมากหรือไม่ - person Pegasus1985; 29.10.2019
comment
@mrpizzamccony ยินดีต้อนรับครับ ไม่ เป็นเรื่องปกติที่จะใช้กฎและ acl ในการกำหนดค่า เป็นไปได้มากว่าคุณจะสามารถประสบปัญหากับประสิทธิภาพของ Linux และขีดจำกัดของระบบ แต่ไม่ใช่กับ haproxy - person qwsj; 29.10.2019
comment
ตอนนี้ฉันกำลังประสบปัญหาที่ test.example.com/somepath ยังคงชี้ไปที่แบ็กเอนด์ทดลองโดยใช้ส่วนหัวนั้น มีความเป็นไปได้ที่จะจับคู่ test.example.com หรือไม่ ฉันหมายความว่าเมื่อ test.example.com/somepath จะถูกสอบถามโดยใช้ส่วนหัวของการทดลอง ก็ควรชี้ไปที่แบ็กเอนด์อื่น - person Pegasus1985; 31.10.2019