nginx进程管理

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进程结构:
typedef struct 
{
    ngx_pid_t            pid;                   //进程的ID
    int                  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结构变量:
typedef struct 
{
     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)

这里写图片描述

猜你喜欢

转载自blog.csdn.net/m18706819671/article/details/80720965