Nginx之启动流程

1.  Nginx的启动流程

    阶段一:启动准备(在 Master 进程创建之前)

    这个阶段是在执行 nginx 命令后,第一个 Master 进程被创建之前发生的。

      1.  解析命令行参数

          当你执行 nginx -s stopnginx -t 或 nginx -c /path/to/nginx.conf 时,Nginx 首先会解析这些参数。

          例如,-t 参数只会测试配置文件的语法是否正确,而不会真正启动 Nginx。

      2.  Nginx 核心初始化

          初始化 Nginx 的核心模块和其依赖的各种基础组件,如内存池、日志系统等。

          为后续的配置解析做好准备。

      3.  读取并解析配置文件(nginx.conf)

          这是至关重要的一步。Nginx 会找到默认的或通过 -c 指定的配置文件。

          解析过程:

            Main 上下文: 首先解析最外层的配置,如 worker_processesusererror_log 等。

            Events 上下文: 解析 events 块,配置事件模型(如 use epoll)。

            HTTP 上下文: 解析 http 块。这是最复杂的一部分,它会初始化 HTTP 核心模块,并递归地解析其中的 serverlocation 等块。

            对于每个模块(如 ngx_http_core_modulengx_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.  流程图如下:

deepseek_mermaid_20250926_150d52

posted @ 2025-09-26 10:59  奋斗史  阅读(5)  评论(0)    收藏  举报