一、说明
前面很多内容,可以说大致了解了下nginx是进程是怎么启动的,进程之间是如何通信的,花一些时间或多或少也都还是能看得懂的,后面要去了解ngx_worker_process_cycle函数,worker进程所有的实现或者核心基本都是在这个函数里面,可能需要花蛮长的时间去消耗去理解。
二、方法主流程
static void
ngx_worker_process_cycle(ngx_cycle_t *cycle, void *data)
{
// 我们的场景 worker=1,ngx_processes数组中的编号
ngx_int_t worker = (intptr_t) data;
// 设置两个全局变量后续用到
ngx_process = NGX_PROCESS_WORKER;
ngx_worker = worker;
// 初始化worker进程,包括一些数据结构、socket、套接字等等
// TODO 需要展开去了解
ngx_worker_process_init(cycle, worker);
// 设置进程名
ngx_setproctitle("worker process");
// 无条件循环保持进程
for ( ;; ) {
// nginx在quit的时候 ngx_exiting = 1
// worker进程在ngx_worker_process_exit函数里面进行退出exit(0)
if (ngx_exiting) {
if (ngx_event_no_timers_left() == NGX_OK) {
ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "exiting");
ngx_worker_process_exit(cycle);
}
}
ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "worker cycle");
// 这个函数就worker进程核心的模块,定义了事件监听跟定时器
// TODO
ngx_process_events_and_timers(cycle);
// nginx终结,退出进程
if (ngx_terminate) {
ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "exiting");
ngx_worker_process_exit(cycle);
}
// nginx退出
if (ngx_quit) {
ngx_quit = 0;
ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0,
"gracefully shutting down");
ngx_setproctitle("worker process is shutting down");
if (!ngx_exiting) {
ngx_exiting = 1;
ngx_set_shutdown_timer(cycle);
ngx_close_listening_sockets(cycle);
ngx_close_idle_connections(cycle);
}
}
if (ngx_reopen) {
ngx_reopen = 0;
ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "reopening logs");
ngx_reopen_files(cycle, -1);
}
}
}
三、worker进程初始化
./src/os/unix/ngx_prorcess_cycle.c
ngx_work