Load-Balancing

HAProxy reqrep 刪除後端請求上的 URI

  • December 23, 2020

關於 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 從未被擷取,因此它不會被組裝到最終輸出中。

引用自:https://serverfault.com/questions/444965