Nginx源码那些事儿-13-HTTP请求多阶段划分
发布网友
发布时间:2024-10-01 21:41
我来回答
共1个回答
热心网友
时间:2024-10-14 09:20
N号邮局在处理HTTP请求时,首先在解析配置文件阶段(ngx_http_block)对HTTP阶段进行了初始化,设置了11个默认阶段,每个阶段包含一个或多个模块的处理handler,这些handler通过模块的postconfiguration方法添加到相应的阶段中。
处理流程的关键点在于ngx_http_process_request,它启动了ngx_http_handler和ngx_http_core_run_phases,这时,connection状态会保持在特定阶段,便于理解。遍历阶段数组(cmcf->phase_engine.handlers)是后续操作的核心步骤。
ngx_http_find_config_phase和ngx_http_update_location_config阶段中,会更新request中的content_handler,将配置文件中location的handler关联到请求。比如,proxy_pass配置中的ngx_http_proxy_handler,最终会被合并到location配置中,成为r->content_handler。
配置解析和使用的关系可以通过一个链条来理解:main_conf数组保存多层server和location配置,经过module、server和location层面的合并,所有配置最终整合到ngx_http_core_module的server和location结构中。请求处理时,主要依赖connections中的listening信息,配置查找以connections为基础进行。
在11个阶段中,CONTENT阶段至关重要,负责处理请求体。如果存在content_handler(如ngx_http_proxy_handler),会更新write_event_handler,然后进入ngx_http_finalize_request,结束CONTENT阶段,回到核心处理循环。
总结来说,从注册ngx_http_wait_request_handler开始,到触发该处理器,12和13节的内容都在这个过程中进行。下一节将聚焦ngx_http_proxy_handler,探讨N号邮局如何处理与上游服务器的连接和body读取。这个阶段仍处于ngx_http_wait_request_handler的事件触发中。