nginx中http1.1 KeepAlive 失效

KeepAlive介绍和优劣势

定义:HTTP的KeepAlive就是浏览器和服务端之间保持长连接,这个连接是可以复用的。当客户端发送一次请求,收到相应内容后,这个连接会保持一段时间,在该时间内的第二次就不需要再重新建立连接,就可以直接使用这次的连接来发送请求了,极大的提高了访问速度。

优点:Keep-Alive模式更加高效,因为避免了连接建立和释放的开销。,提高访问速度
缺点:长时间的Tcp连接容易导致系统资源无效占用,浪费系统资源。

注意:http 1.0 中默认是关闭的,需要在http头加入”Connection: Keep-Alive”,才能启用 Keep-Alive; 
http 1.1 中默认启用Keep-Alive,如果加入”Connection: close ”,才会关闭 Keep-Alive

现象

最近优化网站的访问速度,学习了一些关于http的知识,尤其是关于长连接可以提高访问效率,在我们自己的网站上测试了一下,发现我们使用的全部是短连接,即 Response  Headers 中的 Connection: 属性是close ,这样就会导致网站访问速度木有那么快,如下图:

原因

对于http1.1的请求,默认是开启 keepalive(长连接) 的,那怎么会出现变成短连接的情况呢?下面介绍一下排查过程

1、首先确定 http 请求是具体的哪个版本,直接查看浏览器请求,如下图:

从上图可知 http 版本确实是 1.1 的

2、查看某个应用所在机器上的 nginx 的配置文件 nginx.conf 的配置,keepalive_timeout 属性根本没有配置 ,如下图:

3、猜想一下,难道是必须配置 keepalive_timeout 属性才能生效吗?将 keepalive_timeout 设置为60s,如下图:

重启nginx之后发现,请求都还是短连接,Response  Headers 中的 Connection 仍然是 close的

4、后来咨询运维人员,他们说我们每个机器的上游还有一个总机器控制着nginx的转发,我们就赶紧查看总机器上的 nginx 的 nginx.conf 配置文件,如下图:

我们马上将 keepalive_timeout 的值注释了 或者 修改为 60s 之后,重启 nginx,访问网站,长连接终于生效了,如下图:

总结原因:运维人员在总 nginx 入口配置了 keepalive_timeout = 0 导致长连接失效

解决方案

1、如果是 http 1.1 的话,nginx.conf 中不需要配置 keepalive_timeout 属性

2、nginx.conf 中需要配置 keepalive_timeout 值大于0

注意:如果存在nginx 总入口,总 nginx 配置起决定性作用,转发到的具体应用机器的 nginx 配置不会生效,所以配置一定要配置到总 nginx 的 nginx.conf 中

总结

1、KeepAlive开启对内存要求高,KeepAlive关闭对CPU要求高
2、如果内存和CPU都足够,开启和关闭KeepAlive对性能影响不大
3、如果考虑服务器压力,如果是静态页面,大量的调用js或者图片的话,建议开启KeepAlive;如果是动态网页,建议关闭KeepAlive

如果想详细了解 nginx中http的 KeepAlive 配置,请查看这个详解Nginx中HTTP的keepalive相关配置 博客

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值