Haproxy

HaProxy 1.8 - 粘貼表格並將 haproxy 計算的費率作為請求標頭傳遞給後端

  • June 11, 2019

我讀過這篇關於棍子表的文章:https ://www.haproxy.com/blog/introduction-to-haproxy-stick-tables/

我想在我的 haproxy 配置中添加速率限制。但是在我想添加一個硬限制之前,我想知道我的每個客戶提出了多少請求,以便了解一個好的限制門檻值是多少,並能夠在添加為之前聯繫超過此限制的客戶硬性限制。

我的後端已準備好在自定義級別上儲存和記錄這些類型的資訊。在步驟 1 中我需要做的就是讓 haproxy 傳遞以下值:

  • Request rate per ip (http_req_rate) 描述了每X次的http請求數(用來防止http泛洪)
  • Connection rate per ip (conn_rate) 它描述了新連接的數量(當使用 keep alive 時,這個數字會與 http_req_rate 不同)(用於防止 tcp syn flood)
  • 每個 ip 的目前連接數 (conn_cur)(用於防止連接表耗盡)

我做了以下配置來完成這項工作:

(global, listen, default and frontend sections not relevant)

// # round robin balancing between the various backends
backend app
 # Bind the 3 stick-tables counting to 3 slots named track-sc0, -sc1 and -sc2
 http-request track-sc0 src table sticktable_st_src_http_req_rate
 http-request track-sc1 src table sticktable_st_src_conn_cur
 http-request track-sc2 src table sticktable_st_src_conn_rate

 # Save current values in variables to be able to parse them on to backends
 http-request set-var(req.http_req_rate) sc_http_req_rate(0)
 http-request set-var(req.conn_cur) sc_conn_cur(1)
 http-request set-var(req.conn_rate) sc_conn_rate(2)

 # Finally copy the variables into request headers for the real backends to read the values
 http-request set-header X-HaProxy-http_req_rate %[var(req.http_req_rate)]
 http-request set-header X-HaProxy-conn_cur      %[var(req.conn_cur)]
 http-request set-header X-HaProxy-conn_rate     %[var(req.conn_rate)]

 ...
 server localtest 192.168.1.130:80 check

backend sticktable_st_src_http_req_rate
 stick-table type ip size 1m expire 10s store http_req_rate(10s)

backend sticktable_st_src_conn_cur
 stick-table type ip size 1m expire 10s store conn_cur

backend sticktable_st_src_conn_rate
 stick-table type ip size 1m expire 10s store conn_rate(10s)

即使這實際上完成了這項工作,但當有 3-5 個後端部分都需要它時,它變得有點混亂。

另一件事是它看起來不是很聰明,

1)定義三個後端 2)在 3 個跟踪命令中使用這三個後端 3)將它們複製到臨時變數中(因為我不知道如何將它們直接解析為請求標頭 4)在設置請求標頭時參考臨時變數。

可以以任何方式壓縮或簡化此配置以使其看起來更乾燥嗎?

HaProxy 1.8 版

謝謝

如果您只想查看棒表值,可以使用執行時 API(stat 套接字):https ://www.haproxy.com/blog/dynamic-configuration-haproxy-runtime-api/並使用“顯示表<表名>”命令。

關於您的配置:

  1. 您不需要為每個計數器設置單獨的表。您可以將所有計數器儲存在同一個表中。

2.不需要使用中間變數

backend app
 # Enable counters tracking
 http-request track-sc0 src table sticktable_st_src_rates
 # Put counters in HTTP headers
 http-request set-header X-HaProxy-http_req_rate %[sc_http_req_rate(0)]
 http-request set-header X-HaProxy-conn_cur      %[sc_conn_cur(0)]
 http-request set-header X-HaProxy-conn_rate     %[sc_conn_rate(0)]

 ...
 server localtest 192.168.1.130:80 check

backend sticktable_st_src_rates
 stick-table type ip size 1m expire 10s store http_req_rate(10s),conn_cur,conn_rate(10s) 

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