Nginx篇05——http长连接和keeplive

作者&投稿:真厕 (若有异议请与网页底部的电邮联系)
~

nginx中http模块使用http长连接的相关配置(主要是keepalive指令)和http长连接的原理解释。

连接管理是一个 HTTP 的关键话题:打开和保持连接在很大程度上影响着网站和 Web 应用程序的性能。在 HTTP/1.x 里有多种模型:短连接, 长连接, 和 HTTP 流水线。在解释这三种模型之前,我们需要先明确一些前提知识:

接下来我们开始解释。

在早期,HTTP 使用一个简单的模型来处理这样的连接。这些连接的生命周期是短暂的:每发起一个请求时都会创建一个新的连接,并在收到应答时立即关闭。这就是类似上面说的三次握手,在互联网发展的早期一个网页的资源并没有现在这么多,很多可能只是一个简单的静态页面而已,所以这样的模型显然很OK。客户端获取完所需资源之后,就断开连接,不再占用服务器的资源。

HTTP 短连接模型是最早期的模型,也是 HTTP/1.0 的默认模型。每一个 HTTP 请求都由它自己独立的连接完成;这意味着发起每一个 HTTP 请求之前都会有一次 TCP 握手,而且是连续不断的。 实际上,TCP 协议握手本身就是耗费时间的,所以 TCP 可以保持更多的热连接来适应负载。短连接破坏了 TCP 具备的能力,新的冷连接降低了其性能。

后来,网页需要请求的资源越来越多,短连接模型显然已经十分吃力了。因为短连接有两个比较大的问题:创建新连接耗费的时间尤为明显(三次握手很耗费时间),另外 TCP 连接的性能只有在该连接被使用一段时间后(热连接)才能得到改善。因此在HTTP/1.1中引入了长连接模型和流水线模型。

一个长连接会保持一段时间,重复用于发送一系列请求,节省了新建 TCP 连接握手的时间,还可以利用 TCP 的性能增强能力。当然这个连接也不会一直保留着:连接在空闲一段时间后会被关闭(服务器可以使用 Keep-Alive 协议头来指定一个最小的连接保持时间)。

长连接也还是有缺点的;也就是前面提到的资源占用问题,就算是在空闲状态,它还是会消耗服务器资源,也更容易被DDoS攻击。 本质上长连接是因为不断地三次握手建立连接消耗的资源要大于维持连接所需要的资源才使用的 ,如果服务器处于高负载时段或者被DDoS,可以使用非长连接,即尽快关闭那些空闲的连接,也能对性能有所提升。

流水线模型的实现要复杂很多,而已效果也并不是特别好,主要还要考虑到各种兼容性,所以默认是不启用这个流水线模型的,而在HTTP/2中,流水线已经被更好的算法给代替,如 multiplexing 。

默认情况下,HTTP 请求是按顺序发出的。 下一个请求只有在当前请求收到应答过后才会被发出。 由于会受到网络延迟和带宽的限制,在下一个请求被发送到服务器之前,可能需要等待很长时间。 流水线是在同一条长连接上发出连续的请求,而不用等待应答返回。这样可以避免连接延迟。 理论上讲,性能还会因为两个 HTTP 请求有可能被打包到一个 TCP 消息包中而得到提升。就算 HTTP 请求不断的继续,尺寸会增加,但设置 TCP 的 MSS(Maximum Segment Size) 选项,仍然足够包含一系列简单的请求。

并不是所有类型的 HTTP 请求都能用到流水线:只有 idempotent 方式,比如 GET 、 HEAD 、 PUT 和 DELETE 能够被安全的重试:因为有故障发生时,流水线的内容要能被轻易的重试,即出现了问题重试的成本要尽可能低,否则还不如使用长连接模型。

正确的实现流水线是复杂的:传输中的资源大小,多少有效的 RTT 会被用到,还有有效带宽,流水线带来的改善有多大的影响范围。不知道这些的话,重要的消息可能被延迟到不重要的消息后面。这个重要性的概念甚至会演变为影响到页面布局!因此 HTTP 流水线在大多数情况下带来的改善并不明显。此外,流水线受制于 HOL 问题。

我们还是使用上面的例子来进行解释,这次的握手请求就变了,A一次向B发出了三个请求:

最后这里补充一张图片来对比三种模型之间的差别:

了解了上面的原理之后,Nginx中的keepalive指令我们就非常好理解了,相关的指令主要有三个,我们逐个进行解释:

在upstream模块中配置,启用连接到upstream中的服务器的缓存, connections 参数的主要作用是设定每个Nginx的 单个worker进程(each worker process) 对于upstream中的server的最大空闲连接数,当超过该数字的时候,会关闭使用得最少的连接。

需要注意的是,keepalive指令并不会限制Nginx的 所有worker 进程能开启的连接到upstream服务器中的 连接总数(total number) 。也就是如果设得太大了,会导致过多的空闲连接占满了upstream中的server资源,导致新的连接无法建立,因此这个数值的设定需要根据worker进程数量来调整。

keepalive_requests 设定可以通过一个连接(connection)发送的请求(request)数量,超过最大请求数量之后,该连接会被关闭。为了释放每个连接的内存分配,定期关闭连接是很有必要的。因此,不建议将 keepalive_requests 设定过大,否则可能会导致过高的内存占用。

设定连接超时时间,在此设定的时间内,client与upstream中的server的空闲keepalive连接将保持打开状态(open)。此外,虽然官方文档说的默认值是60s,但是1.17.9版本的Nginx在安装之后配置文件nginx.conf上面设定的是65s。




实战Nginx的目录
第一部分 基础篇第1章 Nginx简介基本介绍第2章 Nginx服务器的安装与配置\/11第2部分 进阶篇第3章 Nginx的基本配置与优化\/21第4章 Nginx与PHP(FastCGI)的安装、配置与优化\/38第5章 Nginx与JSP、ASPNET、Perl的安装与配置\/59第6章 NginxHTTP负载均衡和反向代理的配置与优化\/73第7章 Nginx的Rewrite...

Nginx的超时timeout配置详解
本篇文章主要介绍了Nginx的超时timeout配置详解,我觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随我过来看看吧 本文介绍 Nginx 的 超时(timeout)配置。分享给大家,具体如下:Nginx 处理的每个请求均有相应的超时设置。如果做好这些超时时间的限定,判定超时后资源被释放,用来处理其他的...

【nginx】如何解决使用nginx作为反向代理端口耗尽问题?
Nginx 高级篇:单机并发 1 万 10 万次请求解决和优化方案 https:\/\/learnku.com\/articles\/42203 nginx 并发数问题思考:worker_connections,worker_processes与 max clients https:\/\/blog.51cto.com\/liuqunying\/1420556 nginx tcp负载突破端口数量限制 proxy_bind split_client https:\/\/www.codenong.com\/...

nginx 部署多个前端vue项目的3种方式,一篇文章搞定
首先我们看一下nginx.conf配置文件 为了方便管理,在\/usr\/local\/nginx\/conf.d\/ 创建自己的*.conf配置文件。没有conf.d目录,直接mkdir 创建conf.d .conf 详细可参考:这种方式只需要开放80端口,然后访问二级域名。这种方式的好处是只有一个server ,而且不需要二级域名、用路径location就能实现。但是这种...

nginx 403 forbidden错误的解决
这篇文章主要介绍了权限问题导致Nginx 403 Forbidden错误的解决方法,本文中导致 403 Forbidden错误的原因是配置文件中没有指明一个用户,需要的朋友可以参考下 今天在一个新的环境上安装nginx,结果访问的都是403 通常显示403我立马都会想到路径配置不对,但我仔细看了一下,目录路径没问题:nginx.conf:查看...

Nginx配置文件
并发总数是 worker_processes 和 worker_connections 的乘积,即 在设置了反向代理的情况下,max_clients = worker_processes * worker_connections \/ 4 为什么,为什么上面反向代理要除以4,应该说是一个经验值,根据以上条件,正常情况下的Nginx Server可以应付的最大连接数为:2 * 100000= 200000...

如何安装nginx
nginx windows版 v1.13.3免费版http:\/\/www.ddooo.com\/softdown\/29113.htm nginx windows安装配置方法 第一步、安装方法 一、下载好后,把nginx windows版软件解压到c盘根目录。二、双击nginx.exe图标,可见黑窗口一闪而过,启动完毕。三、按下win+R快捷键,输入cmd打开命令行。四、命令行到nginx...

如何正确配置Nginx + PHP
对很多人而言,配置Nginx+PHP无外乎就是搜索一篇教程,然后拷贝粘贴。听上去似乎也没什么问题,可惜实际上网络上很多资料本身年久失修,漏洞百出,如果大家不求甚解,一味的拷贝粘贴,早晚有一天会为此付出代价。假设我们用PHP实现了一个前端控制器,或者直白点说就是统一入口:把PHP请求都发送到同一个...

通过nginx将本地请求打到开发机上
配置起来需要如下几部:对于nginx来讲,配置文件中关键的内容有以下几点:日志中的内建变量 这篇文章介绍的比较详细 Nginx的日志配置参数详解 转发的规则 具体的转发规则location我们就不赘述了,有很多文章介绍。dns的问题 在我们的场景中,我们需要一个比较特殊的情况是:我们需要拦截某些请求...

阿里P8整理出Nginx笔记:Nginx应用与运维实战核心篇
众所周知,Nginx是当下最流行的Web服务器,它具有很强的负载均衡,反向代理,邮件代理以及静态缓存的功能。在提供这些功能的同时,Nginx的性能也极其优秀,可以轻松支持百万、千万级的并发连接,能够为Tomcat、Django等性能不佳的Web应用抗住绝大部分外部流量。那么,Nginx是如何实现高速并发处理呢?那么你对...

港南区13138046803: nginx tcp 长链接默认多长时间断开链接 如何设置 -
扶英美开: http {keepalive_timeout 65;client_header_timeout 10;client_body_timeout 10; send_timeout 10; 释: keepalive_timeout:设置客户端连接保持活动的超时时间.在超过这个时间之后,服务器会关闭该连接. client_header_tomeout:设置客户...

港南区13138046803: http 怎么实现长连接 -
扶英美开: 目前web上的消息通讯方式主要有以下几种. 轮询,长连接,websocket 轮询:隔一段时间访问服务器,服务器不管有没有新消息都立刻返回. 长连接:页面向服务器发出请求,由服务器决定什么时候返回.(如果有新消息则立刻返回,没有的...

港南区13138046803: 如何使用http长连接 -
扶英美开: 如何使用http长连接 通过轮询来实现长连接 轮询:隔一段时间访问服务器,服务器不管有没有新消息都立刻返回.http长连接实现代码:客户端:package houlei.csdn.keepalive; import java.io.IOException; import java.io.InputStream; import java.io...

港南区13138046803: 如何让http协议做到长连接 -
扶英美开: 在手机QQ上来说,这是必须的,因为那不是HTTPA协议.在HTTP1.1版本就是采取的持续连接,那样浪费了太多资源,有可能导致服务器崩溃,所以在1.2版本以后就不能了,没有哪个服务器提供商愿意那样做.如果需要持续连接,可以下载个鼠标点击器,每隔一段时间自动点击刷新.希望我的回答楼主满意

港南区13138046803: HttpWebRequest怎么长连接 -
扶英美开: HTTP是无状态的 也就是说,浏览器和服务器每进行一次HTTP操作,就建立一次连接,但任务结束就中断连接.如果客户端浏览器访问的某个HTML或其他类型的 Web页中包含有其他的Web资源,如JavaScript文件、图像文件、CSS文件等;...

港南区13138046803: nginx的upstream支不支持长连接 -
扶英美开: 应该是支持proxy_set_header Connection Keep-Live;

港南区13138046803: 怎么使用netty写一个http长连接服务器 -
扶英美开: netty本身实现的长连接,就是一个连接一个worker.worker的数量是有限的(通常是cpu cores+1),所以你的服务器要是连接数多的话,得考虑使用“异步”Request(netty的http没实现这么个功能),或者说“Continuation”,当连接“无事可做”的时候,放弃线程的使用权,当要处理事务的时候,才重新拿到一个线程.当然,如果你只想实现长连接而不在意request 一直占有worker,那么你只要不放弃连接就可以了(websocket本身也是一种长连接,netty里面有websocket的例子).

港南区13138046803: 网络连接中的长连接和短链接是什么意思? -
扶英美开: 短连接 连接->传输数据->关闭连接 比如HTTP是无状态的的短链接,浏览器和服务器每进行一次HTTP操作,就建立一次连接,但任务结束就中断连接. 具体就是:浏览器client发起并建立TCP连接 -> client发送HttpRequest报文 -> server接收到报...

港南区13138046803: loadrunner 对长连接请求应该怎么解决 -
扶英美开: 3.1 默认值:设置 Keep-Alive HTTP connections ---> Yes 在此设置情况下访问baidu首页,请求头如下图:3.2 随后,修改 设置 Keep-Alive HTTP connections ---> No 在此设置情况下访问baidu首页,请求头如下图:

港南区13138046803: 如何用java实现HTTP长连接 -
扶英美开: 1、通过轮询来实现长连接(伪·长连接)2、websocket(真·长连接)

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网