nginx与http网络特性(持续更新)

本文包括以下内容:
1、http保持长连接的keepalive做法,以及nginx的实现。
2、http长连接的另一种方式——pipeline以及实现。
3、lingering_close问题以及nginx的处理方案。

1、keepalive

1.1、http的长连接协议

(1)http1.0——不带content-length头域,直到服务端发送完响应数据且服务端主动断开连接,才表示body接收完了。
(2)http1.1——Transfer-encode头域为chunked
body会被分成多个块,每块的开始会标识出当前块的长度。
(3)connection头域:如果客户端的请求头中的connection为close,则表示客户端需要关掉长连接,如果为 keep-alive,则客户端需要打开长连接,如果客户端的请求中没有 connection 这个头,那么根据协议,如果是 http1.0,则默认为 close,如果是 http1.1,则默认为keep-alive。

1.2、nginx的做法

(1)nginx的长连接等待超时:
nginx根据客户端的connection头域来设置当前连接的keepalive属性,同时会设置一个等待长连接的超时时间keepalive_timeout(如果配置为0,则表示都强制close,不作任何等待)。
(2)keepalive属性的优点:
对于请求量比较大的nginx来说,关掉keepalive最后会产生比较多的time-wait状态的socket。一般来说,当客户端的一次访问,需要多次访问同一个server时,打开keepalive的优势非常大,比如图片服务器,通常一个网页会包含很多个图片。打开keepalive也会大量减少time-wait的数量。

2、pipeline

pipeline是一种基于长连接的特性,在http1.1中引入,可以看作是keepalive属性的升华。

2.1、和keepalive的区别

pipeline可以利用一个连接做多次请求,客户端不必等到第一个请求的响应就可以发起第二个请求。如果客户端要提交多个请求,对于keepalive来说,那么第二个请求,必须要等到第一个请求的响应接收完全后,才能发起,这和TCP的停止等待协议是一样的,得到两个响应的时间至少2*RTT。

2.2、nginx支持pipeline特性

nginx利用pipeline特性,减少了处理完一个请求后,等待第二个请求的请求到来的时间。其实nginx的做法很简单,nginx在读取数据时,会将读取的数据放到一个buffer里面,所以,如果nginx在处理完前一个请求后,如果发现buffer里面还有数据,就认为剩下的数据是下一个请求的开始,然后就接下来处理下一个请求,否则就设置keepalive。

3、lingering_close

类似于tcp套接字的SO_LINGER选项。避免连接关闭前,最后的数据的读写没有完成。

3.1、问题场景

(1)前置条件:服务端在处理客户端请求的时候,由于一些错误情况,需要响应错误信息给对端并关闭连接。但是write()系统调用返回成功并不表示数据已经发送到客户端,有可能还在内核写缓冲区里。
(2)我们先看没有设置lingering_close的行为:如果直接close()的话,内核会首先检查内核读缓存区里有没有客户端发送过来的数据留在内核态没有被用户态进程读取,如果有则发送给客户端RST报文来关闭tcp连接丢弃内核写缓冲区里的数据,如果没有则等待内核写缓冲区里的数据发送完毕,然后再经过正常的4次挥手报文断开连接。
(3)问题来了:当在某些场景下出现内核写缓冲区里的数据在write()系统调用之后到close()系统调用执行之前没有发送完毕,且内核读缓存区里面还有数据没有读,服务端的close()调用会导致客户端收到RST报文,从而客户端就不会拿到服务端发送过来的完整的响应数据,客户端也就无法知道服务端要发给客户端的错误信息。

3.2、nginx的实现

nginx是自己实现的lingering_close特性。通过两个定时器来完成lingering的工作。
(1)lingering_timeout
在关闭连接前,会检测是否有用户发送的数据到达服务器,如果超过lingering_timeout时间后还没有数据可读,就直接关闭连接;否则,必须在读取完连接缓冲区上的数据并丢弃掉后才会关闭连接。
(2)lingering_time
这个时间也就是nginx在关闭写之后,保留socket的时间。客户端需要在这个时间内发送完所有的数据,否则nginx在这个时间过后,会直接close()关掉连接和释放套接字资源,就不再管客户端还有没有数据再发送过来了。
(3)nginx是支持配置是否打开lingering_close选项的,通过lingering_close选项来配置。在实际应用中,是否应该打开lingering_close呢?
这个就没有固定的推荐值了,如 Maxim Dounin所说,lingering_close的主要作用是保持更好的客户端兼容性,但是却需要消耗更多的额外资源(比如连接会一直占着)。

其实优雅关闭连接的代码实现主要还有两种方式:
方法一:给套接字设置SO_LINGER选项,然后关闭连接的时候直接close()就行。这样就由内核去帮上层去做延时释放套接字资源。
方法二:上层要关闭连接的时候先调用shutdown,然后上层自己去做延时,然后再调用close()。比如上述的nginx就是这种做法。

【nginx】nginx与http网络特性相关推荐

  1. Netty,Nginx严重落后;网络IO框架最新性能排名

    Netty,Nginx严重落后:网络IO框架最新性能排名 新一代网络IO框架性能吊打传统框架 最近看了一下最新第21期(2022年7月)的Techempower的网络框架性能排名,实在有些惊讶.很多老 ...

  2. Nginx —— nginx负载均衡的详细配置 以及 使用案例详解.

    1,话不多说, 这里我们来说下很重要的负载均衡, 那么什么是负载均衡呢? 由于目前现有网络的各个核心部分随着业务量的提高,访问量和数据流量的快速增长,其处理能力和计算强度也相应地增大,使得单一的服务器 ...

  3. 【Linux】在Ubuntu下部署nginx——nginx的安装与卸载

    介绍 这里是小编成长之路的历程,也是小编的学习之路.希望和各位大佬们一起成长! 以下为小编最喜欢的两句话: 要有最朴素的生活和最遥远的梦想,即使明天天寒地冻,山高水远,路远马亡. 一个人为什么要努力? ...

  4. Nginx——Nginx优化方案设计

    摘要 本博文介绍Nginx的优化设计方向和原理,帮助大家在nginx的使用和优化中提供一个参考的方向,让你的nginx发挥最大性能,节约系统资源. 一.Nginx开启Http2.0的优化 HTTP/2 ...

  5. nginx配置详解,完全卸载nginx, nginx https配置

    nginx 配置文件详解 文章目录 nginx 配置文件详解 Ubuntu nginx 目录结构 nginx 配置文件结构 默认nginx.conf( (1.18.0版本) location详解,pr ...

  6. nginx文件服务器html美化,关于nginx:Nginx浏览目录配置及美化

    在我的项目中有一个性能须要在浏览器页面中浏览服务器的目录.服务器应用Nginx,而Nginx提供了相应的ngx_http_autoindex_module 模块,该模块提供了咱们想要的性能. Ngin ...

  7. Nginx —— nginx的命令行控制(nginx的启动与停止、重载配置文件、回滚日志文件、平滑升级等操作)

    在linux中,需要使用命令来控制Nginx服务器的启动与停止.重载配置文件.回滚日志文件.平滑升级等行为. 默认情况下,nginx被安装在目录/usr/local/nginx中,其二进制文件路径为/ ...

  8. 解决nginx重启“var/run/nginx/nginx.pid no such file or directory问题

    重启虚拟机后,再次重启nginx会报错"/var/run/nginx/nginx.pid" no such file or directory.google无门, 很多人的方法是: ...

  9. Nginx重启时丢失nginx.pid文件解决方法nginx: [emerg] open() “/var/run/nginx/nginx.pid“ failed (2: No such fi

    nginx: [emerg] open() "/var/run/nginx/nginx.pid" failed (2: No such file or directory) 不要在 ...

最新文章

  1. android studio val,Kotlin学习笔记之const val与val
  2. python 表格格式输出_利用python对excel中一列的时间数据更改格式操作
  3. 利用边缘灰度变化建模,来提高圆环直径求取精度
  4. jackson的jar包下载
  5. Java虚拟机栈介绍
  6. 论文英文参考文献[10]的时候后面多空格_大学生没有任何论文写作经验,该如何快速写好论文?...
  7. 基于深度学习的番茄叶片分割算法在手机上的应用(GDL+复杂背景只分割叶片有意义?)
  8. arcmap发布三维地图_如何使用高程DEM建立三维地图模型(Arcgis ArcScene)
  9. 如何抓取html请求,网页抓取工具如何进行http模拟请求
  10. 源恒房地产税务软件土地增值税清算系统
  11. 约束优化方法_2_——Frank-Wolfe方法
  12. 安装TimeGen波形绘图软件
  13. 图像算法(一):最近邻插值,双线性插值,三次插值
  14. 关于徐晓东,传统武术,以及太极拳
  15. 两个互质整数的线性组合问题
  16. 计算机网络课程实验4——编程实现路由算法(迪杰斯特拉算法)
  17. 大数据分布式计算开源框架Hadoop的介绍和运用
  18. 使用conga部署RHCS
  19. 利用笔记本无线开热点,手机wireshark抓包
  20. 影视APP源码电视盒子源码对接苹果CMS后台新增蓝光

热门文章

  1. 深度学习之美——算法的分类
  2. 【生活随笔】前端学习总结
  3. Apollo Planning学习(9)-------速度规划
  4. 小学知识点~句式全覆盖专题
  5. Project 2 : 北京地铁数据处理及路径探寻
  6. 熬夜学Java语言-设计模式之代理模式
  7. Go语言系列-Go安装与配置
  8. Allegro PCB放置mark点
  9. Django规范化编程3
  10. 树莓派调分辨率 + VNC cannot currently show the desktop 的解决方法