nginx master的工作及其和worker的通信方式

single的工作

  1. 调用所有模块的init_process函数回调,进行模块进程初始化

  2. 无限循环,通过ngx_process_events_and_timers()处理网络连接与定时器事件。

  3. 处理信号,主要处理三种:ngx_terminate||ngx_quit(TERM||QUIT)、ngx_reconfigure(HUP)、ngx_reopen(USR1)

master的工作

  1. main函数最后会选择进入single还是master模式

  2. 初始化信号集合

  3. 启动worker进程

  4. 开启进程缓存管理,如果启用了proxy(fastcgi) cache功能,master process会在启动的时候启动管理缓存的两个子进程(区别于处理请求的子进程)来管理内存和磁盘的缓存个体。第一个进程的功能是定期检查缓存,并将过期的缓存删除;第二个进程的作用是在启动的时候将磁盘中已经缓存的个体映射到内存中(目前Nginx设定为启动以后60秒),然后退出。

  5. 死循环,接收信号进行相应处理,主要用来管理worker进程,包含:接收来自外界的信号,向各worker进程发送信号,监控worker进程的运行状态,当worker进程退出后(异常情况下),会自动重新启动新的worker进程。

worker进程

  • 所有worker进程的listenfd会在新连接到来时变得可读,为保证只有一个进程处理该连接,所有worker进程在注册listenfd读事件前抢accept_mutex,抢到互斥锁的那个进程注册listenfd读事件,在读事件里调用accept接受该连接。

master和worker的通信

  • master接收信号,通过使用channel来向worker进程发送命令

  • master进程用于处理SIGCHLD信号的函数ngx_reap_children中就有向worker进程发送关闭channel的指令

  • worker进程在调用ngx_worker_process_init函数时,通过ngx_add_channel_event将channel放到epoll事件处理模块中。

  • 当收到master进程发过来的命令后,就调用ngx_channel_handler处理,其核心逻辑如下

master如何感知到worker进程退出

  • worker进程会发送CHLD信号

最后更新于

这有帮助吗?