当前位置 主页 > 服务器问题 > nginx问题汇总 >

    nginx处理http请求实例详解

    栏目:nginx问题汇总 时间:2018-10-10 16:23

    这篇文章主要介绍了nginx处理http请求实例详解的相关资料,需要的朋友可以参考下

         本文在这基础上分析nginx服务器收到http请求行、请求头部后,http框架是如何调度各个http模块共同完成这个http请求。例如: http框架调度静态模块,获取服务器目录下的某个html页面返回给客户端; 或者http框架调度access权限访问模块,判断这个客户端是否有权限访问服务器。

    一、event事件与http框架的交互

            在接收完http请求行、http请求头部后,会调用ngx_http_process_request这个函数开始处理http请求。因为一个http请求由11个处理阶段组成,而每一个处理阶段都允许多个http模块介入,因此在这个函数中,将调度各个阶段的http模块共同完成这个请求。

    //接收到http请求行与请求头后,http的处理流程,是第一个http处理请求的读事件回调 //这个函数执行后,将把读写事件的回调设置为ngx_http_request_handler。这样下次再有事件时 //将调用ngx_http_request_handler函数来处理,而不会再调用ngx_http_process_request了 static void ngx_http_process_request(ngx_http_request_t *r) {   ngx_connection_t *c;   c = r->connection;   //因为已经接收完http请求行、请求头部了,准备调用各个http模块处理请求了。   //因此需要接收任何来自客户端的读事件,也就不存在接收http请求头部超时问题   if (c->read->timer_set)    {     ngx_del_timer(c->read);   }   //重新设置当前连接的读写事件回调   c->read->handler = ngx_http_request_handler;   c->write->handler = ngx_http_request_handler;   //设置http请求对象的读事件回调,这个回调不做任何的事情。   //那http请求对象的读事件回调,与上面的连接对应的读事件回调有什么关系呢?   //当读事件发生后,连接对应的读事件回调ngx_http_request_handler会被调用,   //在这个回调内会调用http请求对象的读事件回调ngx_http_block_reading,而这个回调是   //不会做任何事件的,因此相当于忽略了读事件。因为已经接收完了请求行请求头,现在要做的是调用各个http模块,   //对接收到的请求行请求头进行处理   r->read_event_handler = ngx_http_block_reading;    //调用各个http模块协同处理这个请求   ngx_http_handler(r);   //处理子请求   ngx_http_run_posted_requests(c); }

          ngx_http_process_request函数只会被调用一次。如果一次调度并不能处理完11个http阶段,那会将连接对象对应的读事件、写事件回调设置为ngx_http_request_handler。而请求对象的读事件设置为ngx_http_block_reading, 请求对象的写事件回调设置为ngx_http_core_run_phases, 这个回调在ngx_http_handler内设置。这样在事件再次到来时不会调用

    ngx_http_process_request函数处理了。那event事件模块的读写事件回调与http请求对象的读写事件回调有什么关系呢?

    //http请求处理读与写事件的回调,在ngx_http_process_request函数中设置。 //这个函数中将会调用http请求对象的读写事件回调。将event事件模块与http框架关联起来 static void ngx_http_request_handler(ngx_event_t *ev) {   //如果同时发生读写事件,则只有写事件才会触发。写事件优先级更高   if (ev->write)    {     r->write_event_handler(r);  //在函数ngx_http_handler设置为:ngx_http_core_run_phases    }   else   {     r->read_event_handler(r);  //在函数ngx_http_process_request设置为:ngx_http_block_reading   }    //处理子请求   ngx_http_run_posted_requests(c); }