Nginx 長(zhǎng)連接keep_alive的具體使用
如何開啟并支持長(zhǎng)連接
當(dāng)使用nginx作為反向代理時(shí),為了支持長(zhǎng)連接,需要做到兩點(diǎn):
- 從client到nginx的連接是長(zhǎng)連接
- 從nginx到server的連接是長(zhǎng)連接
從HTTP協(xié)議的角度看,nginx在這個(gè)過(guò)程中,對(duì)于客戶端它扮演著HTTP服務(wù)器端的角色。而對(duì)于真正的服務(wù)器端(在nginx的術(shù)語(yǔ)中稱為upstream)nginx又扮演著HTTP客戶端的角色。
客戶端(Client)和 Nginx 保持長(zhǎng)連接,兩個(gè)要求:
- client發(fā)送的HTTP請(qǐng)求要求keep alive
- nginx設(shè)置上支持keep alive
一、客戶端 與 Nginx 長(zhǎng)連接配置
默認(rèn)情況下,nginx已經(jīng)自動(dòng)開啟了對(duì)client連接的keep alive支持。一般場(chǎng)景可以直接使用,但是對(duì)于一些比較特殊的場(chǎng)景,還是有必要調(diào)整個(gè)別參數(shù)。
keepalive_timeout 指令
keepalive_timeout指令的語(yǔ)法:
Syntax: keepalive_timeout timeout [header_timeout]; Default: keepalive_timeout 75s; Context: http, server, location
第一個(gè)參數(shù)設(shè)置keep-alive客戶端連接在服務(wù)器端保持開啟的超時(shí)值。值為0會(huì)禁用keep-alive客戶端連接。可選的第二個(gè)參數(shù)在響應(yīng)的header域中設(shè)置一個(gè)值“Keep-Alive: timeout=time”。這兩個(gè)參數(shù)可以不一樣。
注:默認(rèn)75s一般情況下也夠用,對(duì)于一些請(qǐng)求比較大的內(nèi)部服務(wù)器通訊的場(chǎng)景,適當(dāng)加大為120s或者300s。第二個(gè)參數(shù)通??梢圆挥迷O(shè)置。
keepalive_requests 指令
keepalive_requests指令用于設(shè)置一個(gè)keep-alive連接上可以服務(wù)的請(qǐng)求的最大數(shù)量。當(dāng)最大請(qǐng)求數(shù)量達(dá)到時(shí),連接被關(guān)閉。默認(rèn)是100。
這個(gè)參數(shù)的真實(shí)含義,是指一個(gè)keep alive建立之后,nginx就會(huì)為這個(gè)連接設(shè)置一個(gè)計(jì)數(shù)器,記錄這個(gè)keep alive的長(zhǎng)連接上已經(jīng)接收并處理的客戶端請(qǐng)求的數(shù)量。如果達(dá)到這個(gè)參數(shù)設(shè)置的最大值時(shí),則nginx會(huì)強(qiáng)行關(guān)閉這個(gè)長(zhǎng)連接,逼迫客戶端不得不重新建立新的長(zhǎng)連接。
這個(gè)參數(shù)往往被大多數(shù)人忽略,因?yàn)榇蠖鄶?shù)情況下當(dāng)QPS(每秒請(qǐng)求數(shù))不是很高時(shí),默認(rèn)值100湊合夠用。但是,對(duì)于一些QPS比較高(比如超過(guò)10000QPS,甚至達(dá)到30000,50000甚至更高) 的場(chǎng)景,默認(rèn)的100就顯得太低。
簡(jiǎn)單計(jì)算一下,QPS=10000時(shí),客戶端每秒發(fā)送10000個(gè)請(qǐng)求(通常建立有多個(gè)長(zhǎng)連接),每個(gè)連接只能最多跑100次請(qǐng)求,意味著平均每秒鐘就會(huì)有100個(gè)長(zhǎng)連接因此被nginx關(guān)閉。同樣意味著為了保持QPS,客戶端不得不每秒中重新新建100個(gè)連接。因此,如果用netstat命令看客戶端機(jī)器,就會(huì)發(fā)現(xiàn)有大量的TIME_WAIT的socket連接(即使此時(shí)keep alive已經(jīng)在client和nginx之間生效)。
因此對(duì)于QPS較高的場(chǎng)景,非常有必要加大這個(gè)參數(shù),以避免出現(xiàn)大量連接被生成再拋棄的情況,減少TIME_WAIT。
keepalive_requests 指令
默認(rèn)值1000,單個(gè)連接中處理的最大請(qǐng)求數(shù),超過(guò)這個(gè)數(shù),連接銷毀。
keepalive_disable 指令
不對(duì)某些瀏覽器建立長(zhǎng)連接,默認(rèn):msie6
send_timeout 指令
兩次向客戶端寫操作之間的間隔 如果大于這個(gè)時(shí)間則關(guān)閉連接 默認(rèn)60s
此處有坑,注意耗時(shí)的同步操作有可能會(huì)丟棄用戶連接
該設(shè)置表示Nginx服務(wù)器與客戶端連接后,某次會(huì)話中服務(wù)器等待客戶端響應(yīng)超過(guò)10s,就會(huì)自動(dòng)關(guān)閉連接。
http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65 65; #超過(guò)這個(gè)時(shí)間 沒(méi)有活動(dòng),會(huì)讓keepalive失效 keepalive_time 1h; # 一個(gè)tcp連接總時(shí)長(zhǎng),超過(guò)之后 強(qiáng)制失效 send_timeout 60;# 默認(rèn)60s 此處有坑?。?系統(tǒng)中 若有耗時(shí)操作,超過(guò) send_timeout 強(qiáng)制斷開連接。 注意:準(zhǔn)備過(guò)程中,不是傳輸過(guò)程 keepalive_requests 1000; #一個(gè)tcp復(fù)用中 可以并發(fā)接收的請(qǐng)求個(gè)數(shù)
二、Nginx 與 服務(wù)端長(zhǎng)連接配置
2.1 在 upstream 中配置
keepalive 100;
向上游服務(wù)器的保留連接數(shù)(線程池的概念)
keepalive_timeout 65
連接保留時(shí)間(單位秒)
keepalive_requests 10000
一個(gè)tcp復(fù)用中 可以并發(fā)接收的請(qǐng)求個(gè)數(shù)
2.2 在 server 中配置
proxy_http_version 1.1; 配置http版本號(hào) 默認(rèn)使用http1.0協(xié)議,需要在request中增加”Connection: keep-alive“ header才能夠支持,而HTTP1.1默認(rèn)支持。 proxy_set_header Connection ""; 清楚close信息
三、壓力測(cè)試
3.1 【客戶端】 直連 【Nginx】
Server Software: nginx/1.21.6 Server Hostname: 192.168.44.102 Server Port: 80 Document Path: / Document Length: 16 bytes Concurrency Level: 30 Time taken for tests: 13.035 seconds Complete requests: 100000 Failed requests: 0 Write errors: 0 Total transferred: 25700000 bytes HTML transferred: 1600000 bytes Requests per second: 7671.48 [#/sec] (mean) Time per request: 3.911 [ms] (mean) Time per request: 0.130 [ms] (mean, across all concurrent requests) Transfer rate: 1925.36 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 0 0.4 0 12 Processing: 1 3 1.0 3 14 Waiting: 0 3 0.9 3 14 Total: 2 4 0.9 4 14 Percentage of the requests served within a certain time (ms) 50% 4 66% 4 75% 4 80% 4 90% 5 95% 5 98% 6 99% 7 100% 14 (longest request)
3.2 【客戶端】 連接 【Nginx】 反向代理 【Nginx】
Server Software: nginx/1.21.6 Server Hostname: 192.168.44.101 Server Port: 80 Document Path: / Document Length: 16 bytes Concurrency Level: 30 Time taken for tests: 25.968 seconds Complete requests: 100000 Failed requests: 0 Write errors: 0 Total transferred: 25700000 bytes HTML transferred: 1600000 bytes Requests per second: 3850.85 [#/sec] (mean) Time per request: 7.790 [ms] (mean) Time per request: 0.260 [ms] (mean, across all concurrent requests) Transfer rate: 966.47 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 0 0.2 0 13 Processing: 3 8 1.4 7 22 Waiting: 1 7 1.4 7 22 Total: 3 8 1.4 7 22 Percentage of the requests served within a certain time (ms) 50% 7 66% 8 75% 8 80% 8 90% 9 95% 10 98% 12 99% 13 100% 22 (longest request)
3.3【客戶端】 直連 【Tomcat】
Server Software: Server Hostname: 192.168.44.105 Server Port: 8080 Document Path: / Document Length: 7834 bytes Concurrency Level: 30 Time taken for tests: 31.033 seconds Complete requests: 100000 Failed requests: 0 Write errors: 0 Total transferred: 804300000 bytes HTML transferred: 783400000 bytes Requests per second: 3222.38 [#/sec] (mean) Time per request: 9.310 [ms] (mean) Time per request: 0.310 [ms] (mean, across all concurrent requests) Transfer rate: 25310.16 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 0 0.3 0 15 Processing: 0 9 7.8 7 209 Waiting: 0 9 7.2 7 209 Total: 0 9 7.8 7 209 Percentage of the requests served within a certain time (ms) 50% 7 66% 9 75% 11 80% 13 90% 18 95% 22 98% 27 99% 36 100% 209 (longest request)
3.4 【客戶端】 連接 【Nginx】 反向代理 【Tomcat】并開啟keepalive
Server Software: nginx/1.21.6 Server Hostname: 192.168.44.101 Server Port: 80 Document Path: / Document Length: 7834 bytes Concurrency Level: 30 Time taken for tests: 23.379 seconds Complete requests: 100000 Failed requests: 0 Write errors: 0 Total transferred: 806500000 bytes HTML transferred: 783400000 bytes Requests per second: 4277.41 [#/sec] (mean) Time per request: 7.014 [ms] (mean) Time per request: 0.234 [ms] (mean, across all concurrent requests) Transfer rate: 33688.77 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 0 0.2 0 9 Processing: 1 7 4.2 6 143 Waiting: 1 7 4.2 6 143 Total: 1 7 4.2 6 143 Percentage of the requests served within a certain time (ms) 50% 6 66% 7 75% 7 80% 7 90% 8 95% 10 98% 13 99% 16 100% 143 (longest request)
3.5 【客戶端】 連接 【Nginx】 反向代理 【Tomcat】不開啟keepalive
Server Software: nginx/1.21.6 Server Hostname: 192.168.44.101 Server Port: 80 Document Path: / Document Length: 7834 bytes Concurrency Level: 30 Time taken for tests: 33.814 seconds Complete requests: 100000 Failed requests: 0 Write errors: 0 Total transferred: 806500000 bytes HTML transferred: 783400000 bytes Requests per second: 2957.32 [#/sec] (mean) Time per request: 10.144 [ms] (mean) Time per request: 0.338 [ms] (mean, across all concurrent requests) Transfer rate: 23291.74 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 0 0.2 0 9 Processing: 1 10 5.5 9 229 Waiting: 1 10 5.5 9 229 Total: 1 10 5.5 9 229 Percentage of the requests served within a certain time (ms) 50% 9 66% 10 75% 11 80% 11 90% 13 95% 14 98% 17 99% 19 100% 229 (longest request)
到此這篇關(guān)于Nginx 長(zhǎng)連接keep_alive的具體使用的文章就介紹到這了,更多相關(guān)Nginx 長(zhǎng)連接keep_alive內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
配置nginx訪問(wèn)本地靜態(tài)資源,本地圖片,視頻教程
文章介紹了如何配置Nginx以訪問(wèn)本地靜態(tài)資源、圖片和視頻,首先,進(jìn)入Nginx安裝目錄并打開`nginx.conf`文件,添加一個(gè)新的`server`配置來(lái)指定本地路徑,然后,通過(guò)命令行重啟Nginx服務(wù)以應(yīng)用更改,最后,通過(guò)瀏覽器訪問(wèn)配置的圖片路徑來(lái)驗(yàn)證配置是否成功2025-01-01nginx日志導(dǎo)入elasticsearch的方法示例
這篇文章主要介紹了nginx日志導(dǎo)入elasticsearch的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05使用Nginx實(shí)現(xiàn)負(fù)載均衡的策略
本篇文章主要介紹了使用Nginx實(shí)現(xiàn)負(fù)載均衡的策略,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-02-02Nginx 平滑升級(jí)的實(shí)現(xiàn)(拒絕服務(wù)漏洞)
本文主要介紹了Nginx 平滑升級(jí)的實(shí)現(xiàn)(拒絕服務(wù)漏洞),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-02-02nginx worker進(jìn)程循環(huán)的實(shí)現(xiàn)
這篇文章主要介紹了nginx worker進(jìn)程循環(huán)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02詳解Nginx服務(wù)器中HTTP Headers相關(guān)的模塊配置使用
這篇文章主要介紹了詳解Nginx服務(wù)器中HTTP Headers相關(guān)的模塊配置使用,包括ngx_http_headers_module與它的增強(qiáng)版ngx_headers_more的配置使用講解,需要的朋友可以參考下2016-01-01PHP(FastCGI)在Nginx的alias下出現(xiàn)404錯(cuò)誤的解決方法
這篇文章主要介紹了PHP(FastCGI)在Nginx的alias下出現(xiàn)404錯(cuò)誤的解決方法,涉及nginx平臺(tái)的相關(guān)配置技巧,需要的朋友可以參考下2016-05-05在Nginx服務(wù)器中配置針對(duì)TCP的負(fù)載均衡的方法
這篇文章主要介紹了在Nginx服務(wù)器中配置針對(duì)TCP的負(fù)載均衡的方法,另外還介紹了TCP負(fù)載均衡的執(zhí)行原理,需要的朋友可以參考下2015-12-12