nginx源代码分析--ngx_http_optimize_servers()函数

这个函数做了连部分工作:1)以port为入口点 将实用的信息存放到hash表内 2)调用ngx_http_init_listening()函数 对port进行监听

1、 在ngx_http_core_main_conf_t结构体中有一个字段为ports,是一个数组,数组内存放的全是ngx_http_conf_port_t;对于每个端口信息(ngx_http_conf_port_t),调用

ngx_http_server_names函数,同一时候也调用ngx_http_init_listening函数,这里先分析ngx_http_server_names函数。

2)对于每个端口信息(ngx_http_conf_port_t),里面有一个字段为addrs,这个字段是一个数组,这个数组内存放的全是地址信息(ngx_http_conf_addr_t),一个地址信息

(ngx_http_conf_addr_t)相应着多个server{}配置块(ngx_http_core_srv_conf_t)3

3)对于每个server{}配置块信息(ngx_http_core_srv_conf_t)相应着非常多个sever_name.所以,ngx_http_core_srv_conf_t结构体中有一个数组server_names,成员是ngx_http_server_name_t,这样对每个server_name(ngx_http_server_name_t)进行操作,存放到hash表内

这样就完毕了以端口(ngx_http_conf_port_t)为入口点 对全部的地址都进行遍历,将全部的server_name都存放到hash表内

二、ngx_http_init_listening()函数调用

在ngx_http_core_main_conf_t结构体中存放着一个Port信息的数组,对于每个port进行ngx_http_init_listening 的操作,对每个ngx_http_conf_addr_t信息调用

ngx_http_add_listening()函数,为何每个port相应非常多个地址呢?也就是说非常多歌IP地址都在这个port上监听着。

在ngx_http_add_listening函数调用ngx_create_listening,相应一个地址信息产生一个ngx_listening_t的结构体,最最重要的是这个监听套接字上的回调是ngx_http_init_connection函数,这个一个监听套接字上接收到HTTP请求成功后(accept成功后 创建新的连接后,调用accept连接时在函数ngx_event_accept函数中,这个函数最为一个可读事件上的回调,非常显然,这个ngx_listening_t结构体上包括的一个事件结构体上的回调,只是这个注冊是在ngx_event_process_init函数,这个函数作为ngx_event_core_module中的init_porcess回调,这个回调是在ngx_worker_process_cycle中被调用,作为worker进程的初始化,也就是说,worker进程初始化的时候才将监听套接字上的可读事件的回调设置为ngx_event_accep,在ngx_event_accept函数中完毕accept后,直接调用监听套接字上的handler,也就是ngx_http_init_connection函数)開始的。ngx_http_init_connection函数让http请求进入到HTTP的11个阶段。

时间: 2024-10-25 04:17:41

nginx源代码分析--ngx_http_optimize_servers()函数的相关文章

nginx源代码分析之内存池实现原理

建议看本文档时结合nginx源代码. 1.1   什么是内存池?为什么要引入内存池? 内存池实质上是接替OS进行内存管理.应用程序申请内存时不再与OS打交道.而是从内存池中申请内存或者释放内存到内存池.因此.内存池在实现的过程中,必定有一部分操作时从OS中申请内存.或者释放内存到OS.例如以下图所看到的: 图1 内存池的引入可有效解决两个问题: (1) 减少应用程序与OS之间进行频繁内存和释放的系统调用,进而减少程序执行期间在两个空间的切换,提升了程序执行效率: (2)内存池可依据应用特性组织内

nginx源代码分析--从源代码看nginx框架总结

nginx源代码总结: 1)代码中没有特别绕特别别扭的编码实现.从变量的定义调用函数的实现封装,都非常恰当.比方从函数命名或者变量命名就能够看出来定义的大体意义,函数的基本功能,再好的架构实如今编码习惯差的人实现也会黯然失色,假设透彻理解代码的实现,领悟架构的设计初衷,认为每块代码就想经过耐心雕琢一样,不只实现了主要的功能给你,为其它人阅读也会提供非常好的支持.仔细恰当的命名规则就能够看出作者的功力. 2)更好更高的软件性能体如今架构设计上,好的架构会让软件更加稳定.easy维护.便于扩展.从核

nginx源代码分析--监听套接字的创建 套接字的监听 HTTP请求创建连接

作为一个webserver,那么肯定是有监听套接字的,这个监听套接字是用于接收HTTP请求的,这个监听套接字的创建是依据配置文件的内容来创建的,在nginx.conf文件里有多少个地址就须要创建多少个监听套接字.这里不说各个结构体的构造 仅仅说大体情况! 1).首先在main函数中调用了ngx_init_cycle()函数,在这个函数的最后调用了ngx_open_listening_sockets函数,这个函数负责将创建的监听套接字进行套接字选项的设置(比方非堵塞.接受发送的缓冲区.绑定.监听处

nginx源代码分析--读请求主体(1)

首先,读取请求体已进入HTTP要求11相,我们需要做的请求正文部分处理一些模块,所以这个模块需要注册功能在这个阶段,在阅读功能要求的身体ngx_http_read_client_request_body()是存在的.仅仅只是不同的模块可能对请求体做不同的处理.读取请全体的函数是在某个模块的conent_handler函数中包括的.比方比方proxy模块,fastcgi模块,uwsgi模块等这些模块对请求体感兴趣,那么读取请求体的函数在这些模块的content_handler中注冊. 上节说到ng

nginx源代码分析--GDB调试

利用gdb[i]调试nginx[ii]和利用gdb调试其他程序没有两样,只是nginx能够是daemon程序,也能够以多进程执行,因此利用gdb调试和寻常会有些许不一样. 当然,我们能够选择将nginx设置为非daemon模式并以单进程执行.而这需做例如以下设置就可以: daemon off; master_process off; 这是第一种情况: 这样的设置下的nginx在gdb下调试非常普通,过程能够[iii]是这样: 运行命令: [email protected]:/usr/local/

nginx源代码分析--event事件驱动初始化

1.在nginx.c中设置每一个核心模块的index ngx_max_module = 0; for (i = 0; ngx_modules[i]; i++) { ngx_modules[i]->index = ngx_max_module++; } 2.进入函数ngx_init_cycle,调用每一个核心模块的create_conf for (i = 0; ngx_modules[i]; i++) { if (ngx_modules[i]->type != NGX_CORE_MODULE)

gcc源代码分析gen_push_operand ()函数和emit_move_insn ()函数

如何生成下面红色的3个指令? 和gen_push_operand ()函数和emit_move_insn ()函数有关,他们都在expand_call()函数中被调用. 具体位置: rtx addr; #ifdef PUSH_ROUNDING if (args_addr == 0) addr = gen_push_operand (); else #endif if (GET_CODE (args_so_far) == CONST_INT) addr = memory_address (mode

nginx源码分析--ngx_http_optimize_servers()函数

这个函数做了连部分工作:1)以端口为入口点 将有用的信息存放到hash表内 2)调用ngx_http_init_listening()函数 对端口进行监听 1. 在ngx_http_core_main_conf_t结构体中有一个字段为ports,是一个数组,数组内存放的全是ngx_http_conf_port_t:对于每一个端口信息(ngx_http_conf_port_t),调用 ngx_http_server_names函数,同时也调用ngx_http_init_listening函数,这里

gcc源代码分析,debug_tree()函数,又一利器啊

gcc源代码分析,debug_rtx()函数,利器啊 print-tree.c #include "config.h" #include "tree.h" #include <stdio.h> /* Names of tree components. Used for printing out the tree and error messages.  */ #define DEFTREECODE(SYM, NAME, TYPE, LEN) NAME,