Haproxy

有沒有辦法使用多個門檻值來限制與 HAProxy 的連接

  • November 19, 2020

我使用 HaProxy 實現了簡單的速率限制,其方式與 StackExchange 使用 HaProxy 的方式類似。我試圖讓它更先進一點,以便有多個速率限制門檻值。

例如,限制請求的客戶端:

  • >

15/分鐘

  • >

60/小時

  • >

360/天

似乎我需要多個棒表來儲存具有不同採樣率的相同數據。該文件指出:

每個代理只有一個stick-table。在編寫本文件時,每個代理有多個表似乎沒有用。如果碰巧需要這樣做,只需創建一個虛擬後端並在其中引用它即可。

不幸的是,我有一段時間試圖弄清楚如何將數據儲存到虛擬後端表中。

我也對其他方法持開放態度,HaProxy 似乎是一條有前途的道路,因為我們已經在環境中擁有了它,所以它是有意義的。任何建議表示讚賞。

我只是想自己做這件事,運氣不好,決定求助於我的 google-fu。在尋找多級速率限制時,對我來說最好的結果就是這個,我真的很興奮。然後我看到它沒有答案,最初陷入了絕望的生存深淵。在探勘自己之後,我一直在破解,幸運的是,我似乎已經想出瞭如何做到這一點,至少可以滿足我的需要。也許它也對你有用。

Haproxy 真的非常酷,我很高興開始使用它來代替我們目前的負載平衡解決方案,但是 Stick-tables 有點讓人頭疼。在這方面,我發現了一個似乎對我有幫助的一般原則,那就是明確提到每一個當您嘗試使用多個棍子表進行設置時,按名稱粘貼表。預設行為,其中名稱是隱式的(假設是您所在的後端),非常棒……除非您開始嘗試使用多個棍子表。所以這就是為什麼在我下面的配置中,其中一些比它必須的更冗長。我只是發現這樣更容易遵循邏輯。無論如何,這裡是(請注意,這是基於 Moodle 應用程序的 cookie,而不是 IP,並且它使用 v1.5.11 的 haproxy):

backend dynamic_60
 stick-table type string len 36 size 1m store gpc0_rate(60s)

backend dynamic
 stick-table type string len 36 size 1m store gpc0_rate(10s)
 stick on cookie(MoodleSession) table dynamic
 stick on cookie(MoodleSession) table dynamic_60
 tcp-request content track-sc0 cookie(MoodleSession) table dynamic
 tcp-request content track-sc1 cookie(MoodleSession) table dynamic_60

 acl rate_10s sc0_inc_gpc0(dynamic) gt 0
 acl rate_60s sc1_inc_gpc0(dynamic_60) gt 0
 tcp-request content reject if rate_10s rate_60s FALSE

所以,這樣做是設置一個計數器記錄每 10 秒的速率,另一個記錄每 60 秒的速率。請注意,它實際上並沒有使用這些計數器來進行任何速率限制。但您可以通過以下方式進行驗證:

echo "show table dynamic" | socat /var/run/haproxy/admin.sock stdio
echo "show table dynamic_60" | socat /var/run/haproxy/admin.sock stdio

費率計數器是單獨維護的。

我想找出讓這些計數器實際遞增所需的最小配置,這就是為什麼您在“tcp-request content reject”語句的末尾看到“FALSE”的原因。僅使用計數器定義 acl 不會使它們增加。你必須實際使用acl。將“FALSE”放在最後只是允許我使用 acl,而無需滿足實際拒絕請求的條件。一旦我為這些 acl 確定了一些真正的數字,我可能會刪除“FALSE”。

讓多個 Stick 表工作的真正關鍵似乎是執行“stick on”、“track-sc{0|1|2}”和在您實際處理請求的後端。將其中任何一個移動到 dynamic_60 後端會導致該計數停止工作。我想原因是跟踪或應用 acls 到不服務請求的後端是沒有意義的,因為它實際上並沒有請求從中提取資訊。也就是說,我相信其他人會有更好的解釋。我對 haproxy 很陌生。

我問的下一個問題是:我是否僅限於跟踪 3 件事(因為“track-sc”配置設置僅從 0 到 2)。我相信,是的,您只能跟踪三件事。但重要的是,每人有 3 件事實際服務請求的後端。因此,例如,如果像我一樣,您想對靜態內容和動態內容進行不同的速率限制,您可以根據要求。然後在“static”後端,在“static”和“static_60”後端定義 track-sc0 和 track-sc1(如果您碰巧遵循與我上面放置的配置類似的命名方案)。然後,您將有 4 個表格用於做出限速決定。動態和靜態內容的 10 秒和 60 秒速率。使用第三個計數器,我認為您可以進入 3 個級別,但我認為這將是極限。

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