HAProxy reqrep xóa URI theo yêu cầu phụ trợ


27

câu hỏi thực sự nhanh chóng liên quan đến reqrep HAProxy. Tôi đang cố gắng viết lại / thay thế yêu cầu được gửi đến phụ trợ.

Tôi có ví dụ tên miền và URI sau đây, cả hai đều chia sẻ cùng một tên miền, nhưng các nhóm máy chủ web phụ trợ khác nhau.

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

Tôi muốn web1 truy cập webfarm1 và web2 để truy cập webfarm2. Hiện tại điều này không xảy ra. Tuy nhiên, tôi muốn loại bỏ URI web1 hoặc web2 khi yêu cầu được gửi đến phụ trợ.

Đây là haproxy.cfg của tôi

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

Nếu tôi đi đến http://domain/web1hoặc http://domain/web2tôi thấy nó trong nhật ký lỗi rằng yêu cầu trên máy chủ trong mỗi phụ trợ mà requst dành cho tài nguyên / web1 hoặc / web2 tương ứng. Do đó, tôi tin rằng có điều gì đó không đúng với biểu thức thông thường của mình, mặc dù tôi đã sao chép và dán nó từ Tài liệu. http://code.google.com.vn/p/haproxy-docs/wiki/reqrep

Tóm tắt: Tôi đang cố định tuyến lưu lượng dựa trên URI, tuy nhiên tôi muốn HAProxy loại bỏ URI khi nó gửi yêu cầu đến nhóm phụ trợ.

Cảm ơn bạn!

-Jim


Có một nút chỉnh sửa và bình luận ngay bây giờ.
Chris S

1
Jim, bạn đang gặp vấn đề khi bình luận vì bạn đã đăng nhập bằng một tài khoản khác với bạn đã sử dụng để tạo câu hỏi này. Vui lòng thử và giữ tài khoản đăng nhập của bạn nhất quán để điều này không xảy ra trong tương lai. Tôi đã gắn cờ một người điều hành để sửa lỗi này.
MDMarra

Câu trả lời:


28

Bạn có cái này:

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

Tôi nghĩ bạn muốn điều này:

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

Sự khác biệt là cái thứ hai sẽ hoạt động nếu / sau webN bị bỏ qua.

Trả lời bình luận của bạn dưới đây, đi vào chi tiết về cách các biểu thức trên hoạt động là nỗ lực nhiều hơn tôi có thể cung cấp. Tuy nhiên, có lẽ điều này sẽ giúp.

Mọi thứ trước / web1 là "nắm bắt" mọi thứ xuất hiện trước web1 trong chuỗi yêu cầu. Vì vậy, thường đó sẽ là GET hoặc POST. (. *) "Nắm bắt" mọi thứ sau web1, kể cả không có gì nếu không có gì.

Phần tiếp theo ( \1\2) cho biết phải làm gì với những phần bị bắt. Nó nói để tạo thành một chuỗi bao gồm \1(phần bị bắt đầu tiên) và \2(tiếp theo là phần bị bắt thứ hai). Vì web1 không bao giờ bị bắt, nên nó không được lắp ráp vào đầu ra cuối cùng.


\ 1 \ \ 2 \ 3 biểu thị điều gì? Về tài liệu reqrep, ^ ([^ \] *) \ làm gì? Dưới đây là ví dụ được đưa ra trên trang tài liệu. # thay thế "/ static /" bằng "/" ở đầu bất kỳ đường dẫn yêu cầu nào. reqrep ^ ([^ \] *) \ /static/(.*) \ 1 \ / \ 2
Jim

Sau khi đọc bình luận của bạn, tôi nhận ra rằng giải pháp đề xuất của tôi hơi phức tạp một chút. Tôi đã đơn giản hóa nó.
longneck

Vậy cú pháp reqrep là gì? reqrep {string_2_search_thru} {search_opes} {thay_ chuỗi}? Tôi bối rối với \ 1 \ \ 2 \ 3?
Jim

Có cách nào để kết hợp reqrep này để hoạt động nếu người dùng đặt / web1 hoặc / web1 / không?
Jim

Bạn đã thử à?
longneck

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.