对于Nginx的架构,我觉得在了解各个模块功能之后,可能才有更深刻的认识(学习流程:总体功能了解-细节挖掘-深刻理解架构)。
1,首先我们了解Nginx的出现解决了什么问题,或者Nginx特点作用,下面是不大专业的总结:Nginx是一种七层负载均衡器,做的是反向代理,代理后端的真实服务器为用户提供服务,其实就是一个抽象的服务器,只不过这个服务器后端有很多的真实服务器,使我们能够获得比一般单个服务器更好更稳定的服务。也就是官方说法:高可用,高并发
2,为了实现高性能,Nginx采用的是多进程的工作模式,这里面有四个进程组件
master进程监视worker进程状态,并进行对应的信号处理和通知,在进程死掉时及时重启新进程,维持Nginx正常工作worker进程处理客户端请求,并根据master进程信号来做相应的事情cache loader进程加载缓存索引文件信息后退出cache manager进程管理磁盘的缓存大小,超过预定值大小后最少使用数据将被删除
image.png关于进程间的信号管理,下面是一个博主博客里的内容觉得总结得不错,摘录了一部分:
image.png摘自博客园rdchenxibo'ke
以Nginx reload流程为例:
Nginx命令行向master进程发送HUP信号(reload)master进程校验配置语法是否正确master进程打开新监听的端口master进程用新配置启动worker子进程master进程向老worker子进程发送quit信号老worker进程关闭监听句柄,并处理完当前连接后退出结束进程3,下面详细看一下Nginx框架模型的流程:
image.png摘录zhuanlan.zhihu.com/p/60341491
master进程先建好需要listen的socket后,然后再fork出多个woker进程,这样每个work进程都可以去accept这个socket。当一个client连接到来时,所有accept的work进程都会收到通知,但只有一个进程可以accept成功,其它的则会accept失败。Nginx提供了一把共享锁accept_mutex来保证同一时刻只有一个work进程在accept连接,从而解决惊群问题。当一个worker进程accept这个连接后,就开始读取请求,解析请求,处理请求,产生数据后,再返回给客户端,最后才断开连接,这样一个完成的请求就结束了。
4,Nginx模块执行流程
Nginx是一种模块化的设计,各种功能均是由对应的模块来完成,比如重定向是通过ngx_http_rewrite_module完成。对于各个模块来说,主要包含用于参数配置的模块配置结构,配置参数的nginx配置指令(类似于gzip, rewrite等directives),模块context用于定义模块在Nginx各个阶段的hook函数以及这些hook函数对应的处理函数handler,最后就是将前面的各个结构信息组合成ngx_module_t结构体。
之后,通过编译进Nginx,在运行到Nginx的各个请求处理阶段,模块就会工作了。
网友评论