摘要

最近发现某项目的Nginx负载服务器上面有很多Time_wait的TCP连接
可以使用命令
netstat -n |awk '/^tcp/ {++S[$NF]} END{for (a in S) print a , S[a]}' 当时反馈过来 time_wait的连接特别多.
我比较菜, 没有进行过特别深入的研究.
本来今天准备学习研究systemtap的.
但是想能不能帮一下在乐不思蜀现场的栋哥就先看看这一块内容. 结论可能不准确, 需要有实际压测进行支撑.

关于长连接

keepalive
长连接其实有两种
第一种是TCP层的长连接, 第二种是http的长连接.
HTTP 的 Keep-Alive 也叫 HTTP 长连接,
该功能是由「应用程序」实现的,
可以使得用同一个 TCP 连接来发送和接收多个 HTTP 请求/应答,
减少了 HTTP 短连接带来的多次 TCP 连接建立和释放的开销。 TCP 的 Keepalive 也叫 TCP 保活机制,
该功能是由「内核」实现的,
当客户端和服务端长达一定时间没有进行数据交互时,
内核为了确保该连接是否还有效,就会发送探测报文,
来检测对方是否还在线,然后来决定是否要关闭该连接。
Study From :https://blog.csdn.net/ThinPikachu/article/details/128177194

Http 长连接的配置

Http 1.1 之后自动开启了长连接, 会在http头上面增加一个配置节:
Connection: Keep-Alive
一般默认的超时时间是 60s 是需要应用层来进行维护.
一般可以采用 keepalive_timeout的参数进行修改. 注意虽然Http的长连接可以避免 建立连接时的资源损耗.
但是如果客户并发量特别高, 并且大部分人用完就不在处理了.
应用服务器保留很多长连接会导致多余的性能开销.
这一块时间还是需要有一定的业务含义, 不建议太过随意的处理.

Tcp长连接

如果两端的 TCP 连接一直没有数据交互,
达到了触发 TCP 保活机制的条件,那么内核里的 TCP 协议栈就会发送探测报文。 1. 如果对端程序是正常工作的。当 TCP 保活的探测报文发送给对端,
对端会正常响应,这样 TCP 保活时间会被重置,等待下一个 TCP 保活时间的到来。
2. 如果对端主机崩溃,或对端由于其他原因导致报文不可达。
当 TCP 保活的探测报文发送给对端后,石沉大海,没有响应,连续几次,
达到保活探测次数后,TCP 会报告该 TCP 连接已经死亡。 注意TCP的保活机制是内核来提供的.他也有一些缺点:
因为TCP协议中的SO_KEEPALIVE有几个致命的缺陷:
1. keepalive只能检测连接是否存活,不能检测连接是否可用。
比如服务器因为负载过高导致无法响应请求但是连接仍然存在,
此时keepalive无法判断连接是否可用
2. 如果TCP连接中的另一方因为停电突然断网,我们并不知道连接断开,
此时发送数据失败会进行重传,由于重传包的优先级要高于keepalive的数据包,
因此keepalive的数据包无法发送出去。只有在长时间的重传失败之后我们才能判断此连接断开了。
Study From :https://www.zhihu.com/question/40602902/answer/209148428

注意长连接与Websocket的区别

websocket 实现的是 应用段端推送数据
长连接是websocket的实现基础.
但是websocket有更广阔的用途.

proxy_pass模块的长连接.

官方文档里面有对应的描述:
http://nginx.org/en/docs/http/ngx_http_upstream_module.html 可以在upstream 模块里面添加keepalive的数量.
需要注意的是这个数量仅是定义idle的进程数量,而不是max的数量.
所以基本上没有特别大的风险.
但是需要注意的是如果在upstream里面定义了 keepalive 需要在proxy_pass中增加定义配置.
第一个是 proxy_http_version 1.1 ; 第二个是 proxy_set_header Connection "" ;
因为proxy_pass 的默认 http version是1.0 需要增加配置节. upstream http_backend {
server 127.0.0.1:8080; keepalive 16;
} server {
... location /http/ {
proxy_pass http://http_backend;
proxy_http_version 1.1;
proxy_set_header Connection "";
...
}
}

Proxy_pass 对应的时间和超时时间

第一个是keepavlie的默认时间
默认是一个小时. Syntax: keepalive_time time;
Default:
keepalive_time 1h;
Context: upstream
This directive appeared in version 1.19.10.
Limits the maximum time during which requests can be processed through one keepalive connection.
After this time is reached, the connection is closed following the subsequent request processing. 第二个是空闲的keepalive的默认超时时间.
默认是60秒, 我理解超过了 keepalive的数量时就利用他来进行关闭idle进程.
Syntax: keepalive_timeout timeout;
Default:
keepalive_timeout 60s;
Context: upstream
This directive appeared in version 1.15.3.
Sets a timeout during which an idle keepalive connection to an upstream server will stay open.

Nginx的其他超时时间设置

http 下面的
#每个 TCP 连接最多可以保持多长时间
keepalive_timeout 60;
#客户端向服务端发送一个完整的 request header
client_header_timeout 10;
#客户端发送服务端发送一个完整的 request bod
client_body_timeout 20;
#服务端向客户端传输数据的超时时间。
send_timeout 30; location下面的
proxy_connect_timeout 4;
# 没有接收数据关闭 等候后端服务器响应时间 这个可以响应的时间
proxy_read_timeout 4; # 秒
# 没有发送数据关闭 后端服务器数据回传时间
proxy_send_timeout 60; Study From: https://www.cnblogs.com/sunxun/p/15476377.html

Nginx的Keepalive的简单学习的更多相关文章

  1. Linux yum的配置 , python环境管理, nginx搭建简单学习

    Linux yum的配置 , python环境管理, nginx搭建简单学习 一丶配置yum的数据仓库 ### yum 工具, 方便,自行解决软件之间的依赖关系. # 配置yum源仓库 (可以使用,清 ...

  2. Nginx负载均衡配置简单配置方法

    http://www.jb51.net/article/121235.htm Nginx作为负载均衡服务器,用户请求先到达nginx,再由nginx根据负载配置将请求转发至不同的Web服务器.下面通过 ...

  3. Windows 下 Docker 的简单学习使用过程之一 dockertoolbox

    1. Windows 下面运行 Docker 的两个主要工具1): Docker for Windows2): DockerToolbox区别:Docker For Windows 可以理解为是新一代 ...

  4. Laravel 5.1 简单学习

    Laravel 5.1 简单学习 (1)Laravel的nginx配置,不配置或者配置错误,可能会报404或500错误,访问不到页面. location / { try_files $uri $uri ...

  5. Log4j简单学习笔记

    log4j结构图: 结构图展现出了log4j的主结构.logger:表示记录器,即数据来源:appender:输出源,即输出方式(如:控制台.文件...)layout:输出布局 Logger机滤器:常 ...

  6. nginx配合IIS实现简单负载均衡

    1.IIS 部署两个站点端口分别为8081和8082 8081站点和8082站点如下[随便写了个没有样式的很丑的页面],我特意加了111和222区分     2.设置nginx配置文件,实现简单的负载 ...

  7. nginx跨域的简单应用

    nginx跨域的简单应用 要求:1.浏览器访问print.qianbaihe.wang/zt 直接调转至 www.flybirdprint.com/zt,浏览器显示域名不变. server { lis ...

  8. shiro简单学习的简单总结

    权限和我有很大渊源. 培训时候的最后一个项目是OA,权限那块却不知如何入手,最后以不是我写的那个模块应付面试. 最开始的是使用session装载用户登录信息,使用简单权限拦截器做到权限控制,利用资源文 ...

  9. CentOS 简单学习 firewalld的使用

    1. centos7 开始 使用firewalld 代替了 iptables 命令工具为 firewall-cmd 帮助信息非常长,简单放到文末 2. 简单使用 首先开启 httpd 一般都自带安装了 ...

  10. 在MVC中实现和网站不同服务器的批量文件下载以及NPOI下载数据到Excel的简单学习

    嘿嘿,我来啦,最近忙啦几天,使用MVC把应该实现的一些功能实现了,说起来做项目,实属感觉蛮好的,即可以学习新的东西,又可以增加自己之前知道的知识的巩固,不得不说是双丰收啊,其实这周来就开始面对下载在挣 ...

随机推荐

  1. 云图说 | GPU共享型AI容器,让AI开发更普及

    摘要:容器以其独特的技术优势,已经成为业界主流的AI计算框架(如Tensorflow.Caffe)的核心引擎,为了进一步解决企业在AI计算性能与成本上面临的问题,华为云量身打造了AI容器产品. 容器以 ...

  2. Java程序员都要懂得知识点:原始数据类型

    摘要:Java原始数据类型有short.byte.int.long.boolean.char.float.double.原始数据是未处理的或简化的数据,它构成了物理存在的数据,原始数据具有多种存在形式 ...

  3. 华为云AI论文精读会2021第一期:高效语义分割模型Fast-SCNN分享

    2020年举办的华为云AI经典论文复现活动,不仅受到了参赛者们一致好评,也产出了许多优质的算法成果.这些论文复现的算法描述.源代码以及算法使用指导文档均已发布到了AI Gallery.为了让开发者更好 ...

  4. 不信谣不传谣,亲自动手验证ModelBox推理是否真的“高性能”

    摘要:"高性能推理"是ModelBox宣传的主要特性之一,不信谣不传谣的我决定通过原生API和ModelBox实现相同案例进行对比,看一下ModelBox推理是否真的"高 ...

  5. 云图说|Git云上仓库哪家好?一张图了解华为云代码托管服务

    阅识风云是华为云信息大咖,擅长将复杂信息多元化呈现,其出品的一张图(云图说).深入浅出的博文(云小课)或短视频(云视厅)总有一款能让您快速上手华为云.更多精彩内容请单击此处. 摘要: 云办公时代已然到 ...

  6. 火山引擎 DataTester“智能发布”:覆盖产品研发、测试、上线全流程,一站式智能管理 A/B 实验

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,并进入官方交流群 A/B 测试是企业产品新老功能迭代时,进行效果监测的方法.通过 A/B 测试,可以提高功能改动给产品带来正向收益的确定性. ...

  7. Html 表格 在线转 Markdown

    复制 HTML Table F12 查看网页源代码 Html to markdown 在线转换 https://tableconvert.com/html-to-markdown 复制 Markdow ...

  8. Denso Create Programming Contest 2022(AtCoder Beginner Contest 239) E~F 题

    E - Subtree K-th Max 题意:给定一个以 \(1\) 为根的树,节点个数为 \(n(\le 1e5)\),每个点都有自己的点权.需要回答 \(m(\le1e5)\) 次询问.每次询问 ...

  9. SCA 技术进阶系列(二):代码同源检测技术在供应链安全治理中的应用

    直击痛点:为什么需要同源检测 随着 "数字中国" 建设的不断提速,企业在数字化转型的创新实践中不断加大对开源技术的应用,引入开源组件完成应用需求开发已经成为了大多数研发工程师开发软 ...

  10. <vue 组件 4、插槽的使用>

    代码结构 一.     01-slot-插槽的基本使用 1. 效果 同样的一个插槽,父组件调用的时候不同展现的内容就不同 2.代码 01-slot-插槽的基本使用.html <!DOCTYPE ...