Nginx学习(10)—— event模块、core模块、变量

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

Nginx的模块种类有很多,除了HTTP模块,还有一些核心模块和mail系列模块。核心模块主要是做一些基础功能,
比如Nginx的启动初始化,event处理机制,错误日志的初始化,ssl的初始化,正则处理初始化。
mail模块可以对imap,pop3,smtp等协议进行反向代理,这些模块本身不对邮件内容进行处理。

core模块

Nginx启动模块

  • 启动模块从启动Nginx进程开始,做了一系列的初始化工作,源代码位于src/core/nginx.c,从main函数开始:
    1. 时间、正则、错误日志、ssl等初始化。
    2. 读入命令行参数。
    3. OS相关初始化。
    4. 读入并解析配置。
    5. 核心模块初始化。
    6. 创建各种暂时文件和目录。
    7. 创建共享内存。
    8. 打开listen的端口。
    9. 所有模块初始化。
    10. 启动worker进程。

event模块

event的类型和功能

Nginx是以event(事件)处理模型为基础的。它为了支持跨平台,抽象出了event模块。

  • 它支持的event处理类型有:
    1. AIO(异步IO)
    2. /dev/poll(Solaris 和Unix特有)
    3. epoll(Linux特有)
    4. eventport(Solaris 10特有)
    5. kqueue(BSD特有)
    6. 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端口,势必会产生竞争,也产生了所谓的“惊群”效应

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值