keepalive

当然,在nginx中,对于http1.0与http1.1也是支持长连接的。

什么是长连接呢?我们知道,http请求是基于TCP协议之上的,那么,当客户端在发起请求前,需要先与服务端建立TCP连接,而每一次的TCP连接是需要三次握手来确定的,如果客户端与服务端之间网络差一点,这三次交互消费的时间会比较多,而且三次交互也会带来网络流量。当然,当连接断开后,也会有四次的交互,当然对用户体验来说就不重要了。而http请求是请求应答式的,如果我们能知道每个请求头与响应体的长度,那么我们是可以在一个连接上面执行多个请求的,这就是所谓的长连接,但前提条件是我们先得确定请求头与响应体的长度。

对于请求来说,如果当前请求需要有body,如POST请求,那么nginx就需要客户端在请求头中指定content-length来表明body的大小,否则返回400错误。也就是说,请求体的长度是确定的,那么响应体的长度呢?先来看看http协议中关于响应body长度的确定:

  1. 对于http1.0协议来说,如果响应头中有content-length头,则以content-length的长度就可以知道body的长度了,客户端在接收body时,就可以依照这个长度来接收数据,接收完后,就表示这个请求完成了。而如果没有content-length头,则客户端会一直接收数据,直到服务端主动断开连接,才表示body接收完了。
  2. 而对于http1.1协议来说,如果响应头中的Transfer-encoding为chunked传输,则表示body是流式输出,body会被分成多个块,每块的开始会标识出当前块的长度,此时,body不需要通过长度来指定。如果是非chunked传输,而且有content-length,则按照content-length来接收数据。否则,如果是非chunked,并且没有content-length,则客户端接收数据,直到服务端主动断开连接。

从上面,我们可以看到,除了http1.0不带content-length以及http1.1非chunked不带content-length外,body的长度是可知的。此时,当服务端在输出完body之后,会可以考虑使用长连接。能否使用长连接,也是有条件限制的。如果客户端的请求头中的connection为close,则表示客户端需要关掉长连接,如果为keep-alive,则客户端需要打开长连接,如果客户端的请求中没有connection这个头,那么根据协议,如果是http1.0,则默认为close,如果是http1.1,则默认为keep-alive。如果结果为keepalive,那么,nginx在输出完响应体后,会设置当前连接的keepalive属性,然后等待客户端下一次请求。

当然,nginx不可能一直等待下去,如果客户端一直不发数据过来,岂不是一直占用这个连接?所以当nginx设置了keepalive等待下一次的请求时,同时也会设置一个最大等待时间,这个时间是通过选项keepalive_timeout来配置的,如果配置为0,则表示关掉keepalive,此时,http版本无论是1.1还是1.0,客户端的connection不管是close还是keepalive,都会强制为close。

如果服务端最后的决定是keepalive打开,那么在响应的http头里面,也会包含有connection头域,其值是”Keep-Alive”,否则就是”Close”。如果connection值为close,那么在nginx响应完数据后,会主动关掉连接。所以,对于请求量比较大的nginx来说,关掉keepalive最后会产生比较多的time-wait状态的socket。一般来说,当客户端的一次访问,需要多次访问同一个server时,打开keepalive的优势非常大,比如图片服务器,通常一个网页会包含很多个图片。打开keepalive也会大量减少time-wait的数量。

作者:JokerW
链接:https://www.jianshu.com/p/630e2e1ca57f
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

转载于:https://www.cnblogs.com/AKUN-FYK/p/11129230.html

Nginx的keeplive相关推荐

  1. 深入分析网络编程中踩过的坑

    网络编程中经常会遇到一些异常的情况,定位问题需要了解协议栈的实现,以下是工作中遇到的一些常见问题的深入分析和解决思路. 问题1:server端业务进程响应心跳超时被监控进程kill,导致数据或者逻辑异 ...

  2. 如何处理高并发业务场景

    要具备高并发的经验确实需要有实际项目,因为业务逻辑其实很容易理清,但是要在高并发的情况下如何找到业务繁忙的热点并进行优化,完全只能凭经验. 假如没有靠谱的公司,接触不到高并发的业务场景怎么办? 从处理 ...

  3. 怎样学习才能拥有所谓“高并发”的经验?

    这个问题完全可以重定向到如何处理高并发业务场景. 以下只是我工作一年多接触到的一些基础,也许有偏差,要具备高并发的经验确实需要有实际项目,因为业务逻辑其实很容易理清,但是要在高并发的情况下如何找到业务 ...

  4. keeplive linux平台下,Linux下搭建keepalive+nginx

    一. 安装nginx(略) 二. 安装keepalive 安装依赖包 yum install –y popt* gcc* openssl* nmap tar fvxz keepalived-1.2.1 ...

  5. Nginx -静态资源Web服务

    一.静态资源类型 注:非服务器动态生成的文件 1.浏览器端渲染  HTML.css.js 2.图片  jpeg.gif.png 3.视频  flv.MPEG 4.文件  TXT.等任意下载文件 二.静 ...

  6. [译]深入 NGINX: 为性能和扩展所做之设计

    NGINX在web性能上的表现尤为出众,这完全得益于其设计方式,许多web和应用服务器都是基于线程或进程这种简单的架构,NGINX用了一种精妙的事件驱动架构,在现代的硬件上,它可以处理成千上万的并发连 ...

  7. 软件架构-nginx详解上

    今天说说nginx, 其实有老铁比较奇怪,nginx不是运维来搞的吗?确实是的,大部分情况下,公司比较大的话,存在运维的话,这个锅肯定是运维来做的.但是现在有个趋势叫devops之前我也说过,开发运维 ...

  8. nginx关闭请求处理ngx_http_finalize_request源码分析

    ngx_http_finalize_request 各个http模块在执行完某个操作都需要调用这个函数,来把请求的引用计数减去1,当引用计数为0时才会真正释放一个请求.这个函数实现比较复杂,考虑了各种 ...

  9. 教程 | 用安卓手机搭建 web 服务器(二)—— Nginx 安装配置

    上一步完成了必要的软件安装,接下来需要在 Linux 系统上安装 nginx. Nginx("engine x")是一款是由俄罗斯的程序设计师 Igor Sysoev 所开发高性能 ...

  10. Nginx基础配置和相关知识

    配置使用nginx 1.nginx虚拟主机         server{             listen             server_name             root    ...

最新文章

  1. jquery下拉菜单
  2. springIOC的那些事
  3. ssh框架分页显示问题
  4. java获取数组的最小值_Java 数组获取最大和最小值的实例实现
  5. 医疗小程序源码_不懂商城小程序源码,如何快速创建小程序商城?
  6. Java RandomAccessFile示例
  7. Ubuntu18.04下NVIDIA CUDA安装指南和DeepLearning4J GPU配置
  8. FFmpeg实现多段小视频合成
  9. [py]__name__ 属于哪个文件
  10. DataSet自定义添加table并添加数据
  11. 数据分析之落地sop流程
  12. 个人信息安全规范----2、个人信息安全基本原则
  13. #组合,容斥#JZOJ 3332 棋盘游戏
  14. 搜狗推送接口-搜狗推送口子
  15. SQLMAP参数中文详解(看过来)!
  16. 自己动手实现远程执行功能
  17. Java Number 类和方法
  18. 大学上课占座现象是否真的应该由校方控制
  19. 【历史上的今天】9 月 15 日:华为诞生;Stack Overflow 网站公开测试;计算机协会成立
  20. Android修改默认屏幕亮度

热门文章

  1. python识别图片文字、并返回文字坐标_简易OCR图片文字识别工具的进一步改进(增加显示图片的功能)...
  2. C语言 Linux版俄罗斯方块,C语言版俄罗斯方块源代码
  3. PDF 报告生成器:用 reportlab 和 pdfrw 生成自定义 PDF 报告
  4. 《精进:如何成为一个很厉害的人》
  5. Jquery 使用niceScroll.js 插件
  6. wps计算机打印双面输出,在wps中双面打印的方法步骤详解
  7. 从宏杉合作伙伴大会看本土存储厂商的“逆袭”
  8. modbus-tcp协议通过Java代码获取从机数据
  9. 【TiDB DevCon 2020】金融专题论坛演讲视频汇总
  10. Linux 磁盘分区及LVM实战演练