Nginx架构

217 阅读2分钟

这张图真的很nice

Nginx架构 

> master进程主要用来管理worker进程,具体包括如下4个主要功能:

> 1)接受来自外界的信号。其中master循环中的各项标志位就对应着各种信号,如:ngx_quit代表QUIT信号,表示优雅的关闭整个服务。

> 2)向各个worker进程发送信。比如ngx_noaccept代表WINCH信号,表示所有子进程不再接受处理新的连接,由master向所有的子进程发送QUIT信号量。

> 3)监控worker进程的运行状态。比如ngx_reap代表CHILD信号,表示有子进程意外结束,这时需要监控所有子进程的运行状态,主要由ngx_reap_children完成。

> 4)当woker进程退出后(异常情况下),会自动重新启动新的woker进程。主要也是在ngx_reap_children。

> Nginx热更配置,具体流程:master使用新配置启动新的worker,旧的worker不再接受新的请求。

> Nginx热更配置,具体流程:新旧master和worker共存。向老master发送WINCH信号,关闭旧worker进程,观察新worker进程工作情况。若升级成功,则向老master进程发送QUIT信号,关闭老master进程

> epoll利用红黑树高效的增删查效率来管理连接,利用一个双向链表来维护活跃连接

> 多个worker来出来accept事件冲突:设置ngx_accept_mutex锁,只有获得锁的进程,才可以处理连接事件

> 为什么不采用多线程模型管理连接/处理逻辑业务? 无状态服务,无需共享进程内存;一个进程异常崩溃,其他进程的服务不会中断,提升了架构的可靠性;作为接入层,基本上都是数据转发业务,网络IO任务的等待耗时部分,已经被处理为非阻塞/全异步/事件驱动模式,在没有更多CPU的情况下,再利用多线程处理,意义不大