Nginx中l(wèi)imit_req模塊和limit_conn模塊的使用
引言
在高流量場景下,良好的限流和連接控制策略至關(guān)重要,以防止服務(wù)器過載,確保服務(wù)穩(wěn)定性和高可用性。Nginx 提供了 limit_req 和 limit_conn 模塊,用以實現(xiàn)請求頻率和并發(fā)連接數(shù)的限制。本文將詳細介紹這兩個模塊的生效階段和生效范圍,并提供實際配置示例,解釋相關(guān)指令的作用。
limit_req模塊
功能介紹
limit_req 模塊用于限制客戶端請求的頻率,以防止單一客戶端占用過多服務(wù)器資源,提升穩(wěn)定性。
生效階段
limit_req 在請求處理的“訪問階段(access phase)”生效。它在接收到完整的 HTTP 請求后,即將轉(zhuǎn)發(fā)到后端之前進行限流。
生效范圍
- http:全局范圍,作用于所有 server 和 location。
- server:作用于特定 server block 內(nèi)的所有 location。
- location:作用于特定 URL 路徑的 location。
配置示例和注釋
http { # 定義一個共享內(nèi)存區(qū)域,用于存儲請求狀態(tài) # $binary_remote_addr 是客戶端的 IP 地址 # zone=one:10m 定義名為 "one" 的共享內(nèi)存區(qū)域,大小為 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/ { # 應(yīng)用請求頻率限制配置 # zone=one 引用名為 "one" 的共享內(nèi)存區(qū)域 # burst=5 允許短時間內(nèi)突發(fā)最多 5 個請求 # nodelay 如果設(shè)置該參數(shù),突發(fā)請求也會立即執(zhí)行 limit_req zone=one burst=5 nodelay; # 代理到后端服務(wù) proxy_pass http://backend_service; } } }
參數(shù)解析
- limit_req_zone:聲明一個限制請求的共享內(nèi)存區(qū)域。
- limit_req:在指定的區(qū)域內(nèi)啟用請求頻率限制。
- burst:允許的突發(fā)請求數(shù)量。
- nodelay:不延遲處理突發(fā)請求。
limit_conn模塊
功能介紹
limit_conn 模塊用于限制每個客戶端的并發(fā)連接數(shù),以防止資源被單一客戶端耗盡。
生效階段
limit_conn 在連接處理的“訪問階段(access phase)”生效。當(dāng)服務(wù)器建立新連接時,立即根據(jù)配置進行并發(fā)連接限制。
生效范圍
- http:全局范圍,作用于所有 server 和 location。
- server:作用于特定 server block 內(nèi)的所有 location。
- location:作用于特定 URL 路徑的 location。
配置示例和注釋
http { # 定義一個共享內(nèi)存區(qū)域,用于存儲連接狀態(tài) # $binary_remote_addr 是客戶端的 IP 地址 # zone=addr:10m 定義名為 "addr" 的共享內(nèi)存區(qū)域,大小為 10MB limit_conn_zone $binary_remote_addr zone=addr:10m; server { listen 80; server_name example.com; location /api/ { # 應(yīng)用并發(fā)連接限制配置 # addr 引用名為 "addr" 的共享內(nèi)存區(qū)域 # 10 限制每個客戶端最多允許 10 個并發(fā)連接 limit_conn addr 10; # 代理到后端服務(wù) proxy_pass http://backend_service; } } }
參數(shù)解析
- limit_conn_zone:聲明一個限制連接數(shù)的共享內(nèi)存區(qū)域。
- limit_conn:在指定的區(qū)域內(nèi)啟用連接數(shù)限制。
日志和狀態(tài)設(shè)置
limit_conn_log_level
limit_conn_log_level 用于設(shè)置當(dāng)連接被限制時的日志記錄級別。
可選值
- info:基本信息記錄。
- notice:詳細信息記錄。
- warn:警告信息記錄(推薦)。
- error:錯誤信息記錄。
limit_conn_status
limit_conn_status 用于設(shè)置當(dāng)連接被限制時返回的 HTTP 狀態(tài)碼。
常用狀態(tài)碼
- 503:服務(wù)不可用(推薦)。
- 其他自定義狀態(tài)碼:根據(jù)具體需求設(shè)置。
完整配置示例和注釋
http { # 為 limit_req 和 limit_conn 定義共享內(nèi)存區(qū)域 limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s; limit_conn_zone $binary_remote_addr zone=addr:10m; # 設(shè)置限制被觸發(fā)時的日志級別和返回狀態(tài)碼 limit_conn_log_level warn; limit_conn_status 503; server { listen 80; server_name example.com; location /api/ { # 應(yīng)用請求頻率限制配置 limit_req zone=one burst=5 nodelay; # 應(yīng)用并發(fā)連接限制配置 limit_conn addr 10; # 代理到后端服務(wù) proxy_pass http://backend_service; } } }
解析與說明
- limit_req_zone 和 limit_conn_zone:分別定義請求和連接限制的共享內(nèi)存區(qū)域。
- limit_req 和 limit_conn:在指定的區(qū)域內(nèi)啟用請求頻率和連接數(shù)限制。
- limit_conn_log_level 和 limit_conn_status:分別設(shè)置連接限制觸發(fā)時的日志級別和返回狀態(tài)碼。
結(jié)論
通過 Nginx 的 limit_req 和 limit_conn 模塊,可以有效實現(xiàn)精確的請求頻率和連接數(shù)控制。這不僅可以防止惡意請求和流量激增對服務(wù)器的沖擊,還能提高服務(wù)的穩(wěn)定性和可用性。結(jié)合日志級別和狀態(tài)碼設(shè)置,可以輕松監(jiān)控和管理限流情況。
到此這篇關(guān)于Nginx中l(wèi)imit_req模塊和limit_conn模塊的使用與區(qū)別的文章就介紹到這了,更多相關(guān)Nginx limit_req和limit_conn內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
nginx實現(xiàn)一個域名配置多個laravel項目的方法示例
這篇文章主要介紹了nginx實現(xiàn)一個域名配置多個laravel項目的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-01-01Nginx配置實現(xiàn)高效精準(zhǔn)的流量限制策略詳解
限流(Rate?Limitting)是服務(wù)降級的一種方式,通過限制系統(tǒng)的輸入和輸出流量以達到保護系統(tǒng)的目的,下面我們就來看看如何通過配置Nginx實現(xiàn)高效精準(zhǔn)的流量限制策略吧2024-02-02Nginx下實現(xiàn)pathinfo及ThinkPHP的URL模式
本篇文章主要介紹了Nginx下實現(xiàn)pathinfo及ThinkPHP的URL模式。小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-05-05Nginx index指令使用及設(shè)置網(wǎng)站默認首頁
index指令用于指定處理請求時使用的默認文件,本文主要介紹了Nginx index指令使用及設(shè)置網(wǎng)站默認首頁,具有一定的參考價值,感興趣的可以了解一下2024-07-07