高度模块化的设计是Nginx的架构基础。在Nginx中,出来少量核心代码,其他一切皆为模块。这种模块化设计同时具有以下几个特点:
- 高度抽象的模块接口
- 所有的模块都遵循着同样的
nginx_module_t接口设计规范,这减少了整个系统中的变数,具有良好的简单性,静态可扩展性,可重用性。
- 所有的模块都遵循着同样的
- 模块接口简单,具有灵活性
模块的基本接口 ngx_module_t 足够简单,只涉及模块的初始化,退出以及对配置项的处理,这同时也带来了灵活性,使得Nginx比较简单地实现了动态可修改性,也就是保持服务正常运行下使系统功能发生改变
- 配置模块的设计
nginx不会使用进程或线程来作为事件消费者,所谓的事件消费者只能是某个模块(这里没有进程的概念)。只有事件收集,分发器才有资格占用进程资源,它们会在分发某个事件时调用事件消费模块使用当前占用的进程资源。
所以可以看出传统web服务器与nginx间的重要差别:前者是每个事件消费者独占一个进程资源,后者的事件消费者只是被事件分发者进程短期调用而已。这种设计使得网络性能,用户感知的请求延时都得到提升,每个用户的请求所产生的事件会及时响应,整个服务器的网络吞吐量都会由事件的及时响应而增大。
但是这样就不允许每个事件的消费者不能有阻塞行为,否则将会由于长时间占用事件分发者进程而导致其他事件得不到及时响应。尤其是每个事件消费者不可以让进程转变为休眠状态或等待状态,如在等待一个信号量条件的满足时会使进程进入休眠状态。这加大了事件消费程序的开发者的开发难度。
