NGX --- ACCEPT事件处理

本文深入探讨了NGINX中ACCEPT事件的处理流程,从ngx_process_events_and_timers函数开始,讲解了如何处理ACCEPT事件,包括ngx_event_process_posted函数的使用以及ngx_event_accept处理函数的注册。文中提到了事件结构ngx_event_s,特别是accept字段和handler钩子函数,指出ngx_event_process_init函数在初始化阶段为ACCEPT事件分配资源并设置处理函数。

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

ngx_event_accept



void
ngx_process_events_and_timers(ngx_cycle_t *cycle)
{
    ngx_uint_t  flags;
    ngx_msec_t  timer, delta;
	......


    delta = ngx_current_msec;
    
    // 处理事件ngx_epoll_process_events
    (void) ngx_process_events(cycle, timer, flags);

    delta = ngx_current_msec - delta;

    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
                   "timer delta: %M", delta);
    
    // 这个是ACCEPT 事件队列指针
    if (ngx_posted_accept_events) {
        ngx_event_process_posted(cycle, &ngx_posted_accept_events); //--------->此处处理ACCEPT事件
    }

	......
}
// 事件处理函数
void
ngx_event_process_posted(ngx_cycle_t *cycle,
    ngx_thread_volatile ngx_event_t **posted)
{
    ngx_event_t  *ev;

    for ( ;; ) {

        ev = (ngx_event_t *) *posted;

        ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
                      "posted event %p", ev);

        if (ev == NULL) {
            // 处理完事件后退出循环
            return;
        }
		// 从ngx_posted_accept_events 事件队列上取下事件
        ngx_delete_posted_event(ev);
		
		// 调用事件处理函数处理事件,这里是调用ngx_event_accept处理ACCEPT事件
        ev->handler(ev);
    }
}

// 暂时不看ngx_event_accept的处理流程,先看看事件的结构


struct ngx_event_s {
    void            *data;

    unsigned         write:1;       // 写事件

    unsigned         accept:1;      // accept 事件

    /* used to detect the stale events in kqueue, rtsig, and epoll */
    unsigned         instance:1;    //  用于检测过时事件

    /*
     * the event was passed or would be passed to a kernel;
     * in aio mode - operation was posted.
     */
    unsigned         active:1;      // 

    unsigned         disabled:1;

    /* the ready event; in aio mode 0 means that no operation can be posted */
    unsigned         ready:1;

    unsigned         oneshot:1;

    /* aio operation is complete */
    unsigned         complete:1;
	
	......
	// 事件处理函数钩子函数,这个钩子函数应该是在事件发生的时候注册上去的,是这样吗?
	// 
    ngx_event_handler_pt  handler;      


	......

    /* the links of the posted queue */
    ngx_event_t     *next;
    ngx_event_t    **prev;

	......
};
// 搜索下,看看这个事件处理钩子函数是在什么时候注册上去的,选取其中一部分的内容如下
Ngx_event.c (src\event):            rev->handler = ngx_event_acceptex;
Ngx_event.c (src\event):            ls[i].log.handler = ngx_acceptex_log_error;
Ngx_event.c (src\event):            rev->handler = ngx_event_accept;
Ngx_event.c (src\event):        rev->handler = ngx_event_accept;
Ngx_event.h (src\event):    ngx_event_handler_pt  handler;      // 事件处理函数钩子函数
Ngx_event.h (src\event):    ngx_event_handler_pt       handler;
Ngx_eventport_module.c (src\event\modules):                 * active handler
Ngx_eventport_module.c (src\event\modules):                    rev->handler(rev);
Ngx_eventport_module.c (src\event\modules):                    wev->handler(wev);
Ngx_event_accept.c (src\event):        log->handler = NULL;
Ngx_event_accept.c (src\event):        ls->handler(c);
Ngx_event_busy_lock.c (src\event):        ctx->event->handler = ngx_event_busy_lock_handler;
Ngx_event_busy_lock.c (src\event):            ctx->event->handler = ngx_event_busy_lock_handler;
Ngx_event_busy_lock.c (src\event):            wakeup->handler = ngx_event_busy_lock_posted_handler;
Ngx_event_busy_lock.c (src\event):        wakeup->handler = ngx_event_busy_lock_posted_handler;
Ngx_event_busy_lock.c (src\event):    ev->handler = ngx_event_busy_lock_posted_handler;

// 我们看到,不同的事件被注册了不同的处理函数,这里我们关心ACCEPT事件
// 只有在ngx_event_process_init函数中才有注册ngx_event_accept处理函数

static ngx_int_t
ngx_event_process_init(ngx_cycle_t *cycle)
{
    ngx_uint_t           m, i;
    ngx_event_t         *rev, *wev;
    ngx_listening_t     *ls;
    ngx_connection_t    *c, *next, *old;
    ngx_core_conf_t     *ccf;
    ngx_event_conf_t    *ecf;
    ngx_event_module_t  *module;

	......

#if (NGX_WIN32)
	......

#else
        // 注册ACCEPT事件处理函数
        rev->handler = ngx_event_accept;

        if (ngx_use_accept_mutex) {
            continue;
        }

        if (ngx_event_flags & NGX_USE_RTSIG_EVENT) {
            if (ngx_add_conn(c) == NGX_ERROR) {
                return NGX_ERROR;
            }

        } else {
            if (ngx_add_event(rev, NGX_READ_EVENT, 0) == NGX_ERROR) {
                return NGX_ERROR;
            }
        }

#endif

    }

    return NGX_OK;
}
// 按照我们正常的理解,应当时当ACCEPT事件发生的时候,我们生产一个事件
// 结构的事件数据,并且设置为ACCEPT事件,并且设置处理钩子函数。
// 我们再来看下ngx_event_process_init函数的另外一部分代码实现
static ngx_int_t
ngx_event_process_init(ngx_cycle_t *cycle)
{
    ngx_uint_t           m, i;
    ngx_event_t         *rev, *wev;
    ngx_listening_t     *ls;
    ngx_connection_t    *c, *next, *old;
    ngx_core_conf_t     *ccf;
    ngx_event_conf_t    *ecf;
    ngx_event_module_t  *module;

	......

#endif
    // 分配连接池
    cycle->connections =
        ngx_alloc(sizeof(ngx_connection_t) * cycle->connection_n, cycle->log);
    if (cycle->connections == NULL) {
        return NGX_ERROR;
    }
    // 获取连接池地址
    c = cycle->connections;

    // 分配读事件池,有多少连接就有多少事件结构数据
    cycle->read_events = ngx_alloc(sizeof(ngx_event_t) * cycle->connection_n,
                                   cycle->log);
    if (cycle->read_events == NULL) {
        return NGX_ERROR;
    }
    
    // 获取读事件池地址
    rev = cycle->read_events;

    // 设置全部读事件部分属性
    for (i = 0; i < cycle->connection_n; i++) {
        rev[i].closed = 1;
        rev[i].instance = 1;
#if (NGX_THREADS)
        rev[i].lock = &c[i].lock;
        rev[i].own_lock = &c[i].lock;
#endif
    }
    
    // 分配写事件池,有多少连接就有多少事件结构数据
    cycle->write_events = ngx_alloc(sizeof(ngx_event_t) * cycle->connection_n,
                                    cycle->log);
    if (cycle->write_events == NULL) {
        return NGX_ERROR;
    }

    // 获取写事件地址
    wev = cycle->write_events;

    // 设置全部写事件部分属性
    for (i = 0; i < cycle->connection_n; i++) {
        wev[i].closed = 1;
#if (NGX_THREADS)
        wev[i].lock = &c[i].lock;
        wev[i].own_lock = &c[i].lock;
#endif
    }
    // 连接总数
    i = cycle->connection_n;
    next = NULL;

    // 将读写事件挂接到连接数据结构上
    do {
        i--;

        c[i].data = next;
        c[i].read = &cycle->read_events[i];
        c[i].write = &cycle->write_events[i];
        c[i].fd = (ngx_socket_t) -1;

        next = &c[i];

#if (NGX_THREADS)
        c[i].lock = 0;
#endif
    } while (i);

    // 挂接到空闲连接数组上
    cycle->free_connections = next;
    cycle->free_connection_n = cycle->connection_n;
	
#if (NGX_WIN32)
	......

#else
        // 注册ACCEPT事件处理函数
        rev->handler = ngx_event_accept;

        if (ngx_use_accept_mutex) {
            continue;
        }

        if (ngx_event_flags & NGX_USE_RTSIG_EVENT) {
            if (ngx_add_conn(c) == NGX_ERROR) {
                return NGX_ERROR;
            }

        } else {
            if (ngx_add_event(rev, NGX_READ_EVENT, 0) == NGX_ERROR) {
                return NGX_ERROR;
            }
        }

#endif
		......
}


npm WARN ERESOLVE overriding peer dependency npm WARN While resolving: ues-tiny@0.0.0 npm WARN Found: rxjs@6.4.0 npm WARN node_modules/rxjs npm WARN rxjs@"^6.5.3" from the root project npm WARN 4 more (@ant-design/icons-angular, @ngx-translate/core, ...) npm WARN npm WARN Could not resolve dependency: npm WARN peer rxjs@"~6.5.3" from ng-zorro-antd@9.3.0 npm WARN node_modules/ng-zorro-antd npm WARN ng-zorro-antd@"^9.3.0" from the root project npm WARN 1 more (@nsfocus-ues/ues-common) npm WARN ERESOLVE overriding peer dependency npm WARN While resolving: ues-tiny@0.0.0 npm WARN Found: rxjs@6.4.0 npm WARN node_modules/rxjs npm WARN rxjs@"^6.5.3" from the root project npm WARN 4 more (@ant-design/icons-angular, @ngx-translate/core, ...) npm WARN npm WARN Could not resolve dependency: npm WARN peer rxjs@"~6.5.3" from ng-zorro-antd@9.3.0 npm WARN node_modules/ng-zorro-antd npm WARN ng-zorro-antd@"^9.3.0" from the root project npm WARN 1 more (@nsfocus-ues/ues-common) npm ERR! code ERESOLVE npm ERR! ERESOLVE could not resolve npm ERR! npm ERR! While resolving: ngx-json-viewer@3.0.2 npm ERR! Found: @angular/common@9.1.13 npm ERR! node_modules/@angular/common npm ERR! @angular/common@"^9.1.13" from the root project npm ERR! peer @angular/common@"^9.0.0 || ^10.0.0-0" from @angular/cdk@9.2.4 npm ERR! node_modules/@angular/cdk npm ERR! @angular/cdk@"^9.0.0" from ng-zorro-antd@9.3.0 npm ERR! node_modules/ng-zorro-antd npm ERR! ng-zorro-antd@"^9.3.0" from the root project npm ERR! 1 more (@nsfocus-ues/ues-common) npm ERR! 11 more (@angular/forms, @angular/platform-browser, ...) npm ERR! npm ERR! Could not resolve dependency: npm ERR! peer @angular/common@">=10.0.0" from ngx-json-viewer@3.0.2 npm ERR! node_modules/ngx-json-viewer npm ERR! ngx-json-viewer@"~3.0.2" from the root project npm ERR! npm ERR! Conflicting peer dependency: @angular/common@20.0.6 npm ERR! node_modules/@angular/common npm ERR! peer @angular/common@">=10.0.0" from ngx-json-viewer@3.0.2 npm ERR! node_modules/ngx-json-viewer npm ERR! ngx-json-viewer@"~3.0.2" from the root project npm ERR! npm ERR! Fix the upstream dependency conflict, or retry npm ERR! this command with --force, or --legacy-peer-deps npm ERR! to accept an incorrect (and potentially broken) dependency resolution. npm ERR! npm ERR! See C:\nvm\nvm\node_cache\eresolve-report.txt for a full report. npm ERR! A complete log of this run can be found in: npm ERR! C:\nvm\nvm\node_cache\_logs\2025-07-07T10_52_50_583Z-debug-0.log
最新发布
07-08
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值