# 怎么設置Nginx限流
## 1. 什么是Nginx限流?
Nginx限流(Rate Limiting)是一種通過控制客戶端請求速率來保護服務器資源的技術。它可以防止惡意攻擊(如DDoS)、突發流量導致的服務器過載,以及確保公平的資源分配。Nginx提供了多種模塊來實現限流功能,其中最常用的是`ngx_http_limit_req_module`(限制請求速率)和`ngx_http_limit_conn_module`(限制并發連接數)。
---
## 2. 為什么需要Nginx限流?
- **防止資源耗盡**:避免單個IP或用戶占用過多服務器資源。
- **防御DDoS攻擊**:限制惡意流量的請求速率。
- **提升服務穩定性**:平滑突發流量,避免服務器崩潰。
- **API保護**:防止API被濫用或過度調用。
---
## 3. Nginx限流的核心模塊
### 3.1 `ngx_http_limit_req_module`(請求速率限制)
基于漏桶算法(Leaky Bucket)限制客戶端請求的速率。
### 3.2 `ngx_http_limit_conn_module`(并發連接數限制)
限制同一時間來自單個IP的并發連接數。
---
## 4. 配置Nginx限流
### 4.1 請求速率限制(`limit_req`)
#### 步驟1:定義限流規則
在`http`塊中定義一個共享內存區域(zone):
```nginx
http {
limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s;
}
$binary_remote_addr
:以客戶端IP作為限流鍵。zone=req_limit:10m
:分配10MB內存存儲限流狀態。rate=10r/s
:允許每秒10個請求。在server
或location
塊中啟用限流:
server {
location /api/ {
limit_req zone=req_limit burst=20 nodelay;
proxy_pass http://backend;
}
}
burst=20
:允許突發20個請求(超出速率的請求會排隊)。nodelay
:立即處理突發請求,不延遲。limit_req_status 429; # 默認是503
limit_conn
)http {
limit_conn_zone $binary_remote_addr zone=conn_limit:10m;
}
server {
location /download/ {
limit_conn conn_limit 5; # 每個IP最多5個并發連接
}
}
可以組合多個限流規則,例如:
location /critical/ {
limit_req zone=req_limit burst=5;
limit_conn conn_limit 2;
}
通過map
模塊排除特定IP:
http {
map $remote_addr $limit {
192.168.1.1 "";
default $binary_remote_addr;
}
limit_req_zone $limit zone=req_limit:10m rate=5r/s;
}
結合GeoIP模塊:
geo $limited_country {
default 0;
CN 1;
}
limit_req_zone $binary_remote_addr zone=china_limit:10m rate=2r/s;
server {
if ($limited_country) {
limit_req zone=china_limit;
}
}
ab -n 100 -c 10 http://yourdomain.com/api/
wrk -t4 -c100 -d10s http://yourdomain.com/api/
查看被限流的請求是否返回429
或503
狀態碼。
burst
和rate
參數,或設置白名單。zone
內存大?。ㄈ?code>10m→5m
)。X-Forwarded-For
或使用更復雜的限流鍵(如用戶ID)。Nginx限流是保護服務器資源的重要手段,通過合理配置limit_req
和limit_conn
模塊,可以有效控制請求速率和并發連接數。實際應用中需根據業務場景調整參數,并通過監控持續優化。
提示:生產環境建議先在小范圍測試限流規則,避免誤傷正常流量。 “`
(全文約1000字)
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。