nginx 一条请求 同时分发给两个程序 如何实现
发布网友
发布时间:2022-04-20 09:58
我来回答
共1个回答
热心网友
时间:2023-09-19 20:06
1.main里面调用ngx_init_cycle(src/core/ngx_cycle.c),ngx_init_cycle里面完成很多基本的配置,如文件,共享内存,socket等。
2.上图左上角是ngx_init_cycle里面调用的ngx_open_listening_sockets(src/core/ngx_connection.c)主要完成的工作,包括基本的创建socket,setsockopt,bind和listen等。
3.然后是正常的子进程生成过程。在每个子worker进程的ngx_worker_process_cycle中,在调用ngx_worker_process_init里面调用各模块的初始化操作init_process。一epoll mole为例,这里调用ngx_event_process_init,里面初始化多个NGX_EVENT_MODULE类型的mole.NGX_EVENT_MODULE类型的只有ngx_event_core_mole和ngx_epoll_mole。前一个mole的actions部分为空。ngx_epoll_mole里面的init函数就是ngx_epoll_init。ngx_epoll_init函数主要完成epoll部分相关的初始化,包括epoll_create,设置ngx_event_actions等。
4.初始化完ngx_epoll_mole,继续ngx_event_process_init,然后循环设置每个listening socket的read handler为ngx_event_accept.最后将每个listening socket的READ事件添加到epoll进行等待。
5.ngx_event_process_init初始化完成后,每个worker process开始循环处理events&timers。最终调用的是epoll_wait。由于之前listening socket以及加入到epoll,所以如果监听字有read消息,那么久调用rev->handler进行处理,监听字的handler之前已经设置为ngx_event_accept。ngx_event_accept主要是调用accept函数来接受新的客户端套接字client socket。