超过响应缓冲区限制_Nginx如何限制并发连接数和连接请求数?
全網(wǎng)最全1500份Java學(xué)習(xí)資料、500份BAT面試真題:
? ?? ? ? ? ? ? ? ? ? ??關(guān)注公眾號,輸入“面試題”,獲取提取碼!
首先講解兩個算發(fā):
算法思想是:
令牌以固定速率產(chǎn)生,并緩存到令牌桶中;
令牌桶放滿時,多余的令牌被丟棄;
請求要消耗等比例的令牌才能被處理;
令牌不夠時,請求被緩存。
--------------------------------------------------------------------------------------------------------------------------------------
漏桶算法:
算法思想是:
水(請求)從上方倒入水桶,從水桶下方流出(被處理);
來不及流出的水存在水桶中(緩沖),以固定速率流出;
水桶滿后水溢出(丟棄)。
這個算法的核心是:緩存請求、勻速處理、多余的請求直接丟棄。
相比漏桶算法,令牌桶算法不同之處在于它不但有一只“桶”,還有個隊(duì)列,這個桶是用來存放令牌的,隊(duì)列才是用來存放請求的。
從作用上來說,漏桶和令牌桶算法最明顯的區(qū)別就是是否允許突發(fā)流量(burst)的處理,漏桶算法能夠強(qiáng)行限制數(shù)據(jù)的實(shí)時傳輸(處理)速率,對突發(fā)流量不做額外處理;而令牌桶算法能夠在限制數(shù)據(jù)的平均傳輸速率的同時允許某種程度的突發(fā)傳輸。
Nginx按請求速率限速模塊使用的是漏桶算法,即能夠強(qiáng)行保證請求的實(shí)時處理速度不會超過設(shè)置的閾值。
------------------------------------------------------------------------------------------------------------------------------------
官方限制ip并發(fā)連接和請求有兩個模塊,不需要重新編譯安裝,nginx默認(rèn)已經(jīng)集成。
limit_req_zone? : 限制請求數(shù)
limit_conn_zone ??:限制并發(fā)連接數(shù)
limit_req_zone??參數(shù)配置limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;參數(shù)講解:
$binary_remote_addr:遠(yuǎn)程的訪問地址,此處以二進(jìn)制的形式記錄
zone:=one:10m :設(shè)置一個名字為one,大小為10M的緩存空間
rate=10r/s: 限制訪問速率,此處設(shè)置為每秒接受10個請求(nging里是按ms及時的,此處為s)
limit_req zone=one burst=5 nodelay;參數(shù)講解:
zone=one:指定使用名字為one的這個緩存空間,若沒有設(shè)置burst參數(shù),結(jié)合上文,此處的配置表示為每秒接受請求10個
burst=5:因?yàn)槲覀兊牧髁坎⒉皇窍蚵┩耙粯用繒r每刻都是勻速的,所以為了避免某一時刻出現(xiàn)大規(guī)模的流量出現(xiàn),所以我們添加burst參數(shù),此處配置表示為,設(shè)置一個大小為5的緩沖區(qū),當(dāng)有大量請求(爆發(fā))過來時,訪問超過了上面的限制可以先放到緩沖區(qū)內(nèi)。
nodelay:一般是和burst一起使用的,如果設(shè)置了nodelay,當(dāng)訪問超過了頻次而且緩沖區(qū)也滿的情況下會直接返回503,如果設(shè)置了,則所有大的請求會等待排隊(duì)。
limit_conn_log_level error; #定義當(dāng)服務(wù)器由于limint被限制或緩存時,配置寫入日志。延遲的記錄比拒絕的記錄低一個級別。例子:limit_req_log_level notice延遲的的基本是info。limit_conn_status 589; #當(dāng)客戶端配置得并發(fā)數(shù)超過了nginx限制的數(shù)量后會返回的狀態(tài)值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; #限制每個用戶連接到服務(wù)器的數(shù)量 limit_conn perserver 2000;#限制連接到服務(wù)器的總數(shù) 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; }}總結(jié)與心得:
1.在設(shè)置完上面的參數(shù)后,使用jmeter進(jìn)行壓測時會發(fā)現(xiàn),neginx的日志顯示沒秒的請求數(shù)永遠(yuǎn)是20(前段設(shè)置的rate是每秒處理20個),發(fā)現(xiàn)burst的參數(shù)并沒有起作用,后來我把burst參數(shù)設(shè)置為2000,發(fā)現(xiàn)前幾秒tps可以達(dá)到四五百,但是后面依舊恢復(fù)到20.并不向我想的一樣,會一直超過20個tps運(yùn)行先去,所以這個burst的時間也是有限制的, 并不是大流量下一直有用,所以在生產(chǎn)配置的時候一定要想好rate的參數(shù)值,因?yàn)閎urst只適用突發(fā)的以小段時間。
2.第二次我啟用了兩個客戶端去壓測,發(fā)現(xiàn)nginx的tps的值達(dá)到了40,因此得出結(jié)論,此處限制只是針對單個ip,并不是全局配置。兩個客戶端的壓測時間我故意間隔了幾分鐘,發(fā)現(xiàn)出現(xiàn)了兩次四五百的tps,后面一樣回歸到40tps不變。因此burst也是針對ip有限制的。
3,使用了ab進(jìn)行壓測,ab -n 40 -c 20 http://IP/index.html ?? 發(fā)現(xiàn)我rate設(shè)置的值不管是多少永遠(yuǎn)只有一個是失敗的,貌似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·
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的超过响应缓冲区限制_Nginx如何限制并发连接数和连接请求数?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 比亚迪跑滴滴影响终身质保吗?
- 下一篇: 车子抛光后有螺旋纹为什么当时看不出来?