Nginx工作流程

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请求

  1. 首先请求是从ngx_http_init_request 开始的,在这个函数中开始初始化,设置读事件 ngx_http_process_request_line,然后网络事件请求,会由它来进行处理执行。
  2. 在ngx_http_process_request_line 函数中,会处理请求行,即通过 ngx_http_read_request_header 来读取请求数据。然后调用 ngx_http_parse_request_line 分析读取到的请求数据。Nginx 为提高效率,采用状态机来解析请求行,而且在进行 method 的比较时,没有直接使用字符串比较,这样做可以减少 cpu 的指令数。通过解析会得到解析得到schema host uri version。
  3. 在解析完请求行后,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中存放着请求头与请求处理函数的映射关系。
  4. 设置当读写事件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 中的最后一个函数)。
    在这里插入图片描述
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值