高性能Web服务器详解(Nginx)
服务器架构
模块划分
- 核心功能模块
- 标准HTTP模块
- 可选HTTP模块
- 邮件服务模块
- 第三方模块
事件驱动模型
- select库:轮询所有事件描述符集合中的每一个事件描述符;
- poll库:select为读、写、异常时间分别创建一个描述符集合,需要轮询三个集合;poll创建一个集合,在每个描述符结构上设置标志,轮询的时候同时检查;
- epoll库:对上面的优化,时间描述符个数;轮序策略,活跃度的描述符进行操作;节省内核到用户空间的一次数据拷贝;
- kqueue 库:是对特定BSD平台的模型,支持条件触发(水平触发,只要满足条件就发一个事件)和边缘触发(每当状态变换时,触发一个事件)。
线程类型
- 主进程
- 工作进程
- Cache Loader & Cache Manager
nginx的时间管理
传统的系统需要中断、陷入内核。设计用户态和内核态的切换,开销大。gettimeofday()函数调用系统调用sys_gettimeofday(),但是在x86_64体系中,该系统调用使用vsyscall获取内核信息,避免中断。从而会提高效率。
nginx的内存管理
nginx的工作进程
配置
杂记
概念篇
惊群:当一个网络连接过来的时候,多个线程会被唤醒,但是最终只有一个线程接受请求,所以其他线程的唤醒操作都是浪费的。为避免线程对连接的争抢,
1accept_mutext on | off // defualt is on正向代理、反向代理:正向代理,我们的角色是客户端,目的是要访问外网的资源;在反向代理服务器中,我们的角色是站点,目的吧站点的资源发布出去让其他客户端能够访问。