ngx_disable_accept_events
📅 2026/7/12 18:10:12
👁️ 阅读次数
📝 编程学习
1 定义
ngx_disable_accept_events 函数 定义在 ./nginx-1.24.0/src/event/ngx_event_accept.cstaticngx_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;}
编程学习
技术分享
实战经验