首页 > 网站 > Nginx > 正文

nginx处理http请求实例详解

2024-08-30 12:25:31
字体:
来源:转载
供稿:网友

     本文在这基础上分析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请求对象的读写事件回调有什么关系呢?

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表