原文:

http://bollaxu.iteye.com/blog/900424

Nginx upstream目前只有短连接,通过HTTP/1.0向后端发起连接,并把请求的"Connection" header设为"close"。Nginx与前端的连接默认为长连接,一个用户跟Nginx建立连接之后,通过这个长连接发送多个请求。如果Nginx只是作为reverse proxy的话,可能一个用户连接就需要多个向后端的短连接。如果后端的服务器(源站或是缓存服务器)处理并发连接能力不强的话(比如单进程的squid),就可能导致瓶颈的出现。

Nginx目前的upstream连接建立和获取的机制如下图。Nginx会在一开始创建connection pool(进程间不共享,可以避免锁),提供给所有向前/后的连接。

如果要实现upstream长连接,则每个进程需要另外一个connection pool,里面都是长连接。一旦与后端服务器建立连接,则在当前请求连接结束之后不会立即关闭连接,而是把用完的连接保存在一个keepalive connection pool里面,以后每次需要建立向后连接的时候,只需要从这个连接池里面找,如果找到合适的连接的话,就可以直接来用这个连接,不需要重新创建socket或者发起connect()。这样既省下建立连接时在握手的时间消耗,又可以避免TCP连接的slow start。如果在keepalive连接池找不到合适的连接,那就按照原来的步骤重新建立连接。假设连接查找时间可以忽略不计,那么这种方法肯定是有益而无害的(当然,需要少量额外的内存)。

具体如何来设计这个keepalive connection pool,不同人有不同的选择。比如Nginx目前的第三方模块upstream keepalive(作者Maxim Dounin)使用了一个queue来做。因为upstream的服务器很可能是多个,所以可能当保持的连接数多的时候,查找的时间可能会较长。可以给每个upstream服务器都分配一个pool(queue),缩短查找时间。但是总体来说内存操作很快,影响不会很大。upstream keepalive模块目前只支持memcached,但是可以重用其代码来达到对http upstream的长连接。在upstream模块和反向代理(二)里面highlight了一些改动的地方。由于Nginx作者之前没有考虑upstream的长连接,所以在设计上要把http upstream keepalive模块化可能比较难,只能通过手动修改代码来做到。

最新文章

  1. .NET Core 1.0.1 升级汇总
  2. jmeter 中的 Beanshell 使用
  3. [原创]cocos2d-x研习录-第三阶 特性之调度器
  4. P141 实战练习——字符串(修改后)
  5. 大神是如何玩C语言的!
  6. iTween基础之Look(使对象面朝指定位置)
  7. Java学习笔记之:Java String类
  8. CodeFile与CodeBehind的区别
  9. 【Java&Android开源库代码剖析】のandroid-smart-image-view
  10. PHP自定义错误处理
  11. oFixed() 方法
  12. jquery刷新iframe页面的方法(兼容主流)
  13. Head First 设计模式 第6章 命令模式
  14. 大数据平台搭建-hadoop/hbase集群的搭建
  15. 关于事件mouseover ,mouseout ,mouseenter,mouseleave的区别
  16. 【公众号系列】SAP HANA和区块链
  17. March 03rd, 2018 Week 9th Saturday
  18. tp5的路由
  19. libgdx学习记录21——Box2d物理引擎之碰撞Contact、冲量Impulse、关节Joint
  20. Ubuntu与Windows7双系统下, 系统时间不一致的问题

热门文章

  1. Dynamic CRM 2013学习笔记(十八)根据主表状态用JS控制子表自定义按钮
  2. Windows Server 2008 64 位 IIS7.5 ASP.NET MVC4 发布问题
  3. JS学习笔记11_高级技巧
  4. [C++] C/C++结构体的区别
  5. Unity3d碰撞检测中碰撞器与触发器的区别
  6. css圆环百分比
  7. 有助于提高你的 Web 开发技能的7个模式库
  8. C语言实现快速排序
  9. js手风琴图片切换实现原理及函数分析
  10. JProfiler8 注册码序列号