nginx源码分析(2)——http模块的初始化过程
前一篇文章介绍了nginx的启动初始化过程,包括了所有模块的初始化过程,比如http模块、事件模块等。这里再详细介绍一下http模块的启动过程,还记得在前一篇文章中提到过ngx_conf_parse函数背后隐藏了大量的细节吗?这里就揭开这层神秘的面纱,去看看几个重要的http模块是如何初始化的。这里依然沿用上一篇文章的结构,首先来看几个重要的数据结构。
1. 重要的数据结构1. ngx_http_module_t
所有http模块都是ngx_http_module_t类型,所有的属性都是回调函数,在http模块初始化过程的不同阶段调用。当一个指令既允许出现在main块(在http{}块内,但是在server{}块外的区域)、server块(在server{}块内,但是在location{}块外的区域)、location块内时,就需要对这些指令进行继承和覆盖的处理,由merge_src_conf和merge_loc_conf完成。
/* optimize the lists of ports, addresses and server names */ if (ngx_http_optimize_servers(cf, cmcf, cmcf->ports) != NGX_OK) { return NGX_CONF_ERROR; }在ngx_http_optimize_servers函数中完成初始化ngx_http_conf_addr_t的wc_head、wc_tail和hash,就是以server_name为key,对应的ngx_http_core_srv_conf_t为值的hash结构,wc_head和wc_tail是带通配符的server_name。最重要的就是调用ngx_http_init_listening函数,它会调用ngx_http_add_listening添加ngx_listening_t,即监听socket,最后调用ngx_http_add_addrs。在ngx_http_add_listening内会调用ngx_http_create_listening创建新的ngx_listening_t,然后设置其handler为ngx_http_init_connection,这个函数在监听到新的连接时调用,具体就是在ngx_event_accept函数中。然后,设置ngx_listening_t相关的一些属性,rcvbuf、sndbuf、backlog等。
上面就是http块初始化的全过程,这里主要列出server块和location块的初始化。下一篇详细介绍nginx配置文件的解析。