本篇博客主要阐述nginx如何从上游服务器接收响应的过程,响应包括响应header和响应body,在这里我们比较关注响应body的接收过程。
因为nginx采用了全异步事件驱动模型,从上游服务器接收数据和向下游服务器发送数据也都是等待os通知相关socket fd上有事件发生后方可进行。我们这里不关心os如何通知nginx worker进程,只关心worker进程收到上游服务器的可读事件通知后如何处理。
做法说起来应该很简单,nginx worker进程收到通知会调用事先注册的处理例程,在该处理例程中无非就是做这么几件事:1. 从socket fd上读数据,当然在读数据之前我们得准备好缓冲区,还得非常仔细地处理读出错的各种异常情况;2. 读完的数据可能得做些后续处理,如要不要对数据做些过滤啊什么的;3. 后续还有很多复杂的逻辑处理,我们这列举了这么两点。后面我们会通过nginx的处理来分析其内部如何高效地完成数据接收、暂存的功能。
首先,我们从头说起,说说那个nginx与上游服务器的连接fd有读事件被触发的原始函数:ngx_http_upstream_process_upstream()。另外我们需要特别强调一点,为了实现读超时(即一定时间内还没有等到os对该连接的读事件),另外一个地方也可能会调用该函数,即该连接超时(为该读事件创建一个定时器放在红黑树上)时也会触发该函数,因此,在这个函数内必须还得判断到底是谁调用了它,如果是正常的读事件触发,那么后续需要从socket上读数据,如果真的是读超时触发的,那么就得进入错误处理逻辑了,让我们简单看看它的代码,揭开庐山真面目吧:
/* 在ngx_http_upstream_send_response中被注册为与
* 上游服务器的连接的读处理函数
* u->read_event_handler = ngx_http_upstream_proc

这篇博客深入探讨了nginx在接收到上游服务器响应,特别是响应body时的处理过程。讲解了nginx如何通过异步事件驱动模型,处理读事件,包括读取数据、异常处理、数据过滤等步骤,并预告了对后续复杂逻辑的分析。
最低0.47元/天 解锁文章
1458

被折叠的 条评论
为什么被折叠?



