Nginx09 http的keepalive及在nginx的配置使用
1 为什么要有Connection: keep-alive?
在早期的HTTP/1.0中,每次http请求都要创建一个连接,而创建连接的过程需要消耗资源和时间,为了减少资源消耗,缩短响应时间,就需要重用连接。
在后来的HTTP/1.0中以及HTTP/1.1中,引入了重用连接的机制,就是在http请求头中加入Connection: keep-alive来告诉对方这个请求响应完成后不要关闭,下一次咱们还用这个请求继续交流。
协议规定HTTP/1.0如果想要保持长连接,需要在请求头中加上Connection: keep-alive。而HTTP/1.1默认是支持长连接的,有没有这个请求头都行。
2 非长链接和长链接的图示
3 keep-alive的优缺点
3.1 优点
1)节省了服务端 CPU 和内存适用量
2)降低拥塞控制 (TCP 连接减少)
3)减少了后续请求的延迟(无需再进行握手)
3.2 缺点
对于某些低频访问的资源 / 服务,比如一个冷门的图片服务器,一年下不了几次,每下一次连接还保持就比较浪费了(这个场景举的不是很恰当)。Keep-Alive 可能会非常影响性能,因为它在文件被请求之后还保持了不必要的连接很长时间,额外占用了服务端的连接数
4 连接复用后会有什么问题
在没有连接复用时,Http 接收端(注意这里是接收端,并没有特指 Client/Server,因为 Client/Server 都同是发送端和接收端)只需要读取 Socket 中所有的数据就可以了,解决 “拆包” 问题即可;但是连接复用后,无法区分单次 Http 报文的边界,所以还需要额外处理报文边界问题。当然这个通过 Http 中 Header 的长度字段,按需读取即可解决
5 Http 连接复用后包边界问题处理
由于 Http 中 Header 的存在,通过定义一些报文长度的首部字段,可以很方便的处理包边界问题。
在 Http 中,有两种方式处理包边界问题。
5.1 Content-Length 处理包边界
这个是最通常的处理方式,接收端处理报文时首先读取完整首部(Header),然后通过 Header 中的Content-Length来确认报文大小,读取报文时按此长度读取即可,超出长度的报文(“粘包”)不读取,不够长度的报文缓存等待继续读取(“拆包”)。
5.2 Chunked 处理包边界
对于无法确认总报文大小的情况,可以使用 Chunked 的方式来对报文进行分块传输,每一块内标示报文大小。比如 Nginx,开启 Gzip 压缩后,就会开启 Chunked 的传输方式。
通过 Wireshark 抓包,可以很直观的看初 Chunked 的原理:
注意,这里的 chunk 包,和 tcp segment 不是一回事,chunk 只是应用层的一个分包,而 tcp 的 segment 是对应用层报文再次进行分组
每个 chunk 报文前,会携带当前 chunk 的大小
6 Http 连接复用后怎样断开连接
通过 Keep-Alive 已经做到连接复用了,但复用之后什么时候断开连接呢,不然一直保持连接,造成资源的浪费。
Http 协议规定了两种关闭复用连接的方式:
6.1 通过 Keep-Alive Timeout 标识
如果服务端 Response Header 设置了Keep-Alive:timeout={timeout},客户端会就会保持此连接 timeout(单位秒)时间,超时之后关闭连接。
6.2 通过 Connection close 标识
还有一种方式是接收端通在 Response Header 中增加Connection close标识,来主动告诉发送端,连接已经断开了,不能再复用了;客户端接收到此标示后,会销毁连接,再次请求时会重新建立连接。
注意:配置 close 配置后,并不是说每次都新建连接,而是约定此连接可以用几次,达到这个最大次数时,接收端就会返回 close 标识
7 nginx的keepalive相关配置
官方文档:https://nginx.org/en/docs/http/ngx_http_upstream_module.html
7.1 nginx保持keepalive做的事情
1)client到nginx的连接是长连接
2)nginx到server的连接是长连接
7.2 配置TCP层keepalive探活机制的三个参数
#情况1:
http {
server {
listen 127.0.0.1:3306 so_keepalive=on;#开启keepalive探活,探测策略走系统默认
}
}
#情况2:
http {
server {
listen 127.0.0.1:3306 so_keepalive=7m:75s:9;#把空闲时长从系统默认的5分钟改为了7分钟
}
}
其中so_keepalive有如下选择配置
so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]
* on: 开启,探测参数更加系统默认值
* off: 关闭
* keepidle: 连接空闲等待时间
* keepintvl: 发送探测报文间隔时间
* keepcent: 探测报文重试次数
如果nginx未设置so_keepalive配置,则走系统默认的探活策略
7.3 nginx与客户端(一般为浏览器、APP等)保持的长连接进行限制管理
http {
# 客户端连接的超时时间, 为 0 时禁用长连接,
keepalive_timeout 120s;
# 在一个长连接上可以服务的最大请求数目, 当达到最大请求数目且所有已有请求结束后, 连接被关闭, 默认为 100, 即每个连接的最大请求数
keepalive_request 10000;
}
keepalive_timeout:客户端连接在服务器端空闲状态下保持的超时值(默认75s);值为0会禁用keep-alive,也就是说默认不启用长连接;第二个参数:响应的header域中设置“Keep-Alive: timeout=time”;告知浏览器对长连接的维持时间
keepalive_requests:默认100,某个长连接连续处理请求次数限制,超过次数则该长连接被关闭;如果需要释放某个连接占用的内存,必须关闭该链接,内存不大的情况下,不建议开大该配置;在QPS较高的场景,则有必要加大这个参数
7.4 nginx与上游server保持长连接
http {
upstream BACKEND {
server 127.0.0.1:8000;
server 127.0.0.1:8001;
server 127.0.0.1:8002;
keepalive 300; //空闲连接数
keepalive_timeout 120s;//与上游空闲时间
keepalive_requests 100;//与上游请求处理最大次数
}
server{
listen 8080;
location /{
proxy_pass http://BACKEND;
proxy_http_version 1.1;
proxu_set_header Connection "";
}
}
}
keepalive:限制nginx某个worker最多空闲连接数,此处不会限制worker与上游服务长连接的总数;
keepalive_timeout:nginx与上游长连接最大空闲时间,默认值为60s;
keepalive_requests:nginx与上游长连接最大交互请求的次数,默认值为100;
Nginx09 http的keepalive及在nginx的配置使用的更多相关文章
- nginx性能配置参数说明:
nginx的配置:main配置段说明一.正常运行的必备配置: 1.user username [groupname]; 指定运行worker进程的用户和组 2.pid /path/to/pidfile ...
- Nginx 安装 配置 使用
Nginx 安装 配置 使用 基本的HTTP服务器特性 处理静态文件,索引文件以及自动索引:打开文件描述符缓存(缓存元数据和文件描述符,下一次可以直接从内存找到数据或者文件的位置): 使用缓存加速反向 ...
- nginx的配置与应用
Nginx在应用程序中主要有以下作用(应用):1.解决跨域.2.请求过滤.3.配置Gzip.4.负载均衡.5.静态资源服务器. Nginx的配置结构 Nginx主要是通过修改配置文件nginx.con ...
- Nginx 参数配置相关
Nginx参数配置相关 by:授客 QQ:1033553122 目的: 对Nginx配置的点滴学习总结,主要目的在于分析Nginx与性能相关的一些参数设置,以便性能调优时选择最优配置 环境: $ ...
- 【第六课】Nginx常用配置下详解
目录 Nginx常用配置下详解 1.Nginx虚拟主机 2.部署wordpress开源博客 3.部署discuz开源论坛 4.域名重定向 5.Nginx用户认证 6.Nginx访问日志配置 7.Ngi ...
- 【nginx】配置Nginx实现负载均衡
一文中已经提到,企业在解决高并发问题时,一般有两个方向的处理策略,软件.硬件,硬件上添加负载均衡器分发大量请求,软件上可在高并发瓶颈处:数据库+web服务器两处添加解决方案,其中web服务器前面一层最 ...
- 转:NGNIX模块开发——nginx的配置系统
From:http://tengine.taobao.org/book/chapter_02.html nginx的配置系统 nginx的配置系统由一个主配置文件和其他一些辅助的配置文件构成.这些配置 ...
- nginx动态配置及服务发现那些事
Reference: http://xiaorui.cc/2016/10/16/nginx%E5%8A%A8%E6%80%81%E9%85%8D%E7%BD%AE%E5%8F%8A%E6%9C%8D% ...
- 服务器部署之nginx的配置
nginx可作为Web和 反向代理 服务器,在高连接并发的情况下,Nginx是Apache服务器不错的替代品.下面记录一下自己对nginx的配置和使用. nginx的安装 环境:oracle-linu ...
- CentOS 7 Nginx安装配置
1.添加Nginx源 yum install epel-release 2.安装Nginx yum install nginx 3.启动Nginx systemctl start nginx //配置 ...
随机推荐
- elasticsearch聚合之bucket terms聚合
目录 1. 背景 2. 前置条件 2.1 创建索引 2.2 准备数据 3. 各种聚合 3.1 统计人数最多的2个省 3.1.1 dsl 3.1.2 运行结果 3.2 统计人数最少的2个省 3.2.1 ...
- C++初阶(运算符重载汇总+实例)
运算重载符 概念: 运算符重载是具有特殊函数名的函数,也具有其返回值类型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似. 函数原型: 返回值 operator操作符(参数列表) 注意: ...
- MQ系列8:数据存储,消息队列的高可用保障
MQ系列1:消息中间件执行原理 MQ系列2:消息中间件的技术选型 MQ系列3:RocketMQ 架构分析 MQ系列4:NameServer 原理解析 MQ系列5:RocketMQ消息的发送模式 MQ系 ...
- Linux系统各种库/软件版本输出指令
日常开发基于Linux系统(其实更多的是Ubuntu平台),平时总会遇到一些情况需要查看某个库或者软件的版本信息,在这里做一下简单的记录. 1. 查看glibc版本 方法一:使用ldd指令 cv@cv ...
- MybatisPlus多表连接查询一对多分页查询数据
一.序言 在日常一线开发过程中,多表连接查询不可或缺,基于MybatisPlus多表连接查询究竟该如何实现,本文将带你找到答案. 在多表连接查询中,既有查询单条记录的情况,又有列表查询,还有分页查询, ...
- 【每日一题】【暴力&双指针&动态规划】42. 接雨水-211130/220214
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水. 方法1:暴力求解(超时) import java.util.*; public class Solu ...
- uniapp input框聚焦时软键盘弹起整个页面上滑,固定页面不让上滑问题
根据需求,软键盘弹起时,不允许页面整体向上滑动 用到的属性是: :adjust-position="false" uni-app 软键盘顶起底部fixed定位的输入框 页面就不会 ...
- 网络监测工具之Zabbix的搭建与测试方法(三) ---Zabbix Agent
安装客户端 在官方网站下载最新版本zabbix agent v6.2.6,然后默认安装,其中配置服务端的界面如下图: 其他一律默认即可. 启用发现功能 如上图所示,开启发现规则,默认搜索zabbix ...
- 【架构设计】保持简单轻量设计的三个原则——DRY,KISS, YAGNI
前言 一个软件轻量简单的软件架构是非常重要的,它可以让我们花最小的代价就能满足业务上的需求.那如何保证轻量简单呢?那今天就和大家分享下这其中的秘密,也就是3个重要的指导原则,KISS原则,YAGNI原 ...
- java定时任务Quartz整理
目录 一.Quartz介绍 二.Quartz的组成 三.使用java实现一个简单的Quartz例子 四.使用Springboot整合Quartz定时任务框架 五.使用Springboot+mybati ...