ngx_set_worker_processes
定义在 src\core\nginx.c
static char *
ngx_set_worker_processes(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
{
ngx_str_t *value;
ngx_core_conf_t *ccf;
ccf = (ngx_core_conf_t *) conf;
if (ccf->worker_processes != NGX_CONF_UNSET) {
return "is duplicate";
}
value = cf->args->elts;
if (ngx_strcmp(value[1].data, "auto") == 0) {
ccf->worker_processes = ngx_ncpu;
return NGX_CONF_OK;
}
ccf->worker_processes = ngx_atoi(value[1].data, value[1].len);
if (ccf->worker_processes == NGX_ERROR) {
return "invalid value";
}
return NGX_CONF_OK;
}
ngx_set_worker_processes
是 Nginx 中用于处理配置指令worker_processes
的核心函数解析用户在 Nginx 配置文件中设置的
worker_processes
参数值
worker_processes 是 Nginx 的核心配置指令之一,用于定义 工作进程(Worker Processes)的数量
Nginx 采用多进程模型,由一个 Master 进程 管理多个 Worker 进程 。
每个 Worker 进程独立处理客户端请求,worker_processes 决定了并发处理请求的并行度。
值越大,理论上可同时处理的请求数越多(受限于 CPU、内存等资源)
worker_processes 函数签名
static char *ngx_set_worker_processes(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
返回值类型:
char *
返回配置解析结果
成功时 返回
NGX_CONF_OK
表示配置有效失败时 返回具体的错误信息字符串
参数 1:ngx_conf_t *cf
存储当前解析的配置文件路径、参数列表、内存池等信息
通过 cf->args 可获取当前指令的参数
参数 2:ngx_command_t *cmd描述当前指令的元信息,如指令名称、参数格式、处理函数等。
通过 cmd->name 可获取指令名称(如 worker_processes)。
参数 3:void *conf
void* 是通用指针,实际指向模块的配置结构体。传递模块的配置结构体指针(如 ngx_core_conf_t),用于存储解析后的配置值。
在函数内部需强制转换为具体类型(如 (ngx_core_conf_t *) conf)
函数核心逻辑
通过上述参数,函数完成以下关键操作:
1. 防重复配置:
检查 ccf->worker_processes是否已设置(值不为 NGX_CONF_UNSET),若重复则返回 is duplicate
2. 参数解析:
从 cf->args 中获取参数值(如 auto 或 4),并验证合法性。
3. 自动模式处理:
若参数为 auto,则将 worker_processes 设置为 CPU 核心数(ngx_ncpu)。
4. 手动模式处理:
若参数为数字,通过 ngx_atoi 转换为整数,失败时返回 invalid value
5. 更新配置结构体:
将解析后的值赋给 ccf->worker_processes,供后续 Nginx 启动流程使用。
ccf = (ngx_core_conf_t *) conf;
类型转换,指向模块的配置结构体,转型为具体的 结构体类型
ngx_core_conf_t-CSDN博客
if (ccf->worker_processes != NGX_CONF_UNSET) {
return "is duplicate";
}
NGX_CONF_UNSET 是初始值,代表尚未设置
ccf->worker_processes != NGX_CONF_UNSET 表示 ccf->worker_processes 已经被设置过了
此时
条件不成立
value = cf->args->elts;
获取 指令参数
if (ngx_strcmp(value[1].data, "auto") == 0) {
ccf->worker_processes = ngx_ncpu;
return NGX_CONF_OK;
}
value[0]是指令本身
value[1].data 是指令的参数
if 参数是 auto 的情况下
ccf->worker_processes 设置为 ngx_ncpu
此时
value[1].data=1
这个条件不成立
ccf->worker_processes = ngx_atoi(value[1].data, value[1].len);
if (ccf->worker_processes == NGX_ERROR) {
return "invalid value";
}
转换为整数 设置给worker_processes
Ubuntu 下 nginx-1.24.0 源码分析 - ngx_atoi 函数-CSDN博客
return NGX_CONF_OK;
返回 NGX_CONF_OK ,表示指令配置成功