ngx_disable_accept_events

📅 2026/7/12 18:10:12 👁️ 阅读次数 📝 编程学习
ngx_disable_accept_events

1 定义

ngx_disable_accept_events 函数 定义在 ./nginx-1.24.0/src/event/ngx_event_accept.c
staticngx_int_tngx_disable_accept_events(ngx_cycle_t*cycle,ngx_uint_tall){ngx_uint_ti;ngx_listening_t*ls;ngx_connection_t*c;ls=cycle->listening.elts;for(i=0;i<cycle->listening.nelts;i++){c=ls[i].connection;if(c==NULL||!c->read->active){continue;}#if(NGX_HAVE_REUSEPORT)/* * do not disable accept on worker's own sockets * when disabling accept events due to accept mutex */if(ls[i].reuseport&&!all){continue;}#endifif(ngx_del_event(c->read,NGX_READ_EVENT,NGX_DISABLE_EVENT)==NGX_ERROR){returnNGX_ERROR;}}returnNGX_OK;}
ngx_disable_accept_events 函数用于 禁用 Nginx 工作进程上所有(或部分)监听套接字的 accept 读事件, 从而暂停接受新的客户端连接。 当参数 `all` 为 0 时,它仅禁用非 `reuseport` 的套接字 当 `all` 为 1 时,则强制禁用全部监听事件(包括 `reuseport`)

2 详解

1 函数签名

staticngx_int_tngx_disable_accept_events(ngx_cycle_t*cycle,ngx_uint_tall)
返回值 NGX_OK( 0)表示操作成功; NGX_ERROR( -1)表示操作失败。
参数 1 ngx_cycle_t *cycle 指向当前运行周期上下文环境
参数 2 ngx_uint_t all 标志位,控制禁用的范围

2 逻辑流程

1 局部变量 2 遍历所有监听端口 3 返回成功

1 局部变量
{ngx_uint_ti;ngx_listening_t*ls;ngx_connection_t*c;

2 遍历所有监听端口
ls=cycle->listening.elts;for(i=0;i<cycle->listening.nelts;i++){c=ls[i].connection;if(c==NULL||!c->read->active){continue;}#if(NGX_HAVE_REUSEPORT)/* * do not disable accept on worker's own sockets * when disabling accept events due to accept mutex */if(ls[i].reuseport&&!all){continue;}#endifif(ngx_del_event(c->read,NGX_READ_EVENT,NGX_DISABLE_EVENT)==NGX_ERROR){returnNGX_ERROR;}}
#1 获取第 i 个监听端口关联的连接对象 c 检查两种需跳过的情况: c == NULL: 当前监听端口没有创建对应的连接对象 !c->read->active: 读事件未被设置为活跃状态, 即事件尚未被加入事件驱动机制, 无需也无法禁用它。 任一条件为真,均执行下一行的 continue。 跳过当前循环迭代,处理下一个监听端口
#2 ls[i].reuseport: 若当前监听端口配置了 reuseport,该字段为非零。 !all: 如果 all 参数为 0(即本次只是局部禁用,起因于未抢到 accept 锁)。 两个条件同时成立时,表明对启用了 reuseport 的套接字,应该保留其 accept 事件。 continue; 跳过当前监听端口,不对其执行事件禁用操作。
#3 调用 ngx_del_event 实际执行事件禁用操作。 参数: c->read:监听套接字上的读事件对象。 NGX_READ_EVENT:事件类型为读事件。 NGX_DISABLE_EVENT:禁用标志,指示事件模块将该事件从监听集合中移除,使其不再触发。 返回值与 NGX_ERROR 比较,若相等表示操作失败。

3 返回成功
returnNGX_OK;}