nginx源码学习——Http连接对应的事件驱动模块

本文详细探讨了nginx的事件驱动模型,从main进程到worker进程的事件处理流程,重点讲解了等待连接请求、连接建立、处理HTTP请求及连接关闭的过程。在事件驱动函数中,nginx利用epoll进行高效IO处理,worker进程在ngx_process_events_and_timers函数中等待连接请求。连接建立时,ngx_event_accept处理函数接受TCP连接,http模块初始化时设定监听回调。处理请求阶段,ngx_http_wait_request_handler解析报文并执行请求处理。最后,当连接关闭时,一系列的释放和关闭操作确保资源得到妥善管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

事件驱动函数

事件驱动是nginx设计的核心,linux平台下,nginx会优先使用epoll进行事件处理。main—>master_process_cycle—>ngx_start_worker_process—>ngx_worker_process_cycle—>ngx_worker_process_init,ngx_process_events_and_timers。master进程中创建worker进程,之后在ngx_worker_process_cycle函数中初始化,并打开socketpair,加入epoll中。随后进入ngx_process_events_and_timers函数,等待http连接请求。nginx作为web服务器,性能要求很高,对最耗时的IO进行异步处理。注册到epoll上,作为一个个事件待触发。定义的事件处理函数如下:

ngx_event_module_t  ngx_epoll_module_ctx = {
    &epoll_name,
    ngx_epoll_create_conf,               /* create configuration */
    ngx_epoll_init_conf,                 /* init configuration */

    {
        ngx_epoll_add_event,             /* add an event */
        ngx_epoll_del_event,             /* delete an event */
        ngx_epoll_add_event,             /* enable an event */
        ngx_epoll_del_event,             /* disable an event */
        ngx_epoll_add_connection,        /* add an connection */
        ngx_epoll_del_connection,        /* delete an connection */
        NULL,                            /* process the changes */
        ngx_epoll_process_events,        /* process the events */
        ngx_epoll_init,                  /* init the events */
        ngx_epoll_done,                  /* done the events */
    }
};

等待连接请求

worker进程启动后调用ngx_worker_process_init,初始化连接,监听80端口,之后不断调用ngx_process_events_and_timers 函数,等待http连接请求。

ngx_process_events_and_timers

    if (ngx_use_accept_mutex) {
        if (ngx_accept_disabled > 0) {
            ngx_accept_disabled--;
        //多进程情况下通过共享内存的互斥锁,同一时间只允许一个进程得到访问,解决惊群问题。
        } else {
        //得到互斥锁后,将对应端口的(Http默认为80端口)事件加入epoll,等待客户端连接请求,触发IO事件。
            if (ngx_trylock_accept_mutex(cycle) == NGX_ERROR) {
                return;
            }
        //多进程情况下,使用NGX_POST_EVENTS,将触发的事件放入队列中,而不是里面触发IO的回调函数
            if (ngx_accept_mutex_held) {
                flags |= NGX_POST_EVENTS;

            } else {
                if (timer == NGX_TIMER_INFINITE
                    || timer > ngx_accept_mutex_delay)
                {
                    timer = ngx_accept_mutex_delay;
                }
            }
        }
    }
   //调用的是ngx_epoll_process_events,执行的是epoll_wait,当有事件被触发时,将执行IO回调函数,或者将被触发的IO事件添加到链表。
    (void) ngx_process_events(cycle, timer, flags);
    //依次访问被触发的IO事件,执行回调
       if (ngx_posted_accept_events) {
        ngx_event_process_posted(cycle, &ngx_posted_accept_events);
    }
    //释放共享互斥锁
    if (ngx_accept_mutex_held) {
        ngx_shmtx_unlock(&ngx_accept_mutex);
    }
    //处理超时事件
    if (delta) {
        ngx_event_expire_timers();
    }

    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值