文章目录
Nginx的模块种类有很多,除了HTTP模块,还有一些核心模块和mail系列模块。核心模块主要是做一些基础功能,
比如Nginx的启动初始化,event处理机制,错误日志的初始化,ssl的初始化,正则处理初始化。
mail模块可以对imap,pop3,smtp等协议进行反向代理,这些模块本身不对邮件内容进行处理。
core模块
Nginx启动模块
- 启动模块从启动Nginx进程开始,做了一系列的初始化工作,源代码位于src/core/nginx.c,从main函数开始:
- 时间、正则、错误日志、ssl等初始化。
- 读入命令行参数。
- OS相关初始化。
- 读入并解析配置。
- 核心模块初始化。
- 创建各种暂时文件和目录。
- 创建共享内存。
- 打开listen的端口。
- 所有模块初始化。
- 启动worker进程。
event模块
event的类型和功能
Nginx是以event(事件)处理模型为基础的。它为了支持跨平台,抽象出了event模块。
- 它支持的event处理类型有:
- AIO(异步IO)
- /dev/poll(Solaris 和Unix特有)
- epoll(Linux特有)
- eventport(Solaris 10特有)
- kqueue(BSD特有)
- poll,rtsig(实时信号),select等。
event模块的主要功能就是,对accept后建立的连接进行监听,对读写事件进行添加删除。事件处理模型和Nginx的非阻塞IO模型结合在一起使用。
当IO可读可写的时候,相应的读写事件就会被唤醒,此时就会去处理事件的回调函数。
特别对于Linux,Nginx大部分event采用epoll EPOLLET(边沿触发)的方法来触发事件,只有listen端口的读事件是EPOLLLT(水平触发)。
对于边沿触发,如果出现了可读事件,必须及时处理,否则可能会出现读事件不再触发,连接饿死的情况。
event处理抽象出来的关键结构体 ngx_event_actions_t 如下:
typedef struct {
// 添加删除事件
ngx_int_t (*add)(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags);
ngx_int_t (*del)(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags);
ngx_int_t (*enable)(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags);
ngx_int_t (*disable)(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags);
// 添加删除连接,同时会监听读写事件
ngx_int_t (*add_conn)(ngx_connection_t *c);
ngx_int_t (*del_conn)(ngx_connection_t *c, ngx_uint_t flags);
ngx_int_t (*notify)(ngx_event_handler_pt handler);
// 处理事件函数
ngx_int_t (*process_events)(ngx_cycle_t *cycle, ngx_msec_t timer,
ngx_uint_t flags);
ngx_int_t (*init)(ngx_cycle_t *cycle, ngx_msec_t timer);
void (*done)(ngx_cycle_t *cycle);
} ngx_event_actions_t;
可以看到,每个event处理模型,都需要实现部分功能。最关键的是add和del功能,就是最基本的添加和删除事件的函数。
accept锁
Nginx是多进程程序,80端口是各进程所共享的,多进程同时listen 80端口,势必会产生竞争,也产生了所谓的“惊群”效应

文章详细介绍了Nginx的核心模块,包括启动过程、event模块的各种事件处理类型和accept锁机制,以及定时器和变量的使用。Nginx通过事件驱动模型处理连接,并使用accept锁避免多进程竞争,保证高效运行。此外,文章还提到了Nginx的变量系统,包括如何创建和使用变量。
最低0.47元/天 解锁文章
815

被折叠的 条评论
为什么被折叠?



