1、Nginx的工作模式
Nginx有两种工作模式,分别为单进程工作模式和多进程工作模式。
单进程工作模式:除了一个主进程外,还有一个工作进行。这个工作进程是单线程的。默认的工作模式
多进程工作模式:除了一个主进程外,还有一个工作进行,每一个进程包含多个线程。
2、Nginx模块
Nginx的模块从功能上分为如下四类:
**Core(核心模块):**构建nginx基础服务、管理其他模块。
**Handlers(处理器模块):**此类模块直接处理请求,主要负责处理客户端请求并产生待响应内容。
**Filters (过滤器模块):**此类模块主要对其他处理器模块输出的内容进行修改。
**Upstraem (反代理类模块):**此类模块是实现反向代理的功能。
**load-balancer(负载均衡模块)😗*实现特定的算法,从服务器中选择一个合适的服务器进行相应请求
2.1 各模块工作流程
1)客户端发送HTTP请求
2) Nginx从配置文件选择一个合适的模块 , (如果有)负载均衡模块就根据相应的算法选择一个合适的服务器
3)处理模块对客户端的请求进行处理,并把输出缓冲放到第一个过滤模块上
4) 第一个过滤模块处理后输出给第二个过滤模块,依此类推
5) 最后把响应发给客户端。
3、Nginx的工作流程
3.1 Nginx进程模型
Nginx启动后,会运行**一个master进程和多个worker进程。其中master充当整个进程组与用户的交互接口,同时对进程进行监护,管理worker进程来实现重启服务、更换日志文件、配置文件实时生效等功能,主要负责给Worker分配工作,自己不参与具体的工作之中。worker用来处理基本的网络事件,多个worker之间是平等的,,多个 worker 以争抢**的机制来抢夺任务,得到任务的 worker 会将请求经由 tomcat 等做请求转发、反向代理、访问数据库等(nginx 本身是不直接支持 java 的)。
3.2 Worker工作流程
worker之间是平等的,,多个 worker 以**争抢**的机制来抢夺任务,得到任务的 worker 会将请求经由 服务器做反向代理、访问数据库等
**注:**Nginx 本身是不直接支持 java 的
3.2.1 Worker设置
在Nginx中有多个worker,他们的地位是平等的,采用争夺的方式来争夺任务,所以worker的数量多的时候可以增加系统的性能,但并不是worker的数量越多越好。worker 数和服务器的 cpu 数相等是最合适,因为Nginx 和 redis 类似,都采用了 IO 多路复用机制(在windows系统时这种机制不能充分发挥会其性能,一般都会在Liunx系统中使用,这也就是为什么Nginx一般都在Liunx系统中使用的原因),而且每一个worker都是一个独立的进程,每个进程里只有一个主线程,通过异步非阻塞的方式来处理请求,每个 worker 的线程可以把一个 cpu 的性能发挥到极致。
最重要的是这种模式,即一个master和多个worker的设计模式,可以使Nginx支持热部署,即nginx -s reload,同时由于每个 worker 是独立的进程,如果其中一个 worker 出现问题,其它 worker 是独立运行的,会继续争抢任务,实现客户端的请求过程,而不会造成服务中断。
注:一般情况下在发送一个请求的时候,会有2个或者4个连接
4、Nginx处理HTTP请求
- 首先请求是从ngx_http_init_request 开始的,在这个函数中开始初始化,设置读事件 ngx_http_process_request_line,然后网络事件请求,会由它来进行处理执行。
- 在ngx_http_process_request_line 函数中,会处理请求行,即通过 ngx_http_read_request_header 来读取请求数据。然后调用 ngx_http_parse_request_line 分析读取到的请求数据。Nginx 为提高效率,采用状态机来解析请求行,而且在进行 method 的比较时,没有直接使用字符串比较,这样做可以减少 cpu 的指令数。通过解析会得到解析得到schema host uri version。
- 在解析完请求行后,Nginx 会设置读事件 ngx_http_process_request_headers,然后后面的请求就在ngx_http_process_request_headers 中进行读取解析。ngx_http_process_request_headers 函数用来读取请求头时,会调用 ngx_http_read_request_header 来读取请求头,进而调用 ngx_http_parse_header_line 来进行解析,然后解析到的请求头会在ngx_http_headers_in找到对应的过滤器(ngx_http_headers_in中存放着请求头与请求处理函数的映射关系。
- 设置当读写事件ngx_http_request_handler处理函数 ,然后调用 ngx_http_handler 来真正开始处理一个完整的http请求,进而调用ngx_http_core_run_phases,并执行 ngx_http_core_run_phases 函数。ngx_http_core_run_phases 这个函数将执行多阶段请求处理,然后再发送body前调用一次header filte,执行 header filter 中的所有 filter,在 header filter 中的最后一个 filter,即 ngx_http_header_filter,这个 filter 将会遍历所有的响应头,然后再调用ngx_http_copy_filter进而调用body filte执行所有 filter,最然后调用 ngx_http_write_filter 进行输出(ngx_http_write_filter 是 body filter 中的最后一个函数)。