upstream 的流程后面单出一篇。
main 入口
int ngx_cdecl main(int argc, char *const *argv)
{
//1、声明一波对象,打印一些基本信息,初始化一些东西
//2、通过 ngx_save_argv(&init_cycle, argc, argv),将 argv 参数拷贝到一份内存中
if (ngx_save_argv(&init_cycle, argc, argv) != NGX_OK) {
return 1;
}
/*
argv 参数是什么?就是管理者想nginx传入的信号,如 nginx -s reload之类的
在后面还能找到信号捕捉函数,我已经把源码也铺开了,后面再看
*/
//然后继续init
//3、信号捕捉
if (ngx_signal) {
return ngx_signal_process(cycle, ngx_signal);
}
//继续配置
/…/
#if !(NGX_WIN32)
if (ngx_init_signals(cycle->log) != NGX_OK) {
return 1;
}
if (!ngx_inherited && ccf->daemon) {
// 4、创建守护进程
if (ngx_daemon(cycle->log) != NGX_OK) {
return 1;
}
ngx_daemonized = 1;
}
if (ngx_inherited) {
ngx_daemonized = 1;
}
#endif
/…/
//5、启动进程循环咯
if (ngx_process == NGX_PROCESS_SINGLE) {
ngx_single_process_cycle(cycle);
} else {
ngx_master_process_cycle(cycle);
}
return 0;
}
ngx_master_process_cycle 进入多进程模式
/**
- Nginx的多进程运行模式
*/
void ngx_master_process_cycle(ngx_cycle_t *cycle) {
char *title;
u_char *p;
size_t size;
ngx_int_t i;
ngx_uint_t n, sigio;
sigset_t set;
struct itimerval itv;
ngx_uint_t live;
ngx_msec_t delay;
ngx_listening_t *ls;
ngx_core_conf_t *ccf;
/* 设置能接收到的信号 */
sigemptyset(&set);
sigaddset(&set, SIGCHLD);
sigaddset(&set, SIGALRM);
sigaddset(&set, SIGIO);
sigaddset(&set, SIGINT);
sigaddset(&set, ngx_signal_value(NGX_RECONFIGURE_SIGNAL));
sigaddset(&set, ngx_signal_value(NGX_REOPEN_SIGNAL));
sigaddset(&set, ngx_signal_value(NGX_NOACCEPT_SIGNAL));
sigaddset(&set, ngx_signal_value(NGX_TERMINATE_SIGNAL));
sigaddset(&set, ngx_signal_value(NGX_SHUTDOWN_SIGNAL));
sigaddset(&set, ngx_signal_value(NGX_CHANGEBIN_SIGNAL));
if (sigprocmask(SIG_BLOCK, &set, NULL) == -1) {
ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
“sigprocmask() failed”);
}
sigemptyset(&set);
size = sizeof(master_process);
for (i = 0; i < ngx_argc; i++) {
size += ngx_strlen(ngx_argv[i]) + 1;
}
/* 保存进程标题 */
title = ngx_pnalloc(cycle->pool, size);
if (title == NULL) {
/* fatal */
exit(2);
}
p = ngx_cpymem(title, master_process, sizeof(master_process) - 1);
for (i = 0; i < ngx_argc; i++) {
*p++ = ’ ';
p = ngx_cpystrn(p, (u_char *) ngx_argv[i], size);
}
ngx_setproctitle(title);
/* 获取核心配置 ngx_core_conf_t */
ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module);
/* 启动工作进程 - 多进程启动的核心函数 */
ngx_start_worker_processes(cycle, ccf->worker_processes,
NGX_PROCESS_RESPAWN);
ngx_start_cache_manager_processes(cycle, 0);
ngx_new_binary = 0;
delay = 0;
sigio = 0;
live = 1;
/* 主线程循环 */
for (;😉 {
/* delay用来设置等待worker推出的时间,master接受了退出信号后,
- 首先发送退出信号给worker,而worker退出需要一些时间*/
if