nginx-0.8.38源码探秘(五)

 

本文档的Copyleft归L.L所有,使用GPL发布,可以自由转载,转载时请务必以超链接形式标明文章原始出处,严禁用于任何商业用途。

email: cc.dd.14@163.com
来源: http://blog.csdn.net/ccdd14

前面把初始化流程分析完成,可以发现,nginx是先把各模块的指令初始化完成后,再初始化子进程,最后等待客户请求到来。下面开始分析nginx的处理流程。

ngx_event_accept是整个处理流程的开始,它调用accept等待连接的到来,当有新连接到来时,通过ngx_get_connection取得一个空闲连接,注册连接的发送接收钩子(还记得第一章的ngx_linux_io ?):

 

然后将该连接添加到epoll事件中,触发ngx_listening_t的handler:ngx_http_init_connection,分析一下这个函数:

 

当连接的数据到来时,就接着调用ngx_http_init_request。

ngx_http_init_request函数初始化ngx_http_request_t结构,注册了几个handler:rev->handler = ngx_http_process_request_line,r->read_event_handler = ngx_http_block_reading,r->log_handler = ngx_http_log_error_handler,设置了http状态r->http_state = NGX_HTTP_READING_REQUEST_STATE,这是一系列枚举值:

 

最后调用ngx_http_process_request_line。

ngx_http_process_request_line函数首先调用ngx_http_read_request_header接收数据,数据保存在r->header_in缓冲区中。接着利用ngx_http_parse_request_line解析http request-line(如:GET / HTTP/1.1),如果解析没有发生错误,重新注册rev->handler = ngx_http_process_request_headers,调用ngx_http_process_request_headers。

 ngx_http_process_request_headers函数使用ngx_http_parse_header_line解析head field,然后查找hash得到hh(类型为ngx_http_header_t),接着调用hh注册的handler,这些handler在ngx_http_headers_in变量里注册。

 

得到head field的(key,value)值对后,改变状态r->http_state = NGX_HTTP_PROCESS_REQUEST_STATE,调用ngx_http_process_request_header分析head field的合法性,最后调用ngx_http_process_request。

ngx_http_process_request函数又注册了几个handler:c->read->handler = ngx_http_request_handler,c->write->handler = ngx_http_request_handler,r->read_event_handler = ngx_http_block_reading。紧接着调用ngx_http_handler,这个函数做了一件非常重要的事情,运行各http phase注册的handler。

这涉及一大串的handler,下一章再慢慢吃了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值