所有 worker 进程的 listenfd 会在 新连接 到来时变得 可读 , 为保证只有一个进程处理该连接 , 所有 worker 进程在注册 listenfd 读事件 前 抢占 accept_mutex , 抢到 互斥锁 的那个进程 注册 listenfd 读事件 , 在 读事件 里调用 accept 接受该连接 。
当一个 worker 进程在 accept 这个连接之后 , 就开始 读取请求 , 解析请求 , 处理请求 , 产生数据后 , 再 返回给客户端 , 最后才 断开连接 , 这样一个完整的请求就是这样的了 。我们可以看到 , 一个请求 , 完全由 worker 进程来处理 , 而且只在一个 worker 进程中处理 。
文章插图
在 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
推荐阅读
- 在Nginx服务器上安装SSL证书
- 是什么导致你的Java服务器内存和CPU占用过高呢
- 无监控不运维 云服务器靠什么稳定
- 只需几分钟安全配置Linux服务器
- DHCP服务器出现故障,导致整个公司断网!快部署第二台DHCP服务器
- nginx搭建静态网站
- 502 bad gateway nginx什么意思
- 服务器部署:php.ini 配置性能调优
- WIFI怎样用域用户认证?用Windows Server 2019搭建Radius服务器
- nginx怎么下载