Nginx 启动初始化过程

Nginx 启动过程

Nginx 的启动初始化由 main 函数完成,该函数是整个 Nginx 的入口,该函数完成 Nginx 启动初始化任务,也是所有功能模块的入口。Nginx 的初始化工作主要是一个类型为 ngx_cycle_t 类型的全局变量。main 函数定义在文件:src/​core/​nginx.c

Nginx 启动过程如下。

  • 调用 ngx_get_options() 解析命令参数;

  • 显示版本号与帮助信息;

  • 调用 ngx_time_init() 初始化并更新时间;

  • 调用 ngx_log_init() 初始化日志;

  • 创建全局变量 init_cycle 的内存池 pool;

  • 调用 ngx_save_argv() 保存命令行参数至全局变量ngx_os_argv、ngx_argc、ngx_argv 中;

  • 调用 ngx_process_options() 初始化 init_cycle 的 prefix, conf_prefix, conf_file, conf_param 等字段;

  • 调用 ngx_os_init() 初始化系统相关变量;

  • 调用 ngx_crc32_table_init() 初始化CRC表;

  • 调用 ngx_add_inherited_sockets() 继承 sockets;

  • 通过环境变量 NGINX 完成 socket 的继承,将其保存在全局变量 init_cycle 的 listening 数组中;

  • 初始化每个模块 module 的index,并计算 ngx_max_module;

  • 调用 ngx_init_cycle() 进行初始化全局变量 init_cycle,这个步骤非常重要;

  • 调用 ngx_signal_process() 处理进程信号;

  • 调用 ngx_init_signals() 注册相关信号;

  • 若无继承 sockets,则调用 ngx_daemon() 创建守护进程,并设置其标志;

  • 调用 ngx_create_pidfile() 创建进程 ID 记录文件;

  • 进入进程处理:

  • 单进程工作模式;

  • 多进程工作模式,即 master-worker 多进程工作模式;

ngx_cycle_t 变量初始化

ngx_cycle_t 结构体初始化

在初始化过程中,ngx_cycle_t 类型的全局变量最为重要,该类型结构定义如下:src/​core/​ngx_cycle.h

ngx_init_cycle() 初始化函数

该结构的初始化是通过函数 ngx_init_cycle() 完成的,该函数定义如下:src/​core/​ngx_cycle.c

ngx_cycle_t 结构全局变量初始化过程如下:

  • 更新时区与时间;

  • 创建内存池;

  • 分配 ngx_cycle_t 结构体内存,创建该结构的变量 cycle 并初始化;

  • 遍历所有 core模块,并调用该模块的 create_conf() 函数;

  • 配置文件解析;

  • 遍历所有core模块,并调用core模块的init_conf()函数;

  • 遍历 open_files 链表中的每一个文件并打开;

  • 创建新的共享内存并初始化;

  • 遍历 listening 数组并打开所有侦听;

  • 提交新的 cycle 配置,并调用所有模块的init_module;

  • 关闭或删除不被使用的在 old_cycle 中的资源:

  • 释放多余的共享内存;

  • 关闭多余的侦听 sockets;

  • 关闭多余的打开文件;

参考资料: 《 nginx源码分析—启动流程

Nginx启动初始化过程

Last updated

Was this helpful?