/*工作进程的具体实现*/ static void ngx_worker_process_cycle(ngx_cycle_t *cycle, void *data) { /*实际是工作进程的序号*/ ngx_int_t worker = (intptr_t) data; ngx_process = NGX_PROCESS_WORKER; ngx_worker = worker; /*工作进程初始化,主要是根据cycle中的信息初始化一些设置,以及将监听管道的handler加入到event中*/ ngx_worker_process_init(cycle, worker); /*设置工作进程标题*/ ngx_setproctitle("worker process"); for ( ;; ) { if (ngx_exiting) { ngx_event_cancel_timers(); if (ngx_event_timer_rbtree.root == ngx_event_timer_rbtree.sentinel) { 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"); /*处理网络请求事件,这个函数是事件驱动机制的核心,既会处理普通的网络事件,也会处理定时器事件,它们分别被放在不同的事件队列种*/ ngx_process_events_and_timers(cycle); if (ngx_terminate) { ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "exiting"); ngx_worker_process_exit(cycle); } 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_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); } } }
static void ngx_worker_process_cycle(ngx_cycle_t *cycle, void *data) { ngx_int_t worker = (intptr_t) data; ngx_process = NGX_PROCESS_WORKER; ngx_worker = worker; /* worker进程的初始化工作 */ ngx_worker_process_init(cycle, worker); ngx_setproctitle("worker process"); /* worker进程的主循环 */ for ( ;; ) { /* 处理nginx退出 */ if (ngx_exiting) { ngx_event_cancel_timers(); if (ngx_event_timer_rbtree.root == ngx_event_timer_rbtree.sentinel) { 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"); /* 网络事件处理函数 */ ngx_process_events_and_timers(cycle); if (ngx_terminate) { ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "exiting"); ngx_worker_process_exit(cycle); } 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_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); } } }
static ngx_thread_value_t __stdcall ngx_worker_thread(void *data) { ngx_int_t n; ngx_cycle_t *cycle; cycle = (ngx_cycle_t *) ngx_cycle; for (n = 0; ngx_modules[n]; n++) { if (ngx_modules[n]->init_process) { if (ngx_modules[n]->init_process(cycle) == NGX_ERROR) { /* fatal */ exit(2); } } } while (!ngx_quit) { if (ngx_exiting) { ngx_event_cancel_timers(); if (ngx_event_timer_rbtree.root == ngx_event_timer_rbtree.sentinel) { break; } } ngx_log_debug0(NGX_LOG_DEBUG_CORE, cycle->log, 0, "worker cycle"); ngx_process_events_and_timers(cycle); if (ngx_terminate) { return 0; } if (ngx_quit) { ngx_quit = 0; if (!ngx_exiting) { ngx_exiting = 1; ngx_close_listening_sockets(cycle); ngx_close_idle_connections(cycle); } } if (ngx_reopen) { ngx_reopen = 0; ngx_reopen_files(cycle, -1); } } ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "exiting"); return 0; }
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; ngx_process = NGX_PROCESS_WORKER; ngx_worker = worker; ngx_worker_process_init(cycle, worker); ngx_setproctitle("worker process"); for ( ;; ) { if (ngx_exiting) { c = cycle->connections; for (i = 0; i < cycle->connection_n; i++) { /* THREAD: lock */ if (c[i].fd != -1 && c[i].idle) { c[i].close = 1; c[i].read->handler(c[i].read); } } ngx_event_cancel_timers(); if (ngx_event_timer_rbtree.root == ngx_event_timer_rbtree.sentinel) { 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"); ngx_process_events_and_timers(cycle); if (ngx_terminate) { ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "exiting"); ngx_worker_process_exit(cycle); } 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_close_listening_sockets(cycle); ngx_exiting = 1; } } if (ngx_reopen) { ngx_reopen = 0; ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "reopening logs"); ngx_reopen_files(cycle, -1); } } }
// 传递给ngx_spawn_process(),是worker进程的核心功能 // data实际上是进程号, (void *) (intptr_t) i static void ngx_worker_process_cycle(ngx_cycle_t *cycle, void *data) { // 把data再转换为进程序号 ngx_int_t worker = (intptr_t) data; ngx_uint_t i; ngx_connection_t *c; // 设置进程状态 ngx_process = NGX_PROCESS_WORKER; // nginx 1.9.x //ngx_worker = worker; // 读取核心配置,设置cpu优先级,core dump信息,unix运行的group/user // 切换工作路径,根据pid设置随机数种子 // 调用所有模块的init_process,让模块进程初始化 ngx_worker_process_init(cycle, worker); // 设置进程名字 ngx_setproctitle("worker process"); // 无限循环,处理事件和信号 for ( ;; ) { // 进程正在退出,即quit // 收到了-s quit,关闭监听端口后再停止进程(优雅关闭) if (ngx_exiting) { c = cycle->connections; for (i = 0; i < cycle->connection_n; i++) { /* THREAD: lock */ if (c[i].fd != -1 && c[i].idle) { c[i].close = 1; c[i].read->handler(c[i].read); } } // 取消定时器,调用handler处理 ngx_event_cancel_timers(); // 定时器红黑树为空,即已经没有任何事件 // 否则表示还有事件未处理,暂不退出 if (ngx_event_timer_rbtree.root == ngx_event_timer_rbtree.sentinel) { ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "exiting"); // 调用所有模块的exit_process,进程结束hook // 内部直接exit(0)退出 ngx_worker_process_exit(cycle); } } ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "worker cycle"); // 处理事件的核心函数, event模块里 // 处理socket读写事件和定时器事件 // 获取负载均衡锁,监听端口接受连接 // 调用epoll模块的ngx_epoll_process_events // 然后处理超时事件和在延后队列里的所有事件 // nginx大部分的工作量都在这里 ngx_process_events_and_timers(cycle); // 收到了-s stop,直接停止进程 if (ngx_terminate) { ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "exiting"); // 调用所有模块的exit_process,进程结束hook // 内部直接exit(0)退出 ngx_worker_process_exit(cycle); } // 收到了-s quit,关闭监听端口后再停止进程(优雅关闭) 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) { // in ngx_connection.c // 遍历监听端口列表,逐个删除监听事件 // 不再接受新的连接请求 ngx_close_listening_sockets(cycle); // 设置ngx_exiting标志,继续走循环 // 等所有事件都处理完了才能真正退出 ngx_exiting = 1; } } // 收到了-s reopen,重新打开文件 if (ngx_reopen) { ngx_reopen = 0; ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "reopening logs"); ngx_reopen_files(cycle, -1); } } // 无限循环,处理事件和信号 }