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)