nginx的keepalive和keepalive_requests
当使用nginx作为反向代理时,为了支持长连接,需要做到两点:
- 从client到nginx的连接是长连接
- 从nginx到server的连接是长连接
保持和client的长连接:
http {keepalive_timeout 120s 120s;keepalive_requests 10000;
}
keepalive_timeout
#语法
keepalive_timeout timeout [header_timeout];
- 第一个参数:设置keep-alive客户端(浏览器)连接在服务器端(nginx端)保持开启的超时值(默认75s);值为0会禁用keep-alive客户端连接;
- 第二个参数:可选、在响应的header域中设置一个值“Keep-Alive: timeout=time”;通常可以不用设置;
这个keepalive_timeout针对的是浏览器和nginx建立的一个tcp通道,没有数据传输时最长等待该时候后就关闭.
nginx和upstream中的keepalive_timeout则受到tomcat连接器的控制,tomcat中也有一个类似的keepalive_timeout参数
keepalive_requests
keepalive_requests指令用于设置一个keep-alive连接上可以服务的请求的最大数量,当最大请求数量达到时,连接被关闭。默认是100。
这个参数的真实含义,是指一个keep alive建立之后,nginx就会为这个连接设置一个计数器,记录这个keep alive的长连接上已经接收并处理的客户端请求的数量。如果达到这个参数设置的最大值时,则nginx会强行关闭这个长连接,逼迫客户端不得不重新建立新的长连接。
保持和server的长连接
为了让nginx和后端server(nginx称为upstream)之间保持长连接,典型设置如下:(默认nginx访问后端都是用的短连接(HTTP1.0),一个请求来了,Nginx 新开一个端口和后端建立连接,后端执行完毕后主动关闭该链接)
http {upstream BACKEND {server 192.168.0.1:8080 weight=1 max_fails=2 fail_timeout=30s;server 192.168.0.2:8080 weight=1 max_fails=2 fail_timeout=30s;keepalive 300; // 这个很重要!}
server {listen 8080 default_server;server_name "";location / {proxy_pass http://BACKEND;proxy_set_header Host $Host;proxy_set_header x-forwarded-for $remote_addr;proxy_set_header X-Real-IP $remote_addr;add_header Cache-Control no-store;add_header Pragma no-cache;proxy_http_version 1.1; // 这两个最好也设置proxy_set_header Connection "Keep-Alive";}}
}
HTTP协议中对长连接的支持是从1.1版本之后才有的,因此最好通过proxy_http_version指令设置为”1.1”;
从client过来的http header,因为即使是client和nginx之间是短连接,nginx和upstream之间也是可以开启长连接的。
keepalive
此处keepalive的含义不是开启、关闭长连接的开关;也不是用来设置超时的timeout;更不是设置长连接池最大连接数。官方解释:
- The connections parameter sets the maximum number of idle keepalive connections to upstream servers connections(设置到upstream服务器的空闲keepalive连接的最大数量)
- When this number is exceeded, the least recently used connections are closed. (当这个数量被突破时,最近使用最少的连接将被关闭)
- It should be particularly noted that the keepalive directive does
not limit the total number of connections to upstream servers that an nginx worker process can open.(特别提醒:keepalive指令不会限制一个nginx worker进程到upstream服务器连接的总数量)
我们先假设一个场景: 有一个HTTP服务,作为upstream服务器接收请求,响应时间为100毫秒。如果要达到10000 QPS的性能,就需要在nginx和upstream服务器之间建立大约1000条HTTP连接。nginx为此建立连接池,然后请求过来时为每个请求分配一个连接,请求结束时回收连接放入连接池中,连接的状态也就更改为idle。我们再假设这个upstream服务器的keepalive参数设置比较小,比如常见的10.
A、假设请求和响应是均匀而平稳的,那么这1000条连接应该都是一放回连接池就立即被后续请求申请使用,线程池中的idle线程会非常的少,趋进于零,不会造成连接数量反复震荡。
B、显示中请求和响应不可能平稳,我们以10毫秒为一个单位,来看连接的情况(注意场景是1000个线程+100毫秒响应时间,每秒有10000个请求完成),我们假设应答始终都是平稳的,只是请求不平稳,第一个10毫秒只有50,第二个10毫秒有150:
- 下一个10毫秒,有100个连接结束请求回收连接到连接池,但是假设此时请求不均匀10毫秒内没有预计的100个请求进来,而是只有50个请求。注意此时连接池回收了100个连接又分配出去50个连接,因此连接池内有50个空闲连接。
- 然后注意看keepalive=10的设置,这意味着连接池中最多容许保留有10个空闲连接。因此nginx不得不将这50个空闲连接中的40个关闭,只留下10个。
- 再下一个10个毫秒,有150个请求进来,有100个请求结束任务释放连接。150 - 100 = 50,空缺了50个连接,减掉前面连接池保留的10个空闲连接,nginx不得不新建40个新连接来满足要求。
同样,如果假设相应不均衡也会出现上面的连接数波动情况。
造成连接数量反复震荡的一个推手,就是这个keepalive 这个最大空闲连接数。毕竟连接池中的1000个连接在频繁利用时,出现短时间内多余10个空闲连接的概率实在太高。因此为了避免出现上面的连接震荡,必须考虑加大这个参数,比如上面的场景如果将keepalive设置为100或者200,就可以非常有效的缓冲请求和应答不均匀。
总结:
keepalive 这个参数一定要小心设置,尤其对于QPS比较高的场景,推荐先做一下估算,根据QPS和平均响应时间大体能计算出需要的长连接的数量。比如前面10000 QPS和100毫秒响应时间就可以推算出需要的长连接数量大概是1000. 然后将keepalive设置为这个长连接数量的10%到30%。比较懒的同学,可以直接设置为keepalive=1000之类的,一般都OK的了。
综上,出现大量TIME_WAIT的情况
导致 nginx端出现大量TIME_WAIT的情况有两种:
- keepalive_requests设置比较小,高并发下超过此值后nginx会强制关闭和客户端保持的keepalive长连接;(主动关闭连接后导致nginx出现TIME_WAIT)
- keepalive设置的比较小(空闲数太小),导致高并发下nginx会频繁出现连接数震荡(超过该值会关闭连接),不停的关闭、开启和后端server保持的keepalive长连接;
导致后端server端出现大量TIME_WAIT的情况:
- nginx没有打开和后端的长连接,即:没有设置
proxy_http_version 1.1;
和proxy_set_header Connection "Keep-Alive";
从而导致后端server每次关闭连接,高并发下就会出现server端出现大量TIME_WAIT
参考了大佬的博文
https://www.cnblogs.com/grimm/p/13038577.html
nginx的keepalive和keepalive_requests相关推荐
- nginx之keepalive详解与其配置
文章目录 一.keepalive理解 什么是keepalive 如何确定请求头和响应体的长度? 是否可使用长连接的条件是什么? keepalive时Nginx的等待时长是多少? keepalive的优 ...
- Nginx http keepalive提升链接效率
L81 keepalive 描述 多个http请求可以复用Tcp链接 减少握手次数 通过减少并发连接数减少服务器资源消耗 降低Tcp拥塞控制影响 Syntax: keepalive_disable ...
- 从一起丢包故障来谈谈 nginx 中的 tcp keep-alive
一.故障 基本架构如图所示,客户端发起 http 请求给 nginx,nginx 转发请求给网关,网关再转发请求到后端微服务. 故障现象是,每隔十几分钟或者几个小时不等,客户端就会得到一个或者连续多个 ...
- nginx+tomcat的keepalive验证、bio/nio连接比较
原文地址:https://blog.csdn.net/shi1122/article/details/50411885 最近刚好有时间找了台机器压测了一下,验证一下自己的一些想法. 很多时候我们会发现 ...
- php socket keepalive,使用keepalive和fastcgi_keep_conn打开Nginx php-fpm时出错
我正在尝试使用Nginx php-fpm与nginx选项'keepalive'和'fastcgi_keep_conn on'来保持tcp连接在它们之间保持活动状态,但在服务几百个请求后面临错误 &qu ...
- nginx+keepalive实现高可用负载均衡
一:实验环境 主nginx负载均衡器:10.192.203.201 (通过keepalived配置了VIP:10.192.203.106供外使用) 副nginx负载均衡器:10.192.203.10 ...
- KeepAlive + VIP 配置高可用 Nginx 主备集群
一. 背景 本文主要介绍使用 keepalive 实现 nginx 的主备高可用 实验环境:CentOS 7 64 位 二. 实验步骤 2.1 安装 Nginx 和 Keepalive 软件 (两 ...
- nginx keepalive 双机
nginx keepalive 双机 Nginx+keepalived双机热备(主从模式) 负载均衡技术对于一个网站尤其是大型网站的web服务器集群来说是至关重要的!做好负载均衡架构,可以实现故障转移 ...
- Nginx 指令目录(中文版)
指令大全 accept_mutex accept_mutex_delay access_log add_after_body add_before_body add_header addition_t ...
最新文章
- 学习笔记《Java多线程编程实战指南》四
- 用友服务器文件如何查找,如何查询用友t3服务器地址
- Stanford UFLDL教程 可视化自编码器训练结果
- shell调用python函数 参数 返回_Python之系统shell交互(subprocess)
- GDCM:衍生系列DeriveSeries的测试程序
- android和web api接口,WebService和Webapi的区别
- Go 到底算不算一门面向对象的编程语言
- Glide 4.x工作总体执行流程概述
- c#时间 转换成java_Java与C#时间转换
- 【detectron】FPN网络中RPN构建与相应的损失函数
- maven阿里仓库配置教程
- 金蝶kiss专业版财务软件下载。
- c++基础 STL 第 0 篇:(模板)
- Flutter Text文本删除线、下划线设置
- css样式后面显示点点点
- Java编程思想(六)
- Nginx关闭或重启后nginx.pid丢失
- 【Unity人物动画】SALSA With RandomEyes (语音生成嘴型/人物说话) 使用
- pc控制iphone的软件_太好用了,这个软件可以让你在电脑上自由控制 iPhone和安卓手机!...
- 基于MSP432控制的红外循迹爬坡小车设计报告