nginx进程管理

2022年9月4日10:15:26

nginx进程管理==> master + 多个worker进程
master进程:全局的初始化 和管理 worker进程
worker进程:主要业务逻辑,事件处理
通信:socketpair ==> 每次fork完一个子进程后都把句柄传给前面已经存在的进程,以达到子进程间通信

nginx有多进程启动和单进程启动
这里写图片描述

主要分析多进程启动:
nginx中的fork在ngx_spawn_process函数中进行
ngx_pid_t
ngx_spawn_process(ngx_cycle_t *cycle, ngx_spawn_proc_pt proc,void *data,char *name, ngx_int_t respawn)
第一个参数是全局的配置,第二个参数是子进程需要执行的函数,第三个参数是proc的参数,第四个类型/*作用::
1 有一个ngx_processes全局数组,包含了所有的存货的子进程,这里会fork出来的子进程放入到相应的位置。
并设置这个进程的相关属性。
2 创建socketpair,并设置相关属性。
3 在子进程中执行传递进来的函数。
*/

nginx进程结构:typedefstruct 
{
    ngx_pid_t            pid;//进程的IDint                  status;//进程的退出状态
    ngx_socket_t         channel[2];//用于socketpair通信的一对socket句柄
    ngx_spawn_proc_pt    proc;//进程的执行函数void                 *data;//proc的参数char                 *name;//进程的title标识unsigned             respawn:1;//进程的状态:重新创建的unsigned             just_spawn:1;//进程的状态: 第一次创建的unsigned             detached:1;//进程的状态: 分离的,独立的unsigned             exiting:1;//进程的状态: 正在退出的unsigned             exited:1;//进程的状态: 已经退出的
} ngx_process_t;(src/os/unix/ngx_process.h)

master每创建一个worker都会把一个设置好的ngx_process_t结构变量放入ngx_processes中,新创建的进程存放在ngx_process_slot位置(遍历数组,查看是否空闲id == -1)


master进程向worker子进程发送命令是通过socketpair创建的一对socket实现的,之间传输的是ngx_channel_t结构变量:typedefstruct 
{
     ngx_uint_t  command;//发送的命令
     ngx_pid_t   pid;//发送方进程的进程id
     ngx_int_t   slot;//发送方进程在进程表中偏移位置
     ngx_fd_t    fd;//发送给对方的文件句柄
} ngx_channel_t;(src/os/unix/ngx_channel.h)

这里写图片描述

  • 作者:草戍无心
  • 原文链接:https://blog.csdn.net/m18706819671/article/details/80720965
    更新时间:2022年9月4日10:15:26 ,共 1185 字。