超過響應緩沖區限制_Nginx如何限制并發連接數和連接請求數?

全網最全1500份Java學習資料、500份BAT面試真題:

? ?? ? ? ? ? ? ? ? ? ??關注公眾號,輸入“面試題”,獲取提取碼!

首先講解兩個算發:

35bd07bdd4f0cc4683ff212f2e15dfbf.png

算法思想是:

  • 令牌以固定速率產生,并緩存到令牌桶中;

  • 令牌桶放滿時,多余的令牌被丟棄;

  • 請求要消耗等比例的令牌才能被處理;

  • 令牌不夠時,請求被緩存。

--------------------------------------------------------------------------------------------------------------------------------------

漏桶算法:

a173d26b28feb93eb556a99c0048fc9c.png

算法思想是:

  • 水(請求)從上方倒入水桶,從水桶下方流出(被處理);

  • 來不及流出的水存在水桶中(緩沖),以固定速率流出;

  • 水桶滿后水溢出(丟棄)。

  • 這個算法的核心是:緩存請求、勻速處理、多余的請求直接丟棄。
    相比漏桶算法,令牌桶算法不同之處在于它不但有一只“桶”,還有個隊列,這個桶是用來存放令牌的,隊列才是用來存放請求的。

從作用上來說,漏桶和令牌桶算法最明顯的區別就是是否允許突發流量(burst)的處理,漏桶算法能夠強行限制數據的實時傳輸(處理)速率,對突發流量不做額外處理;而令牌桶算法能夠在限制數據的平均傳輸速率的同時允許某種程度的突發傳輸。

Nginx按請求速率限速模塊使用的是漏桶算法,即能夠強行保證請求的實時處理速度不會超過設置的閾值。

------------------------------------------------------------------------------------------------------------------------------------

官方限制ip并發連接和請求有兩個模塊,不需要重新編譯安裝,nginx默認已經集成。

limit_req_zone? : 限制請求數

limit_conn_zone ??:限制并發連接數

limit_req_zone??參數配置limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;

參數講解:

$binary_remote_addr:遠程的訪問地址,此處以二進制的形式記錄

zone:=one:10m :設置一個名字為one,大小為10M的緩存空間

rate=10r/s: 限制訪問速率,此處設置為每秒接受10個請求(nging里是按ms及時的,此處為s)

limit_req zone=one burst=5 nodelay;

參數講解:

zone=one:指定使用名字為one的這個緩存空間,若沒有設置burst參數,結合上文,此處的配置表示為每秒接受請求10個

burst=5:因為我們的流量并不是向漏桶一樣每時每刻都是勻速的,所以為了避免某一時刻出現大規模的流量出現,所以我們添加burst參數,此處配置表示為,設置一個大小為5的緩沖區,當有大量請求(爆發)過來時,訪問超過了上面的限制可以先放到緩沖區內。

nodelay:一般是和burst一起使用的,如果設置了nodelay,當訪問超過了頻次而且緩沖區也滿的情況下會直接返回503,如果設置了,則所有大的請求會等待排隊。

limit_conn_log_level error;  #定義當服務器由于limint被限制或緩存時,配置寫入日志。延遲的記錄比拒絕的記錄低一個級別。例子:limit_req_log_level notice延遲的的基本是info。limit_conn_status 589;  #當客戶端配置得并發數超過了nginx限制的數量后會返回的狀態值limit_conn_zone $binary_remote_addr zone=one:10m;limit_conn_zone $server_name zone=perserver:10m;limit_req_zone $binary_remote_addr zone=allips:100m rate=20r/s;server {        listen   8888;        access_log  /var/log/nginx/example_http.log;        location /status {                stub_status on;                access_log off;                allow 127.0.0.1;                allow 10.0.17.27;                allow 10.0.1.142;                deny all;        }        location / {        limit_conn one 5;  #限制每個用戶連接到服務器的數量        limit_conn perserver 2000;#限制連接到服務器的總數        limit_req zone=allips burst=200 nodelay;                proxy_http_version 1.1;                proxy_set_header Connection "";                proxy_pass http://test;                #Proxy Settings                proxy_redirect     off;                proxy_set_header   Host             $host;                proxy_set_header   X-Real-IP        $remote_addr;                #proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;                proxy_set_header   X-Forwarded-For  $http_x_forwarded_for;                proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;                proxy_ignore_client_abort  on;                proxy_max_temp_file_size 0;                proxy_connect_timeout      90;                proxy_send_timeout         90;                proxy_read_timeout         90;                proxy_buffer_size          4k;                proxy_buffers              4 32k;                proxy_busy_buffers_size    64k;                proxy_temp_file_write_size 64k;        }}

總結與心得:

1.在設置完上面的參數后,使用jmeter進行壓測時會發現,neginx的日志顯示沒秒的請求數永遠是20(前段設置的rate是每秒處理20個),發現burst的參數并沒有起作用,后來我把burst參數設置為2000,發現前幾秒tps可以達到四五百,但是后面依舊恢復到20.并不向我想的一樣,會一直超過20個tps運行先去,所以這個burst的時間也是有限制的, 并不是大流量下一直有用,所以在生產配置的時候一定要想好rate的參數值,因為burst只適用突發的以小段時間。

2.第二次我啟用了兩個客戶端去壓測,發現nginx的tps的值達到了40,因此得出結論,此處限制只是針對單個ip,并不是全局配置。兩個客戶端的壓測時間我故意間隔了幾分鐘,發現出現了兩次四五百的tps,后面一樣回歸到40tps不變。因此burst也是針對ip有限制的。

3,使用了ab進行壓測,ab -n 40 -c 20 http://IP/index.html ?? 發現我rate設置的值不管是多少永遠只有一個是失敗的,貌似rate沒有起作用,是一個大坑。

root@in-yeerqianghe:/# ab -n 50 -c 20 http://10.0.18.128/index.htmlThis is ApacheBench, Version 2.3 Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/Licensed to The Apache Software Foundation, http://www.apache.org/Benchmarking 10.0.18.128 (be patient).....doneServer Software:        nginx/1.12.2Server Hostname:        10.0.18.128Server Port:            80Document Path:          /index.htmlDocument Length:        14 bytesConcurrency Level:      20Time taken for tests:   0.006 secondsComplete requests:      50Failed requests:        49   (Connect: 0, Receive: 0, Length: 49, Exceptions: 0)Non-2xx responses:      49Total transferred:      36063 bytesHTML transferred:       26327 bytesRequests per second:    8579.27 [#/sec] (mean)Time per request:       2.331 [ms] (mean)Time per request:       0.117 [ms] (mean, across all concurrent requests)Transfer rate:          6042.86 [Kbytes/sec] receivedConnection Times (ms)              min  mean[+/-sd] median   maxConnect:        0    1   0.2      1       1Processing:     1    1   0.5      1       2Waiting:        1    1   0.5      1       2Total:          1    2   0.3      2       3Percentage of the requests served within a certain time (ms)  50%      2  66%      2  75%      2  80%      2  90%      3  95%      3  98%      3  99%      3 100%      3 (longest request)

·END·

2905961bf02fd14ce097b2825f6b1aa5.png

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/534831.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/534831.shtml
英文地址,請注明出處:http://en.pswp.cn/news/534831.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Php公鑰加密data是空,php 生成加密公鑰加密私鑰實例詳解

php 生成加密公鑰加密私鑰實例詳解生成公鑰私鑰 win下必須要openssl.cof支持 liunx一般已自帶安裝$config array(//"digest_alg" > "sha512","private_key_bits" > 512, //字節數 512 1024 2048 4096 等"private_key_type" >…

python句柄無效_subprocess.Popen 運行windows命令出現“句柄無效”報錯的解決方法

【代碼筆記】iOS-關于UIFont的一些define一,效果圖. 二,工程圖. 三,代碼. RootViewController.h #import interface RootViewController ...JQuery Datatables Dom 和 Language 參數詳細說明http://linleizi.iteye.com/blog/2086435 *********************************** Data …

java日期函數精確到日,java日期時間函數分享

前言:對于新手程序員的我來說,寫業務代碼是現在的日常,在此過程中經常需要對日期時間進行處理,我挑了幾個較有用的日期處理函數分享給大家。正文:1、將某格式的時間字符串轉化成毫秒時間戳表示的字符串:pub…

python變量區變量保存與加載_python – Flask:使用全局變量將數據文件加載到內存中...

我有一個大的XML文件,它被打開,加載到內存中,然后由Python類關閉.簡化示例如下所示:class Dictionary():def __init__(self,filename):f open(filename)self.contents f.readlines()f.close()def getDefinitionForWord(self,word):# returns a word,using etree p…

php 順豐接口實例,順豐BSP接口PHP開發注意事項

1&#xff0c;xml報文不用附加"<?xml version"1.0" encoding"UTF-8" ?>"&#xff0c;不支持&#xff0c;會報格式錯誤。2&#xff0c;提交服務器時要重點注意。直接使用curl方式的&#xff0c;一定要把數據做http_build_query&#xff0…

跨域產生的原因和解決方法_板式家具開料機加工過程產生崩邊原因及解決方法...

家具廠數控開料機加工材料的時候會遇到材料崩邊的問題&#xff0c;下面我們系統的分析下產生的原因以及解決的辦法產生崩邊現象的原因&#xff1f;其一是材料本身問題。目前除了實木家具&#xff0c;目前使用較多的就是 板式貼皮的材料&#xff0c;板材的優點就是標準化生產&am…

facade 門面 php,php設計模式之門面(Facade)模式

該模式屬于結構型模式什么是門面模式&#xff1f;定義&#xff1a;門面模式(有時候也稱為外觀模式)是指提供一個統一的接口去訪問多個子系統的多個不同的接口&#xff0c;它為子系統中的一組接口提供一個統一的高層接口。外部與子系統的通信是通過一個門面(Facade)對象進行。其…

架構師一般做到多少歲_《迷茫中的我們該如何突破瓶頸——成長為一名架構師》...

如何成長為一名架構師&#xff1f;架構師是一個既需要掌控整體又需要洞悉局部瓶頸并依據具體的業務場景給出解決方案的團隊領導型人物。一個架構師得需要足夠的想像力,能把各種目標需求進行不同維度的擴展&#xff0c;為目標客戶提供更為全面的需求清單。很多程序員想成為一名架…

php-fpm初始化失敗,FPM的初始化 - [ PHP7的內核剖析 ] - 在線原生手冊 - php中文網

FPM的初始化接下來看下fpm的啟動流程&#xff0c;從main()函數開始&#xff1a;//sapi/fpm/fpm/fpm_main.cint main(int argc, char *argv[]){... //注冊SAPI:將全局變量sapi_module設置為cgi_sapi_modulesapi_startup(&cgi_sapi_module);... //執行php_module_staru…

python 高級語言特性_Pytohon學習筆記(一)Python編程語言歷史及特性

Python編程語言歷史及特性編程語言:用戶:問題空間計算機: 解決問題解空間抽象機器代碼-->微碼編程-->高級語言shell編程:ptyhon控制語言:膠水語言適合領域:web,Django字節碼:bytecode面向過程:以指令為中心&#xff0c;由指令處理數據 如何組織代碼結局問題面向對象:以數…

php laravel 返回統一格式,封裝的統一的Laravel響應類,返回數據類

封裝的統一的Laravel返回數據類namespace App\Library;class Response{const OK 0;const BAD_REQUEST 1000;const PARAM_ERROR 1001;const SQL_ERROR 4000;const FORBIDDEN 4003;const SERVER_ERROR 5000;public static $errMsg [self::BAD_REQUEST > 請求錯誤,self:…

python3連接數據庫步驟_Python3連接Mysql8.0遇到的問題及處理步驟

最近在使用Python開發系統&#xff0c;需連接mysql數據庫&#xff0c;我用的是Python3連接MySQL8.0&#xff0c;其中老是報錯以下問題&#xff1a;網上給了各種各樣的方法&#xff0c;大多是通過各種方式修改密碼。最簡單的方法是更換了root密碼的認證方式解決的&#xff0c;新…

360手柄搖桿漂移修復_徹底解決你的Switch手柄搖桿問題,最省錢的完美修復。

我想很多Switch的消費者都遇到了一個問題&#xff0c;用久了之后的手柄失靈&#xff0c;移動不精準&#xff0c;卡頓&#xff0c;自動位移等現象。玩個游戲都非常的糟心。動一下搖桿角色都會自動移動...這些問題的出現主要原因是搖桿內部進了灰塵&#xff0c;才導致各種現象的出…

libzdb 連接mysql,數據庫連接池庫libzdb使用教程

Libzdb挺強大&#xff0c; 支持Mysql Oracle SQLite PostgreSQL&#xff0c;支持C和C Object C&#xff0c;不能在Window下用(看源碼是因為基于Linux線程機制編寫實現)。遺憾的是找個資料太費勁&#xff0c;只能到Libzdb官網&#xff1a;點此進入 &#xff0c;今正看著上面英文…

請給出計算231-1的python表達式_【填空題】計算2 32 -1的Python表達式可以書寫為____...

【填空題】計算2 32 -1的Python表達式可以書寫為____更多相關問題【判斷題】軍隊和國防建設指導思想實行戰略轉變的實質是:從立足于早打、大打、打核戰爭的臨戰準備狀況,轉到和平時期建設的軌道上來。【單選題】社會學家認為,一門專業必須具有專業特征,護理專業的特征是( )A. 滿…

數值分析方程求根實驗matlab,數值分析實驗之非線性方程求根(MATLAB實現)

一、實驗目的1&#xff0e; 了解一般非線性方程的求根是比較復雜的事情&#xff1a;要討論(或知道)它有無實根&#xff0c;有多少實根&#xff1b;知道求近似根常用的幾種方法&#xff0c;每種方法的特點是什么。2&#xff0e; 用通過二分法(區間半分法)、不動點(也Picard)迭代…

python多線程輸出_萌新python多線程

剛開始學習多線程的時候鬧了個笑話在使用python線程打印東西的時候發現自己定的的線程數據沒有打印,找半天都沒有找到問題,也沒好意思問,自己憋了半天才發現問題!代碼如下:import threadingdef SayHi():print(say hi !)def SeyHello():print(say hello !)print(start)threading…

php5.6擴展編寫,php 5.6版本中編寫一個PHP擴展的簡單示例

php 5.6版本中編寫一個PHP擴展的簡單示例這篇文章主要介紹了php 5.6版本中編寫一個PHP擴展的簡單示例,本文給出擴展實現代碼、編譯方法、配置方法和使用例子等內容,需要的朋友可以參考下有時候在php本身沒有滿足需求的api時候&#xff0c;需要自己寫相應的擴展&#xff0c;擴展…

iis php 數據庫亂碼,如何解決php插入數據亂碼問題

php插入數據亂碼的解決辦法&#xff1a;首先要設置數據表的字符集為utf8&#xff1b;然后修改字符集格式&#xff1b;接著建立字符集為utf-8的數據庫&#xff1b;最后通過php mysql語句插入數據即可。mysql數據庫亂碼問題解決辦法我們在使用數據庫(mysql)的時候最怕的就是數據庫…

python 文檔字符串_新款Python文檔字符串生成器來了

又一款懶人神器問世了&#xff1a;Visual Studio Code的擴展&#xff0c;基于CodeBERT的Python文檔字符串生成器。看來現在&#xff0c;這群偷「懶」的程序員們連文檔字符串都不想自己寫了。基于CodeBERT的生成器跟正常的DocStrings用法一樣&#xff0c;你只需要輸入三引號「“…