高併發場景下,Nginx 如何限流應對併發?
在很多大流量高併發的場景,如果用戶併發量很高就會出現宕機的局面,所以這個時候都會涉及到限流 @mikechen
高併發限流
限流是一種流量控制機制,用於限制客戶端對服務器的請求速率、或併發連接數。
通過限流,可以保護服務器免受過多請求的影響,防止因請求過載而導致系統性能下降、或崩潰。
限流能過濾掉惡意請求、和非正常流量,防止瞬時流量激增對後端應用或數據庫造成衝擊,確保系統整體穩定性。
比如:防止拒絕服務攻擊(DoS)限流機制,可以有效緩解 DoS 攻擊和暴力破解嘗試,在攻擊初期就控制請求量,爲運維提供響應時間和緩解措施。
Nginx 限流
Nginx 限流指的是利用 Nginx 自身提供的模塊,對進入服務的請求進行速率控制,從而防止流量激增時服務被壓垮。
通過限流機制,Nginx 可以對某個 IP、接口或用戶維度的訪問頻率進行限制,從而防止服務過載、惡意攻擊或資源濫用。
主要有兩個核心模塊:
limit_req
基於請求速率的限流模塊,通過設置請求的單位時間內允許的最大請求數來平滑流量。
ngx_http_limit_req_module
:限制請求速率(QPS)。
limit_conn
限制單個客戶端或連接的同時併發數,防止單個用戶消耗過多資源。
ngx_http_limit_conn_module
:限制併發連接數。
Nginx 限流原理
Nginx 的限流:主要依賴於令牌桶算法(Token Bucket)。
如下圖所示:
+--------------+
| 令牌桶 | <--- 定時添加令牌
+--------------+
|
請求到達 → 判斷令牌:有令牌則通過,無令牌則拒絕(或延時)
該算法工作的基本思路如下:
-
令牌生成系統以固定速率在一個 “令牌桶” 中不斷添加令牌,令牌桶有一個上限容量。
-
令牌消耗當有請求到來時,需要從令牌桶中取走一個或多個令牌才能被允許執行。如果令牌不夠,則請求會被拒絕或延時處理。
-
允許突發配置中可以設置一個突發(burst)值,這樣在短時間內允許超過限速的請求積攢一定額度,適應瞬時流量波動。
通過這樣的機制,Nginx 能夠對請求進行即時判斷,從而實現 “速率平滑” 的效果,在整個流量峯值期間保護後端服務的穩定性。
Nginx 限流配置
http {
# 定義限流區域
limit_req_zone $binary_remote_addr zone=req_limit_per_ip:10m rate=5r/s;
server {
location /api/ {
# 應用限流規則
limit_req zone=req_limit_per_ip burst=10 nodelay;
proxy_pass http://backend_api;
}
}
}
適用於:防止單個 IP 在短時間內頻繁請求 API 接口。
基於併發連接數的限流配置,假設我們要限制每個 IP 最多建立 10 個併發連接。
如下所示:
http {
# 定義連接限制區域,基於客戶端 IP,分配 10MB 內存
limit_conn_zone $binary_remote_addr zone=conn_limit:10m;
server {
listen 80;
server_name example.com;
location / {
# 限制每個 IP 的最大併發連接數爲 10
limit_conn zone=conn_limit 10;
root /var/www/html;
index index.html;
}
}
}
limit_conn_zone:定義連接限制區域。
limit_conn:設置每個 IP 的最大併發連接數爲 10,超出限制的請求將被拒絕。
總之,Nginx 限流是一種高效的流量管理手段,能夠幫助開發者應對高併發、惡意攻擊和資源濫用等問題。
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/8ubKqfNwdudoEgYpAYmo8A