static void ngx_worker_process_cycle(ngx_cycle_t *cycle, void *data) { ngx_int_t worker = (intptr_t) data; ngx_uint_t i; ngx_connection_t *c; /* 该函数内会调用所有模块的init_process方法 */ ngx_worker_process_init(cycle, worker); ... for ( ;; ) { /* 退出进程标识 */ if (ngx_exiting) { c = cycle->connections; /* 关闭所有连接 */ for (i = 0; i < cycle->connection_n; i++) { if (c[i].fd != -1 && c[i].idle) { c[i].close = 1; /* close标识置1 */ c[i].read->handler(c[i].read); /* 调用读事件处理方法 */ } } if (ngx_event_timer_rbtree.root == ngx_event_timer_rbtree.sentinel) { /* 红黑树为空,已经处理完所有事件,调用所有模块的exit_process方法 */ ngx_worker_process_exit(cycle); } } /* 还有事件需要处理,继续向下执行 */ ngx_process_events_and_timers(cycle); /* 处理事件,事件模块核心方法 */ /* 强制关闭进程 */ if (ngx_terminate) ngx_worker_process_exit(cycle); /* 直接调用所有模块的exit_process方法退出worker进程 */ /* 优雅的关闭连接 */ if (ngx_quit) { ngx_quit = 0; ngx_setproctitle("worker process is shutting down"); /* 修改进程名字 */ if (!ngx_exiting) { ngx_close_listening_sockets(cycle); /* 关闭监听句柄 */ ngx_exiting = 1; /* ngx_exiting标识唯一被修改的地方 */ } } if (ngx_reopen) { /* 重新打开所有文件 */ ngx_reopen = 0; ngx_reopen_files(cycle, -1); } } }
void ngx_master_process_cycle(ngx_cycle_t *cycle) { ... /* 根据配置文件启动worker_processes个work子进程 */ ngx_start_worker_processes(cycle, ccf->worker_processes, NGX_PROCESS_RESPAWN); /* master进程 */ for ( ;; ) { sigsuspend(&set); /* 阻塞,等待信号 */ if (ngx_reap) { ngx_reap = 0; /* 监控所有子进程,重新启动非正常退出的子进程 */ live = ngx_reap_children(cycle); } /* live为0表示所有子进程已经退出 */ if (!live && (ngx_terminate || ngx_quit)) { /* 满足上述条件,退出master进程,包括: * 1、删除存储进程的pid文件 * 2、调用所有模块的exit_master方法 * 3、关闭监听端口 * 4、销毁内存池 */ ngx_master_process_exit(cycle); } if (ngx_terminate) /* 强制关闭 */ { if (delay > 1000) { ngx_signal_worker_processes(cycle, SIGKILL); /* SIGKILL = 9 */ } else { /* NGX_TERMINATE_SIGNAL = TERM = 15 * 向每个子进程发送TERM信号 */ ngx_signal_worker_processes(cycle, ngx_signal_value(NGX_TERMINATE_SIGNAL)); } continue; /* 跳上去挂起 */ } if (ngx_quit) /* 优雅的退出,向所有子进程发送QUIT信号 */ { ngx_signal_worker_processes(cycle, ngx_signal_value(NGX_SHUTDOWN_SIGNAL)); /* NGX_SHUTDOWN_SIGNAL = QUIT */ ls = cycle->listening.elts; /* 关闭所有端口 */ for (n = 0; n < cycle->listening.nelts; n++) ngx_close_socket(ls[n].fd); cycle->listening.nelts = 0; continue; /* 跳上去挂起 */ } if (ngx_reconfigure) /* 需要重新读取配置文件 */ { /* 重新读取配置文件后,生成新的worker进程,销毁旧的worker进程 */ ngx_reconfigure = 0; cycle = ngx_init_cycle(cycle); /* 重新配置ngx_cycle_t结构体 */ ngx_cycle = cycle; ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module); /* 重新派生子进程 */ ngx_start_worker_processes(cycle, ccf->worker_processes, NGX_PROCESS_JUST_RESPAWN); ngx_start_cache_manager_processes(cycle, 1); live = 1; /* 表示有子进程在运行 */ /* 向旧的子进程发送QUIT信号,要求它们退出 */ ngx_signal_worker_processes(cycle, ngx_signal_value(NGX_SHUTDOWN_SIGNAL)); } if (ngx_restart) /* 重启work进程 */ { ngx_restart = 0; ngx_start_worker_processes(cycle, ccf->worker_processes, NGX_PROCESS_RESPAWN); ngx_start_cache_manager_processes(cycle, 0); live = 1; /* 表示有子进程在运行 */ } if (ngx_reopen) /* 重新打开所有文件 */ { ngx_reopen = 0; ngx_reopen_files(cycle, ccf->user); /* 向所有子进程发送USR1信号,要求每个子进程重新打开文件 */ ngx_signal_worker_processes(cycle, ngx_signal_value(NGX_REOPEN_SIGNAL)); } if (ngx_change_binary) /* 平滑升级 */ { ngx_change_binary = 0; ngx_new_binary = ngx_exec_new_binary(cycle, ngx_argv); /* 新的子进程启动新版本的Nginx */ } if (ngx_noaccept) /* 优雅的关闭服务 */ { ngx_noaccept = 0; ngx_noaccepting = 1; /* 向所有子进程发送QUIT信号,要求它们优雅的关闭服务 */ ngx_signal_worker_processes(cycle, ngx_signal_value(NGX_SHUTDOWN_SIGNAL)); } } }
原文:http://blog.csdn.net/nestler/article/details/37084113