Nginx源码入口是src/core/nginx.c中的main()函数,它依次执行配置解析、模块初始化、进程模型建立和事件循环启动;核心数据结构ngx_cycle_t贯穿全程,承载配置、模块、日志等运行时资源。

阅读 Nginx 源码,最直接的入口就是 main() 函数。它不长,但像一把钥匙,串起了整个启动流程的关键节点:配置解析、模块初始化、进程模型建立、事件循环启动。抓住它,你就站在了理解 Nginx 架构的起点。
定位 main 函数:从 src/core/nginx.c 开始
Nginx 的主函数定义在 src/core/nginx.c 文件中,是整个程序的唯一入口。它不做具体业务处理,而是按固定顺序调度核心逻辑:
- 调用
ngx_init_cycle()初始化核心数据结构(如 cycle、conf、log)并加载配置; - 执行所有模块的
init_module钩子,完成模块级初始化(如 event 模块注册事件驱动、http 模块构建配置上下文); - 根据配置决定是否 fork worker 进程(master-worker 模式),或直接进入单进程事件循环(debug 模式);
- 最终调用
ngx_master_process_cycle()或ngx_single_process_cycle()启动主循环。
关注 cycle 结构体:Nginx 的“运行时上下文”
ngx_cycle_t * 是贯穿整个生命周期的核心指针,几乎所有关键资源都挂载其下:
-
cycle->conf_ctx存储各模块的配置结构体(如 http 模块的ngx_http_conf_ctx_t); -
cycle->modules是已编译进来的模块数组,启动时按类型(core/event/http/mail)依次调用其初始化函数; -
cycle->log是全局日志句柄,早期就初始化好,后续所有日志输出都依赖它; -
cycle->files和cycle->connections在事件模块初始化后才被分配,为后续连接管理打基础。
读源码时,看到任意函数接收 ngx_cycle_t *cycle 参数,就说明它正在操作当前运行时环境——这是理解模块协作关系的重要线索。
跟踪配置加载:从 nginx.conf 到内存结构
配置解析不是一次性完成的,而是分两轮:
-
第一轮(预解析):在
ngx_init_cycle()中调用ngx_conf_parse(),仅构建模块配置框架(conf_ctx),不填充具体指令值; -
第二轮(正式解析):遍历配置文件每一行,对每个指令调用对应模块的
set回调函数(如ngx_http_core_server),将文本配置转为 C 结构体字段; - HTTP 配置有三级上下文(main → server → location),通过
ngx_http_conf_ctx_t中的三个指针分别指向,解析时靠栈式嵌套维护作用域。
调试时可在 ngx_conf_handler() 下断点,观察每条配置如何触发模块回调,这是理清配置生效路径最直观的方式。
理解进程与事件循环的分工
Nginx 的并发模型由 master/worker 进程 + epoll/kqueue/eventport 驱动构成,启动后逻辑分流清晰:
- master 进程:只负责管理 worker 生命周期(启动、平滑重启、优雅退出)、信号处理、共享内存维护,不处理网络请求;
-
worker 进程:每个独立调用
ngx_worker_process_cycle(),内部进入for(;;) { ngx_process_events_and_timers() }循环; -
事件分发:由 event 模块(如
ngx_epoll_module)实现process_events接口,把就绪事件交给对应的 handler(如ngx_http_init_request处理新连接)。
注意:所有 worker 共享监听 socket(通过 SO_REUSEPORT 或 master accept 后 sendmsg 传递),但各自维护独立的连接池和内存池,这是高并发低锁的关键设计。
读源码不必逐行通读,从 main 出发,沿着配置加载、模块初始化、进程派生、事件循环四条主线深入,配合 gdb 跟踪关键函数调用和结构体填充,很快就能看清 Nginx 如何把一行配置变成一个高效 Web 服务器。










