<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Nginx請求訪問控制是怎樣實(shí)現(xiàn)的

          共 2625字,需瀏覽 6分鐘

           ·

          2024-05-20 21:41

          目錄

          • 漏桶算法(Leaky Bucket):

          • 令牌桶算法(Token Bucket):

          • ngx_http_limit_req_module(限制請求) 配置實(shí)例

          • ngx_http_limit_conn_module(限制連接數(shù)) 配置實(shí)例

           


          首先來看下什么是漏桶算法和令牌桶算法
          Nginx并不直接實(shí)現(xiàn)漏桶算法或令牌桶算法,但這些算法在控制網(wǎng)絡(luò)流量和請求速率方面非常有用。這些算法通常在網(wǎng)絡(luò)編程、API服務(wù)、負(fù)載均衡等領(lǐng)域中使用,以確保系統(tǒng)的穩(wěn)定性和性能。

          回到頂部

          漏桶算法(Leaky Bucket)

          * 漏桶算法用于限制數(shù)據(jù)的傳輸速率。它可以將請求看作是水流,而漏桶的出水速度則是處理請求的速度。
          * 當(dāng)請求到達(dá)時(shí),它們被放入漏桶中。如果漏桶已滿(即已達(dá)到最大處理速率),則新的請求會被拒絕或丟棄。
          * 漏桶算法的一個(gè)缺點(diǎn)是它不能很好地處理突發(fā)流量。即使漏桶未滿,當(dāng)突發(fā)流量到達(dá)時(shí),它也會受到限制。

          回到頂部

          令牌桶算法(Token Bucket)

          * 令牌桶算法是另一種用于控制數(shù)據(jù)傳輸速率的算法。與漏桶算法不同,它允許一定程度的突發(fā)流量。
          * 令牌桶以恒定的速率產(chǎn)生令牌,并將它們放入桶中。當(dāng)請求到達(dá)時(shí),它們需要消耗桶中的令牌才能被處理。
          * 如果桶中有足夠的令牌,即使突發(fā)流量到達(dá),也可以被處理。然而,如果桶中沒有令牌,請求將被拒絕或放入隊(duì)列中等待。
          * 令牌桶算法的優(yōu)點(diǎn)是它可以更好地處理突發(fā)流量,同時(shí)仍然保持平均傳輸速率在所需范圍內(nèi)。

          在Nginx中,雖然沒有直接實(shí)現(xiàn)這些算法,但你可以通過配置Nginx的限流模塊(如ngx_http_limit_req_modulengx_http_limit_conn_module)來模擬這些算法的行為。這些模塊允許你根據(jù)請求的速率或并發(fā)連接數(shù)來限制請求

          例如,ngx_http_limit_req_module允許你設(shè)置請求的速率限制,并通過漏桶或令牌桶算法類似的方式來處理超出限制的請求。你可以指定一個(gè)“burst”值,該值表示在達(dá)到速率限制之前可以處理的額外請求數(shù)。這類似于令牌桶算法中的桶容量。

          回到頂部

          ngx_http_limit_req_module(限制請求) 配置實(shí)例

          ngx_http_limit_req_module 允許你限制特定區(qū)域的請求處理速率。這通常用于保護(hù)后端服務(wù)器免受過多的請求。

          以下是一個(gè)配置實(shí)例,其中限制了對 /api/ 路徑下資源的請求速率:

          http {
          # ... 其他配置 ...

          limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/s;

          server {
          # ... 其他配置 ...

          location /api/ {
          limit_req zone=mylimit burst=5 nodelay;

          # ... 其他location配置 ...

          proxy_pass http://backend_servers;
          }
          }
          }

          在這個(gè)配置中:

          • limit_req_zone 指令定義了一個(gè)名為 mylimit 的共享內(nèi)存區(qū)域,用于存儲請求的狀態(tài)。$binary_remote_addr 是用于區(qū)分請求的鍵(通常是客戶端IP地址的二進(jìn)制形式),zone=mylimit:10m 表示這個(gè)區(qū)域的大小是 10MB,rate=10r/s 表示每秒只允許 10 個(gè)請求。

          • limit_req 指令在 location 塊中用于應(yīng)用請求限制。zone=mylimit 引用之前定義的限制區(qū)域,burst=5 表示在達(dá)到速率限制后還可以再處理 5 個(gè)請求(這些請求會排隊(duì)等待),nodelay 表示如果請求超過了速率限制和突發(fā)限制,則立即返回 503 錯(cuò)誤,而不是等待。

          回到頂部

          ngx_http_limit_conn_module(限制連接數(shù)) 配置實(shí)例

          ngx_http_limit_conn_module 用于限制來自單個(gè) IP 地址的并發(fā)連接數(shù)。

          以下是一個(gè)配置實(shí)例,其中限制了對 / 路徑下資源的并發(fā)連接數(shù):

          http {
          # ... 其他配置 ...

          limit_conn_zone $binary_remote_addr zone=perip:10m;

          server {
          # ... 其他配置 ...

          location / {
          limit_conn perip 10;

          # ... 其他location配置 ...

          # 例如,代理到后端服務(wù)器
          proxy_pass http://backend_servers;
          }
          }
          }

          在這個(gè)配置中:

          • limit_conn_zone 指令定義了一個(gè)名為 perip 的共享內(nèi)存區(qū)域,用于存儲并發(fā)連接的狀態(tài)。$binary_remote_addr 是用于區(qū)分連接的鍵(通常是客戶端IP地址的二進(jìn)制形式),zone=perip:10m 表示這個(gè)區(qū)域的大小是 10MB。

          • limit_conn 指令在 location 塊中用于應(yīng)用并發(fā)連接限制。perip 10 表示每個(gè) IP 地址的并發(fā)連接數(shù)不能超過 10。

          這兩個(gè)模塊都提供了保護(hù) Nginx 服務(wù)器和后端服務(wù)器免受過多請求或連接的能力,從而提高系統(tǒng)的穩(wěn)定性和性能。

          鏈接:https://www.cnblogs.com/ydswin/p/18184839

          (版權(quán)歸原作者所有,侵刪)

          瀏覽 124
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  豆花一区在线视频观看 | 最新高清无码免费专区 | 欧美国产成人精品一区二区三区 | www.大香蕉在线 | 2019年天天夜夜 |