最近和 Nginx 杠上了( 四 )


需要说明的是 , Worker是不会接受命令的 , 而是通过Worker接受命令来统一管理所有Worker的行为 。
进程协助处理网络请求
知道Master与Worker之间如何通信之后再来看看它们是如何合作完成客户端请求的 。
最近和 Nginx 杠上了
文章图片
图6:Client请求流程
如图6所示 , 这里描绘了Master创建listen以及fork出Worker的过程 , 以及客户端请求和Worker响应请求的过程 。
①先从最上面开始看 , 顺着从上至下红色的箭头看 , Master进程创建以后会通过socket方法创建socket的IO通道 。
接着执行bind方法将其与监听器listen进行绑定 , 然后通过fork方法fork出多个Worker进程(绿色虚线) 。
最近和 Nginx 杠上了】②在每个Worker进程中的accept方法就监听socket请求了 , 一旦listen监听到socket请求Worker进程就可以通过accept接受到 。
③再看最下面的client模块 , 当client通过connect方法与Nginx发生连接时 , 所有拥有accept方法的Worker进程都会接受到来自listen的通知 , 但是只有一个Worker进程能够成功accept到 , 其他的进程则会失败 。
这里Nginx提供了一把共享锁accept_mutex来保证同一时刻只有一个Worker进程在accept连接 , 从而解决惊群问题 。
④当Worker进程accept到socket请求以后 , client会通过send方法发送请求(绿色虚线)给Worker 。
而Worker使用recv方法接受请求你 , 同时通过parse(解析)、process(处理)、generate(生成响应)几个步骤将返回的响应通过send方法传送给client , 而client会使用recv方法接受响应 。
最后Worker调用close方法断开和client的连接 。
总结
本文从Nginx总体架构开始 , 介绍了Nginx的主要组成部分和处理流程 。 然后介绍Nginx的4个进程 , 以及Nginx在启动过程中这些进程都是如何产生的 。
然后聚焦到最为主要的Master进程的启动过程做了哪些具体的事情 , 特别是Master进程和Worker、CacheManager、CacheLoad之间的关系 。
在进程之间的信号发送方式的章节中 , 我们建立了信号、发送信号、信号处理、信号掩码的概念 , 这有助于理解进程之间的通信 。
最后 , 趁热打铁把Nginx接受网络请求以及进程之间如何合作处理请求的过程进行了讲解 。
作者:崔皓
简介:十六年开发和架构经验 , 曾担任过惠普武汉交付中心技术专家 , 需求分析师 , 项目经理 , 后在创业公司担任技术/产品经理 。 善于学习 , 乐于分享 。 目前专注于技术架构与研发管理 。
编辑:陶家龙