引言
在高流量場景下,良好的限流和連接控制策略至關重要,以防止服務器過載,確保服務穩定性和高可用性。Nginx 提供了 limit_req 和 limit_conn 模塊,用以實現請求頻率和并發連接數的限制。本文將詳細介紹這兩個模塊的生效階段和生效范圍,并提供實際配置示例,解釋相關指令的作用。
limit_req模塊
功能介紹
limit_req 模塊用于限制客戶端請求的頻率,以防止單一客戶端占用過多服務器資源,提升穩定性。
生效階段
limit_req 在請求處理的“訪問階段(access phase)”生效。它在接收到完整的 HTTP 請求后,即將轉發到后端之前進行限流。
生效范圍
- http:全局范圍,作用于所有 server 和 location。
- server:作用于特定 server block 內的所有 location。
- location:作用于特定 URL 路徑的 location。
配置示例和注釋
http {# 定義一個共享內存區域,用于存儲請求狀態# $binary_remote_addr 是客戶端的 IP 地址# zone=one:10m 定義名為 "one" 的共享內存區域,大小為 10MB# rate=1r/s 限制請求速率為每秒 1 個請求limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;server {listen 80;server_name example.com;location /api/ {# 應用請求頻率限制配置# zone=one 引用名為 "one" 的共享內存區域# burst=5 允許短時間內突發最多 5 個請求# nodelay 如果設置該參數,突發請求也會立即執行limit_req zone=one burst=5 nodelay;# 代理到后端服務proxy_pass http://backend_service;}}
}
參數解析
- limit_req_zone:聲明一個限制請求的共享內存區域。
- limit_req:在指定的區域內啟用請求頻率限制。
- burst:允許的突發請求數量。
- nodelay:不延遲處理突發請求。
limit_conn模塊
功能介紹
limit_conn 模塊用于限制每個客戶端的并發連接數,以防止資源被單一客戶端耗盡。
生效階段
limit_conn 在連接處理的“訪問階段(access phase)”生效。當服務器建立新連接時,立即根據配置進行并發連接限制。
生效范圍
- http:全局范圍,作用于所有 server 和 location。
- server:作用于特定 server block 內的所有 location。
- location:作用于特定 URL 路徑的 location。
配置示例和注釋
http {# 定義一個共享內存區域,用于存儲連接狀態# $binary_remote_addr 是客戶端的 IP 地址# zone=addr:10m 定義名為 "addr" 的共享內存區域,大小為 10MBlimit_conn_zone $binary_remote_addr zone=addr:10m;server {listen 80;server_name example.com;location /api/ {# 應用并發連接限制配置# addr 引用名為 "addr" 的共享內存區域# 10 限制每個客戶端最多允許 10 個并發連接limit_conn addr 10;# 代理到后端服務proxy_pass http://backend_service;}}
}
參數解析
- limit_conn_zone:聲明一個限制連接數的共享內存區域。
- limit_conn:在指定的區域內啟用連接數限制。
日志和狀態設置
limit_conn_log_level
limit_conn_log_level 用于設置當連接被限制時的日志記錄級別。
可選值
- info:基本信息記錄。
- notice:詳細信息記錄。
- warn:警告信息記錄(推薦)。
- error:錯誤信息記錄。
limit_conn_status
limit_conn_status 用于設置當連接被限制時返回的 HTTP 狀態碼。
常用狀態碼
- 503:服務不可用(推薦)。
- 其他自定義狀態碼:根據具體需求設置。
完整配置示例和注釋
http {# 為 limit_req 和 limit_conn 定義共享內存區域limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;limit_conn_zone $binary_remote_addr zone=addr:10m;# 設置限制被觸發時的日志級別和返回狀態碼limit_conn_log_level warn;limit_conn_status 503;server {listen 80;server_name example.com;location /api/ {# 應用請求頻率限制配置limit_req zone=one burst=5 nodelay;# 應用并發連接限制配置limit_conn addr 10;# 代理到后端服務proxy_pass http://backend_service;}}
}
解析與說明
- limit_req_zone 和 limit_conn_zone:分別定義請求和連接限制的共享內存區域。
- limit_req 和 limit_conn:在指定的區域內啟用請求頻率和連接數限制。
- limit_conn_log_level 和 limit_conn_status:分別設置連接限制觸發時的日志級別和返回狀態碼。
結論
通過 Nginx 的 limit_req 和 limit_conn 模塊,可以有效實現精確的請求頻率和連接數控制。這不僅可以防止惡意請求和流量激增對服務器的沖擊,還能提高服務的穩定性和可用性。結合日志級別和狀態碼設置,可以輕松監控和管理限流情況。
希望這篇博客能夠幫助你更好地理解和應用 Nginx 的限流功能,提高配置能力。