nginx进程模型

主进程调用ngx_master_process_cycle创建和管理子进程;

主进程的处理的信号有:

SIGCHLD ---- 设置ngx_reap
SIGALRM ---- 设置ngx_sigalrm
SIGIO ---- 设置ngx_sigio
SIGINT ---- 设置ngx_terminate
SIGHUP ---- reload,设置ngx_reconfigure
SIGWHICH ---- 设置ngx_noaccept
SIGTERM ---- stop,设置ngx_terminate
SIGQUIT ---- quit ,设置ngx_quit
SIGURS1 ---- reopen,设置ngx_reopen
SIGUSR2 ---- 设置ngx_change_binary

信号处理函数ngx_signal_handler统一处理所有信号,设置相应flag,如果信号是SIGCHLD,则调用ngx_process_get_status获取和设置子进程状态;(信号处理函数需保存&恢复errno);

调用ngx_start_worker_processes启动worker进程;

调用ngx_start_cache_manager_processes启动cache管理进程;

主进程和子进程之间通过信号和channel进行通信(unix socket pair);

循环调用sigsuspend等待信号;

当捕获了信号时,根据设置的flag进行相应的处理;


子进程处理的信号有:

SIGINT ---- 设置ngx_terminate

SIGWHICH ---- 设置ngx_debug_quit

SIGTERM ---- stop,设置ngx_terminate

SIGQUIT ---- quit ,设置ngx_quit

SIGURS1 ---- reopen,设置ngx_reopen


主进程通过调用ngx_signal_worker_processes向子进程发送信号;

主进程收到SIGINT或SIGTERM信号时,会给子进程先发送SIGTERM信号,最后发送SIGKILL;

主进程收到SIGQUIT或SIGWHICH信号时,会给子进程发送SIGQUIT信号;

主进程收到SIGURS1信号时,会给子进程发送SIGURS1信号;

主进程收到SIGCHLD信号时,信号处理函数设置ngx_reap标记,并且设置退出子进程的status和exited标记,当子进程退出码为2时,清除其respawn标记,主进程继而调用ngx_reap_children函数:

该函数负责广播退出子进程的状态给其他所有活着的子进程,同步channel信息;

如果主进程不是处于ngx_terminate和ngx_quit状态,且退出子进程设置了respawn标记,则调用ngx_spawn_process尝试重新启动子进程;

如果主进程处于ngx_terminate或ngx_quit状态,则不重启退出子进程,设置ngx_processes[i].pid = -1回收该槽位;

当ngx_new_binary子进程意外退出时,如果设置了ngx_noaccepting,则设置ngx_restart标记,同时清空ngx_noaccepting;

该函数返回值表示当前是否存在活着的子进程;

当主进程收到SIGINT或SIGTERM信号时,信号处理函数设置ngx_terminate标记,主进程继而给子进程发送SIGTERM信号,然后设置delay timer等待子进程退出,如果timer超时还有活着子进程,则继续给它们发送SIGTERM信号,如果delay时间超过阈值,则给子进程发送SIGKILL信号强制杀死子进程,当所有子进程都退出(ngx_reap_children返回0)时,调用ngx_master_process_exit退出主进程;

当主进程收到SIGQUIT信号时,信号处理函数设置ngx_quit标记,主进程继而给子进程发送SIGQUIT信号,并且关闭listening sockets,等待所有子进程退出后,调用ngx_master_process_exit退出主进程;

当主进程收到SIGHUP信号时,信号处理函数设置ngx_reconfigure标记,主进程继而调用ngx_init_cycle重新加载配置生成新的cycle(会继承配置相同的listening sockets、共享内存等,old cycle会被延迟回收),调用ngx_start_worker_processes和ngx_start_cache_manager_processes以NGX_PROCESS_JUST_RESP方式创建woker进程和cache管理进程,给old子进程(not just respawned)发送SIGQUIT信号;该过程大流程是:重新加载配置、生成使用新配置的子进程、关闭使用旧配置的子进程,从而实现reload配置功能;

当主进程收到SIGUSR1信号时,信号处理函数设置ngx_reopen标记,主进程继而调用ngx_reopen_files重新打开cycle->open_files,接着给子进程发送SIGUSR1信号;

当主进程收到SIGURS2信号时,信号处理函数设置ngx_change_binary标记,主进程继而调用ngx_exec_new_binary加载新bin,此过程会将listening fds通过NGXIN环境变量传递给ngx_new_binary子进程;

当主进程收到SIGWHICH信号时,信号处理函数设置ngx_noaccept标记,主进程继而设置ngx_noaccepting标记,并且给子进程发送SIGQUIT信号;

当主进程收到SIGUSR1信号时,信号处理函数设置ngx_reopen标记,主进程继而调用ngx_reopen_files重新打开cycle->open_files,接着给子进程发送SIGUSR1信号;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值