web服务器设计中的关键约束
性能
网络性能、单次请求的延迟性、网络效率
可伸缩性
简单性
可修改性
可进化性、可扩展性、可定制性、可配置性、可重用性
可见性
关键组件的运行情况可以被监控的程度
可移植性
可靠性
nginx的架构设计
优秀的模块化设计
高度抽象的模块接口
所有模块都遵循同样的ngx_module_t接口设计规范,这种方式带来了良好的简单性、静态可扩展性、可重用性
模块接口非常简单,具有很高的灵活性
模块的基本接口ngx_module_t足够简单,只涉及模块的初始化、退出及对配置项的处理
ngx_module_t结构体作为所有模块的通用接口,它只定义了init_master、init_module、init_process、init_thread、exit_thread、exit_process、exit_master;
ngx_command_t类型的commands数组则指定了模块处理配置项的方法。
配置模块的设计
ngx_conf_module提供了高可用性、高可扩展性、高可定制性、高可伸缩性
核心模块接口的简单化
官方的核心类型模块共有6个具体模块:ngx_core_module、ngx_errlog_module、ngx_events_module、ngx_openssl_module、ngx_http_module、ngx_mail_module
多层次、多类别的模块设计
事件驱动架构
nginx不会使用进程或线程来作为事件消费者,所谓的事件消费者只能是某个模块。
请求的多阶段异步处理
将阻塞进程的方法按照相关的触发事件分解为两个阶段
将阻塞方法调用按照时间分解为多个阶段的方法调用
在“无所事事”且必须等待系统的响应,从而导致进程空转时,使用定时器划分阶段
如果阻塞方法完全无法继续划分,则必须使用独立的进程执行这个阻塞方法
管理进程、多工作进程设计
优点:
- 利用多核系统的并发处理能力
- 负载均衡
- 管理进程或负责监控工作进程的状态,并负责管理其行为
平台无关的代码实现
内存池的设计
这种内存池的最大优点在于:把多次向系统申请内存的操作整合成一次,这大大减少CPU资源的消耗,同时减少了内存碎片