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)