Load-Balancing
HAProxy reqrep 刪除後端請求上的 URI
關於 HAProxy reqrep 的真正快速問題。我正在嘗試重寫/替換發送到後端的請求。
我有以下範例域和 URI,它們共享相同的域名,但後端 Web 伺服器池不同。
http://domain/web1 http://domain/web2
我希望 web1 去後端 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
我在錯誤日誌中看到,每個後端伺服器上的請求分別針對資源 /web1 或 /web2。因此,我認為我的正則表達式有問題,即使我從文件中複製並粘貼了它。http://code.google.com/p/haproxy-docs/wiki/reqrep摘要:我正在嘗試基於 URI 路由流量,但是我希望 HAProxy 在將請求發送到後端池時剝離 URI。
謝謝!
-吉姆
你有這個:
reqrep ^([^\ ]*)\ /web1/(.*) \1\ /\2
我想你想要這個:
reqrep ^([^\ ]*\ /)web1[/]?(.*) \1\2
不同之處在於,如果省略 webN 之後的 / ,則第二個將起作用。
在回答您下面的評論時,詳細了解上述表達式的工作原理比我所能付出的更多。但是,也許這會有所幫助。
/web1 之前的所有內容都在“擷取”請求字元串中 web1 之前的所有內容。所以通常是 GET 或 POST。(.*) “擷取” web1 之後的所有內容,如果沒有,則不包括任何內容。
下一部分 (
\1\2
) 說明如何處理這些擷取的部分。它說形成一個由\1
(第一個擷取的部分)和\2
(後面是第二個擷取的部分)組成的字元串。由於 web1 從未被擷取,因此它不會被組裝到最終輸出中。