您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“Nginx怎么實現限流”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“Nginx怎么實現限流”這篇文章吧。
Nginx
為我們提供了請求限制模塊(ngx_http_limit_req_module
)、基于令牌桶算法的流量限制模塊(ngx_stream_limit_conn_module
),可以方便的控制令牌速率,自定義調節限流,實現基本的限流控制…
請求限制的功能來自于 ngx_http_limit_req_module
模塊。使用它需要首先在 http 配置段中定義限制的參照標準和狀態緩存區大小。
limit_req_zone
只能配置在 http
范圍內;
$binary_remote_addr
表示客戶端請求的IP地址;
mylimit
自己定義的變量名;
rate
請求頻率,每秒允許多少請求;
limit_req
與 limit_req_zone
對應,burst
表示緩存住的請求數,也就是任務隊列。
下面的配置就是定義了使用客戶端的 IP 作為參照依據,并使用一個 10M 大小的狀態緩存區。結尾的 rate=1r/s 表示針對每個 IP 的請求每秒只接受一次。
10M 的狀態緩存空間夠不夠用呢?官方給出的答案是 1M 的緩存空間可以在 32 位的系統中服務 3.2 萬 IP 地址,在 64 位的系統中可以服務 1.6 萬 IP 地址,所以需要自己看情況調整。如果狀態緩存耗光,后面所有的請求都會收到 503(Service Temporarily Unavailable) 錯誤。
腳本代碼
# 定義了一個 mylimit 緩沖區(容器),請求頻率為每秒 1 個請求(nr/s) limit_req_zone $binary_remote_addr zone=mylimit:10m rate=1r/s; server { listen 70; location / { # nodelay 不延遲處理 # burst 是配置超額處理,可簡單理解為隊列機制 # 上面配置同一個 IP 沒秒只能發送一次請求(1r/s),這里配置了緩存3個請求,就意味著同一秒內只能允許 4 個任務響應成功,其它任務請求則失敗(503錯誤) limit_req zone=mylimit burst=3 nodelay; proxy_pass http://localhost:7070; } }測試代碼
為了方便此處提供 JAVA、AB
兩種測試代碼..
# -n 即指定壓力測試總共的執行次數 # -c 即指定的并發數 ab -n 5 -c 5 http://192.168.0.133:70/index
package com.battcn.limiting; import org.springframework.http.ResponseEntity; import org.springframework.web.client.RestTemplate; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * @author Levin * @since 2018/7/27 0027 */ public class NginxLimiterTest { public static void main(String[] args) throws ExecutionException, InterruptedException { ExecutorService service = Executors.newFixedThreadPool(5); for (int i = 0; i < 6; i++) { CompletableFuture.supplyAsync(() -> { final ResponseEntity<String> entity = new RestTemplate().getForEntity("http://192.168.0.133:70/index", String.class); return entity.getBody(); }, service).thenAccept(System.out::println); } service.shutdown(); } }
測試日志
此處提供 AB 測試結果 JAVA 的日志就不貼了,5個請求其中一個請求是有問題的,出問題的那個就是被拒絕請求的…
[root@localhost myconf]# ab -n 5 -c 5 http://192.168.0.133:70/index Document Path: /index Document Length: 34 bytes Concurrency Level: 5 Time taken for tests: 0.002 seconds Complete requests: 5 Failed requests: 1 (Connect: 0, Receive: 0, Length: 1, Exceptions: 0)
Nginx 并發限制的功能來自于 ngx_http_limit_conn_module
模塊,跟請求配置一樣,使用它之前,需要先定義參照標準和狀態緩存區。
limit_conn_zone
只能配置在 http
范圍內;
$binary_remote_addr
表示客戶端請求的IP地址;
myconn
自己定義的變量名(緩沖區);
limit_rate
限制傳輸速度
limit_conn
與 limit_conn_zone
對應,限制網絡連接數
下面的配置就是定義了使用客戶端的 IP 作為參照依據,并使用一個 10M 大小的狀態緩存區。限定了每個IP只允許建立一個請求連接,同時傳輸的速度最大為 1024KB
腳本代碼
# 定義了一個 myconn 緩沖區(容器) limit_conn_zone $binary_remote_addr zone=myconn:10m; server { listen 70; location / { # 每個 IP 只允許一個連接 limit_conn myconn 1; # 限制傳輸速度(如果有N個并發連接,則是 N * limit_rate) limit_rate 1024k; proxy_pass http://localhost:7070; } }
以上是“Nginx怎么實現限流”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。