浅谈Nginx服务器的内部核心架构设计( 三 )


所有 worker 进程的 listenfd 会在 新连接 到来时变得 可读  , 为保证只有一个进程处理该连接 , 所有 worker 进程在注册 listenfd 读事件 前 抢占 accept_mutex  , 抢到 互斥锁 的那个进程 注册 listenfd 读事件  , 在 读事件 里调用 accept 接受该连接 。
当一个 worker 进程在 accept 这个连接之后 , 就开始 读取请求  ,  解析请求  ,  处理请求  , 产生数据后 , 再 返回给客户端  , 最后才 断开连接  , 这样一个完整的请求就是这样的了 。我们可以看到 , 一个请求 , 完全由 worker 进程来处理 , 而且只在一个 worker 进程中处理 。

浅谈Nginx服务器的内部核心架构设计

文章插图
 
在 Nginx 服务器的运行过程中 ,  主进程 和 工作进程 需要进程交互 。交互依赖于 Socket 实现的 管道 来实现 。
5.1. 主进程与工作进程交互
这条管道与普通的管道不同 , 它是由 主进程 指向 工作进程 的 单向管道  , 包含主进程向工作进程发出的 指令  ,  工作进程 ID 等;同时 主进程 与外界通过 信号通信 ;每个 子进程 具备 接收信号  , 并处理相应的事件的能力 。
5.2. 工作进程与工作进程交互
这种交互是和 主进程-工作进程 交互是基本一致的 , 但是会通过 主进程 间接完成 。 工作进程之间是 相互隔离 的 , 所以当工作进程 W1 需要向工作进程 W2 发指令时 , 首先找到 W2 的 进程ID  , 然后将正确的指令写入指向 W2 的 通道  。W2 收到信号采取相应的措施 。
小结
通过这篇文章 , 我们对 Nginx 服务器的 整体架构 有了一个整体的认识 。包括其 模块化的设计、 多进程 和 异步非阻塞 的请求处理方式、 事件驱动模型 等 。通过这些理论知识 , 才能更好地领悟 Nginx 的设计思想 。对于我们学习 Nginx 来说有很大的帮助 。
作者:程序员修BUG
原文:https://my.oschina.net/u/4205711/blog/3112677




推荐阅读