Nginx 如何限制每個 IP 地址的連接數,優化資源分配?
Nginx 限制每個 IP 地址的連接數
Nginx 提供了多種機制來限制單個 IP 地址所能建立的同時連接數,這對于防止資源耗盡和提高服務穩定性至關重要。以下是幾種有效策略:
1. 使用 limit_conn 指令
limit_conn 指令可以在 server 或 location 塊中使用,用于限制針對特定 zone 的連接數量。zone 是一個內存結構,用來跟蹤 IP 的連接狀態。
# 針對客戶端地址,進行連接數限制
# 創建連接限制區域,每 IP 限 10M 字節內存
limit_conn_zone $binary_remote_addr zone=perip:10m;
# 針對域名,進行連接數限制
limit_conn_zone $server_name zone=perserver:10m;http {# 創建連接限制區域,每 IP 限 10M 字節內存limit_conn_zone $binary_remote_addr zone=perip:10m;
}server {# 每個 IP 同時允許的最大連接數為 10limit_conn perip 10;
}
這里的 $binary_remote_addr
變量包含了客戶端 IP 的二進制形式,確保即便在存在 NAT 的情況下也能準確識別每個獨立的 IP。
2. 結合?proxy_pass
?實現負載均衡下的連接限制
當 Nginx 作為反向代理時,也可以在 location 塊中使用 limit_conn
控制對上游服務器的連接數:
location / {# 每個 IP 對 / 位置的請求同時不超過 5 個limit_conn perip 5;proxy_pass http://upstream_server;
}
3. 利用?limit_req
?控制請求速率
除了限制連接數,還可以限制 IP 的請求速率,從而間接控制連接數:
http {# 創建速率限制區域limit_req_zone $binary_remote_addr zone=mylead:10m rate=1r/s; # 每秒限速 1 次
}server {# 應用速率限制location / {limit_req zone=mylead burst=5 nodelay;}
}
這里,burst
參數指定了短時間內允許的額外請求數量,nodelay
表示一旦超過速率限制,立即拒絕額外請求。
4. 動態黑白 IP 名單管理
除了靜態限制外,還可以根據訪問模式動態調整限制:
geo $my_ip {default 1; # 默認允許192.168.1.1 0; # 特定 IP 禁止
}server {if ($my_ip == 0) {return 444; # 禁止黑名單 IP 的所有請求}
}
這種方式可以根據實際需求靈活增刪黑名單條目,適用于應對突發攻擊的情況。
總結
通常推薦結合多種策略,比如首先用 limit_conn
控制總體連接數,再用 limit_req
限制請求速率,以及適時使用黑名單或地理限制,構建多層次防御體系,以優化資源分配并保護服務穩定性。
最后,記得監測 Nginx 的訪問日志,觀察連接數變化趨勢,適時調整參數,確保既能滿足正常服務需求又不浪費資源。
參考:Nginx核心配置指令_54笨鳥