ngx_start_worker_processes
1 定义ngx_start_worker_processes 函数 定义在 ./nginx-1.24.0/src/os/unix/ngx_process_cycle.cstaticvoidngx_start_worker_processes(ngx_cycle_t*cycle,ngx_int_tn,ngx_int_ttype){ngx_int_ti;ngx_log_error(NGX_LOG_NOTICE,cycle-log,0,start worker processes);for(i0;in;i){ngx_spawn_process(cycle,ngx_worker_process_cycle,(void*)(intptr_t)i,worker process,type);ngx_pass_open_channel(cycle);}}ngx_start_worker_processes 函数的作用是 根据配置的 worker 进程数量n 依次创建 Nginx 的 worker 子进程 并为每个新创建的 worker 传递已打开的监听套接字文件描述符 使其能够直接处理客户端请求。2 详解1 函数签名staticvoidngx_start_worker_processes(ngx_cycle_t*cycle,ngx_int_tn,ngx_int_ttype)返回值 函数执行完毕后不返回任何值 函数功能是 启动多个子进程 这种具有副作用的操作而非计算型任务参数 ngx_cycle_t *cycle 指向当前运行周期 ngx_int_t n 要启动的 worker 进程数量 ngx_int_t type 作为进程生命周期管理标志位 NGX_PROCESS_RESPAWN默认 Worker 异常退出时 Master 自动重启它 NGX_PROCESS_JUST_SPAWN 平滑升级/重载配置时创建的新进程标记为“新进程组” NGX_PROCESS_NORESPAWN 不自动重启用于特定调试或一次性任务 NGX_PROCESS_DETACHED 脱离 Master 监控极少使用2 逻辑流程1 局部变量 2 日志记录 3 创建 worker 进程1 局部变量{ngx_int_ti;2 日志记录ngx_log_error(NGX_LOG_NOTICE,cycle-log,0,start worker processes);输出一条 NOTICE 级别的日志 提示主进程即将开始启动 worker 进程3 创建 worker 进程for(i0;in;i){ngx_spawn_process(cycle,ngx_worker_process_cycle,(void*)(intptr_t)i,worker process,type);ngx_pass_open_channel(cycle);}}#1 启动循环循环次数为配置的 worker 数量 n 逐个生成 worker 进程每个 worker 都会拥有一个从 0 到 n-1 的唯一编号 i#2 调用 ngx_spawn_process 创建新进程 参数 cycle 全局配置 ngx_worker_process_cycle 子进程的入口函数指针。 当 fork() 成功后子进程会跳转到这个函数执行 worker 的完整生命周期初始化模块、进入事件循环、处理连接 并且 永远不会返回除非 worker 进程退出。 (void *) (intptr_t) i i 代表 worker 的序号。 通过 (intptr_t) i 将其转换为与指针长度相同的整数类型避免 32/64 位兼容性问题。 再强制转换为 (void *)作为 proc 函数的唯一参数 data 传入。 意义Worker 进程内部通过 ngx_get_conf 或直接读取 ngx_process_slot 获取自己的序号 以便进行 CPU 亲和性绑定、监听端口分流reuseport 时或日志区分。 worker process 字符串标识用于设置子进程的标题argv[0] 或 Linux 下的 /proc/self/comm 在 ps 命令中可识别。 type 告诉 ngx_spawn_process 当前启动的是何种进程。 返回值与副作用 主进程得到子进程 PID0继续执行后续代码。 子进程从 ngx_spawn_process 内部 fork() 返回后 直接调用 ngx_worker_process_cycle 并永不返回。#3 ngx_pass_open_channel(cycle); ngx_pass_open_channel(cycle) 是 Nginx master 进程在 ngx_start_worker_processes 循环中 向已存在的所有 worker 子进程广播新 worker 信息的核心函数。 它让所有 worker 了解彼此的存在是构建 worker 间通信网络的基础。 它的核心机制是利用在 ngx_spawn_process 时创建的、 连接父子进程的 socketpair即 channel进行进程间通信。