Nginx之启动流程
1. Nginx的启动流程
阶段一:启动准备(在 Master 进程创建之前)
这个阶段是在执行 nginx 命令后,第一个 Master 进程被创建之前发生的。
1. 解析命令行参数
当你执行 nginx -s stop、nginx -t 或 nginx -c /path/to/nginx.conf 时,Nginx 首先会解析这些参数。
例如,-t 参数只会测试配置文件的语法是否正确,而不会真正启动 Nginx。
2. Nginx 核心初始化
初始化 Nginx 的核心模块和其依赖的各种基础组件,如内存池、日志系统等。
为后续的配置解析做好准备。
3. 读取并解析配置文件(nginx.conf)
这是至关重要的一步。Nginx 会找到默认的或通过 -c 指定的配置文件。
解析过程:
Main 上下文: 首先解析最外层的配置,如 worker_processes, user, error_log 等。
Events 上下文: 解析 events 块,配置事件模型(如 use epoll)。
HTTP 上下文: 解析 http 块。这是最复杂的一部分,它会初始化 HTTP 核心模块,并递归地解析其中的 server, location 等块。
对于每个模块(如 ngx_http_core_module, ngx_http_rewrite_module),Nginx 会调用其对应的配置解析回调函数,将文本配置转换成内存中的数据结构(如数组、链表)。
如果配置语法有误,Nginx 会在此阶段报错并退出。
解析成功后,Nginx 在内存中建立了一个完整的、结构化的配置树。
阶段二:多进程模型启动
配置文件解析成功后,Nginx 正式进入其标志性的Master-Worker 多进程模型的启动阶段。
1. 创建 Master 进程
当前进程(我们称之为“启动进程”)会调用 fork() 系统调用,创建一个新的进程,这个新进程就是 Master 进程。
“启动进程”的使命完成并退出,将控制权完全交给新创建的 Master 进程。这就是为什么你在 Shell 中执行 nginx 后,命令会立即返回的原因,因为真正在后台运行的是 Master 进程及其子进程。
2. Master 进程初始化
Master 进程会进行一些初始化工作,比如设置信号处理、绑定监听端口(但不处理连接)。
Master 进程根据配置(worker_processes)决定要创建的 Worker 进程数量。
3. Master 进程创建 Worker 子进程
Master 进程调用 fork() 创建多个 Worker 进程。
Worker 进程是 Master 进程的子进程,它们会继承 Master 进程在初始化时已经打开的所有监听套接字(Socket)。
重要特性: 所有 Worker 进程都监听相同的 IP 和端口。这是通过 SO_REUSEPORT 等内核机制实现的,避免了端口绑定的冲突。
阶段三:Worker 进程开始工作
1. Worker 进程初始化与事件循环
每个 Worker 进程在进行必要的初始化(如设置进程标题、初始化模块等)后,会进入一个无限循环,即事件循环。
事件循环的核心:
Worker 进程使用一种高效的事件通知机制(如 epoll on Linux, kqueue on BSD)来监听其负责的监听套接字和活动连接。
当一个新的 TCP 连接请求到达时,所有处于等待状态的 Worker 进程会被内核唤醒,但只有一个进程会成功“accept”这个连接(这就是所谓的“惊群”问题,但现代 Nginx 和 Linux 内核已通过 EPOLLEXCLUSIVE 或 SO_REUSEPORT 等机制优化,避免了性能损耗)。
成功 accept 连接的 Worker 进程会开始处理该请求:读取请求、解析 HTTP 头部、根据配置找到对应的 server 和 location、执行一系列模块处理逻辑(如反向代理、负载均衡、读写缓存等)、生成响应并发送给客户端。
处理完请求后,连接可能会被关闭或保持(对于 HTTP Keep-Alive)。
2. Master 进程的角色:管理者
此时,Master 进程本身不处理任何网络请求。它的职责纯粹是管理:
监控 Worker 进程: 接收来自外部的信号(如 nginx -s reload),然后向 Worker 进程发送信号。
平滑重启/重载配置: 当收到 reload 信号时,Master 进程会重新加载配置文件(回到步骤3),如果成功,它会启动一组新的 Worker 进程,并优雅地关闭旧的 Worker 进程(等待其处理完当前请求)。
平滑升级: 支持不中断服务的情况下升级 Nginx 二进制文件。
日志管理: 负责重新打开日志文件(当收到 reopen 信号时)。
2. 流程图如下:


浙公网安备 33010602011771号