Nginx对请求的处理是通过事件触发的,模块作为事件消费者,仅仅能被事件收集、分发器调用。这与传统的Webserver是不同的。

传统的Webserver下,一个请求由一个进程消费。请求在建立连接后将始终占用着系统资源,直到连接关闭才会释放资源。这样做有下面缺点:

  • 进程数添加会添加进程间切换的负担。影响系统总体性能。

  • 当某个进程要等待事件发生而处于堵塞状态时,该进程仍然占用内存资源直到该请求结束。造成资源极大浪费。
在Nginx中,接收到一个请求时,不会产生一个单独的进程来处理该请求,而是由事件收集、分发器(进程)调用某个模块,由模块处理请求。处理完后再返回到事件收集、分发器,例如以下图所看到的:

左側按序号收集事件。右側按序号调用消费者模块。从图中能够看出这样的设计的一个弊端:当某个消费者模块堵塞而无法返回到事件收集、分发器,使得后者无法继续监听事件,终于导致其他事件得不到及时响应。全部,时间消费者的代码中不能有堵塞行为!

说到事件驱动机制,就要联系到异步处理了。由于两者是密切相关的:多阶段异步处理仅仅能基于事件驱动框架实现。一个HTTP请求包括多个阶段。每一个阶段在什么时候发生是不确定的,这就造成了异步性。每一个阶段的发生都会触发事件驱动框架。然后交由事件消费者处理。也就是说一个事件消费者仅仅是处理了一个请求中的一小部分。Nginx採用这种设计,减少了进程休眠的几率,从而提高网络性能、减少请求延时。

所以,Nginx的这种设计server的并发连接数可以达到十万甚至百万级别。


參考:
《深入理解Nginx》 P263-P267.

最新文章

  1. 【Tomcat】配置Tomcat
  2. jsp include flush true
  3. Ubuntu下使用vsftpd实现FTP
  4. 【代码笔记】iOS-评分系统(小星星)
  5. vs中不得不会的一些小技巧(1)——细说查找
  6. 第三个Sprint冲刺第四天
  7. C++实现的屏幕截图软件 v1.0
  8. SO修改
  9. DEDE的data目录名称修改方法
  10. ios fixed属性bug解决方法
  11. Ceph相关博客、网站(256篇OpenStack博客)
  12. 关于window.location.href="delete_emp.do?id"+id;
  13. 转:JAVA里面的int类型 和Integer类型,有什么不一样
  14. 201621123062《java程序设计》第二周学习总结
  15. c++11线程池
  16. java 中根据类的属性排序
  17. <记录> PHP监控进程状态,完成掉线自动重启
  18. Luogu P3327 [SDOI2015]约数个数和
  19. [机器学习] 训练集(train set) 验证集(validation set) 测试集(test set)
  20. spring冲刺第六天

热门文章

  1. 元类相关(type & metaclass)
  2. css图像处理与动画
  3. 《Effective Java》笔记 :(一)创建和销毁对象
  4. HLG2179 组合(dfs水水更健康)
  5. SpriteKit-(SKNode)
  6. NOI2016 区间 【线段树】
  7. mysql的简单介绍
  8. python time模块 sys模块 collections模块 random模块 os模块 序列化 datetime模块
  9. svg优雅降级技术
  10. Address already in use: AH00072: make_sock: could not bind to address 0.0.0.0:80