HAProxy reqrep ลบ URI จากคำขอแบ็กเอนด์


27

คำถามด่วนจริงเกี่ยวกับการตอบสนอง HAProxy ฉันพยายามเขียนใหม่ / แทนที่คำขอที่ส่งไปยังแบ็กเอนด์

ฉันมีโดเมนตัวอย่างต่อไปนี้และ URIs ทั้งการแชร์ชื่อโดเมนเดียวกัน แต่เว็บเซิร์ฟเวอร์ส่วนหลังที่ต่างกัน

http://domain/web1
http://domain/web2

ฉันต้องการ web1 เพื่อไปที่ backend webfarm1 และ web2 เพื่อไปที่ webfarm2 ปัจจุบันนี้เกิดขึ้น อย่างไรก็ตามฉันต้องการที่จะตัดการ web1 หรือ web2 URI เมื่อคำขอถูกส่งไปยังแบ็กเอนด์

นี่คือ haproxy.cfg ของฉัน

frontend webVIP_80
        mode http
        bind    :80
        #acl routing to backend
        acl web1_path path_beg /web1
        acl web2_path path_beg /web2

        #which backend
        use_backend webfarm1 if web1_path
        use_backend webfarm2 if web2_path
        default_backend webfarm1

backend webfarm1
        mode http
        reqrep ^([^\ ]*)\ /web1/(.*)     \1\ /\2
        balance roundrobin
        option httpchk HEAD /index HTTP/1.1\r\nHost:\ example.com
        server webtest1 10.0.0.10:80 weight 5 check slowstart 5000ms
        server webtest2 10.0.0.20:80 weight 5 check slowstart 5000ms
backend webfarm2
        mode http
        reqrep ^([^\ ]*)\ /web2/(.*)     \1\ /\2
        balance roundrobin
        option httpchk HEAD /index HTTP/1.1\r\nHost:\ example.com
        server webtest1-farm2 10.0.0.110:80 weight 5 check slowstart 5000ms
        server webtest2-farm2 10.0.0.120:80 weight 5 check slowstart 5000ms

ถ้าฉันไปที่http://domain/web1หรือhttp://domain/web2ฉันเห็นมันในบันทึกข้อผิดพลาดที่คำขอบนเซิร์ฟเวอร์ในแต่ละแบ็กเอนด์ที่ requst นั้นมีไว้สำหรับทรัพยากร / web1 หรือ / web2 ตามลำดับ ดังนั้นฉันเชื่อว่ามีบางอย่างผิดปกติกับนิพจน์ปกติของฉันแม้ว่าฉันจะคัดลอกและวางจากเอกสาร http://code.google.com/p/haproxy-docs/wiki/reqrep

สรุป: ฉันพยายามกำหนดเส้นทางการรับส่งข้อมูลตาม URI แต่ฉันต้องการให้ HAProxy ตัดการเชื่อมต่อ URI เมื่อส่งการร้องขอไปยังพูลแบ็คเอนด์

ขอขอบคุณ!

จิม


ตอนนี้มีปุ่มแก้ไขและปุ่มแสดงความคิดเห็น
Chris S

1
จิมคุณมีปัญหาในการแสดงความคิดเห็นเนื่องจากคุณลงชื่อเข้าใช้ด้วยบัญชีอื่นที่ไม่ใช่คำถามที่เคยสร้าง โปรดลองและรักษาบัญชีเข้าสู่ระบบให้สอดคล้องเพื่อไม่ให้เกิดขึ้นอีกในอนาคต ฉันตั้งค่าสถานะผู้ดูแลเพื่อแก้ไขปัญหานี้แล้ว
MDMarra

คำตอบ:


28

คุณมีสิ่งนี้:

reqrep ^([^\ ]*)\ /web1/(.*)     \1\ /\2

ฉันคิดว่าคุณต้องการสิ่งนี้:

reqrep ^([^\ ]*\ /)web1[/]?(.*)     \1\2

ความแตกต่างที่เป็นที่สองจะทำงานถ้า / หลัง webN ถูกละไว้

ในการตอบความคิดเห็นของคุณด้านล่างไปที่รายละเอียดเกี่ยวกับวิธีการทำงานของการแสดงออกข้างต้นเป็นความพยายามมากกว่าที่ฉันสามารถให้ อย่างไรก็ตามนี่อาจช่วยได้

ทุกอย่างก่อน / web1 คือ "การจับ" ทุกอย่างที่มาก่อน web1 ในสตริงคำขอ ดังนั้นโดยปกติจะเป็น GET หรือ POST (. *) "จับ" ทุกอย่างหลังจาก web1 รวมถึงไม่มีอะไรหากไม่มีอะไรเลย

ส่วนถัดไป ( \1\2) บอกว่าจะทำอย่างไรกับส่วนที่ถูกจับเหล่านั้น มันบอกว่าในรูปแบบสตริงประกอบด้วย\1(ส่วนที่ถูกจับครั้งแรก) และ\2(ตามด้วยส่วนที่สองถูกจับ) เนื่องจากไม่เคยบันทึก web1 จึงไม่ได้รวมเข้ากับเอาต์พุตสุดท้าย


\ 1 \ \ 2 \ 3 มีความหมายอะไร เกี่ยวกับเอกสารประกอบการตรวจสอบซ้ำ ^ ([^ \] *) \ ทำได้อย่างไร นี่คือตัวอย่างที่ให้ไว้ในหน้าเอกสาร # แทนที่ "/ static /" ด้วย "/" ที่จุดเริ่มต้นของเส้นทางคำขอใด ๆ reqrep ^ ([^ \] *) \ / static/(.*) \ 1 \ / \ 2
Jim

หลังจากอ่านความคิดเห็นของคุณแล้วฉันก็รู้ว่าโซลูชันที่ฉันเสนอนั้นซับซ้อนเกินไปเล็กน้อย ฉันทำให้มันง่ายขึ้น
longneck

ดังนั้นไวยากรณ์ reqrep คืออะไร? ต้องการ {string_2_search_thru} {search_string} {replace_string} หรือไม่ ฉันสับสนกับ \ 1 \ \ 2 \ 3 หรือไม่
Jim

มีวิธีรวม reqrep นี้ทำงานหากผู้ใช้วาง / web1 หรือ / web1 /?
Jim

คุณลองหรือยัง
longneck

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.