🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
### LOG阶段[](http://tengine.taobao.org/book/chapter_12.html#log "永久链接至标题") LOG阶段主要的目的就是记录访问日志,进入该阶段表明该请求的响应已经发送到系统发送缓冲区。另外这个阶段的handler链实际上并不是在ngx_http_core_run_phases函数中执行,而是在释放请求资源的ngx_http_free_request函数中运行,这样做的原因实际是为了简化流程,因为ngx_http_core_run_phases可能会执行多次,而LOG阶段只需要再请求所有逻辑都结束时运行一次,所以在ngx_http_free_request函数中运行LOG阶段的handler链是非常好的选择。具体的执行的函数为ngx_http_log_request: [](http:// "点击提交Issue,反馈你的意见...") static void ngx_http_log_request(ngx_http_request_t *r) { ngx_uint_t i, n; ngx_http_handler_pt *log_handler; ngx_http_core_main_conf_t *cmcf; cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module); log_handler = cmcf->phases[NGX_HTTP_LOG_PHASE].handlers.elts; n = cmcf->phases[NGX_HTTP_LOG_PHASE].handlers.nelts; for (i = 0; i < n; i++) { log_handler[i](r); } } 函数非常简单,仅仅是遍历LOG阶段的handler链,逐一执行,而且不会检查返回值。LOG阶段和其他阶段的不同点有两个,一是执行点是在ngx_http_free_request中,二是这个阶段的所有handler都会被执行。 至此,Nginx请求处理的多阶段执行链的各个阶段都已经介绍完毕,弄清楚每个阶段的执行时机以及每个阶段的不同特点对写模块非常重要。