一、Nginx工作原理二、Nginx进程模型三、Nginx處理HTTP请求流程
Nginx由内核和一个模块的指模块本身组成Nginx本身做的工作实际很少,当它接到一个HTTP请求时它仅仅是通过查找配置文件将此次请求映射到一个location block。
此location中所配置的各个指令则会启动不同的一个模块的指模块本身去完成工作因此一个模块的指模块本身可以看做Nginx真正的劳動工作者。
通常一个location中的指令会涉及一个handler一个模块的指模块本身和多个filter一个模块的指模块本身(当然多个location可以复用同一个一个模块的指模块本身)。
handler一个模块的指模块本身负责处理请求完成响应内容的生成,而filter一个模块的指模块本身对响应内容进行处理
用户根据自己嘚需要开发的一个模块的指模块本身都属于第三方一个模块的指模块本身,正是有了这么多一个模块的指模块本身的支撑Nginx的功能才会如此强大。
Nginx的一个模块的指模块本身从结构上分为核心一个模块的指模块本身、基础一个模块的指模块本身和第三方一个模块的指模块本身:
Nginx的一个模块的指模块本身从功能上分为如下三类:
Handlers(处理器一个模块的指模块本身)此类一个模块的指模块本身直接处理请求,并进荇输出内容和修改headers信息等操作Handlers处理器一个模块的指模块本身一般只能有一个。
Filters (过滤器一个模块的指模块本身)此类一个模块的指模塊本身主要对其他处理器一个模块的指模块本身输出的内容进行修改操作,最后由Nginx输出
Proxies (代理类一个模块的指模块本身)。此类一个模塊的指模块本身是Nginx的HTTP Upstream之类的一个模块的指模块本身这些一个模块的指模块本身主要与后端一些服务比如FastCGI等进行交互,实现服务代理和负載均衡等功能
下面用一张图来展示一下:
Nginx默认采用多进程工作方式,Nginx启动后会运行一个master进程和多个worker进程。
master进程充当整个进程组与用户嘚交互接口同时对进程进行监护,管理
worker进程来实现重启服务、平滑升级、更换日志文件、配置文件实时生效等功能。
worker用来处理基本的網络事件worker之间是平等的,他们共同竞争来处理来自客户端的请求
nginx的进程模型如图所示:
然后从master进程中fork()出多个worker进程,如此一来每个worker进程嘟可以监听用户请求的socket
一般来说,当一个连接进来后所有worker都会收到通知,但是只有一个进程可以接受这个连接请求其它的都失败,這是所谓的惊群现象
nginx提供了一个accept_mutex(互斥锁),有了这把锁之后同一时刻,就只会有一个进程在accpet连接这样就不会有惊群问题了。
ngx_accept_disable越大让出的机会就越多,其它进程获取锁的机会也就越大不去accept,每个worker进程的连接数就控制下来了其它进程的连接池就会得到利用,这样nginx就控制了多进程间连接的平衡。
这里的连接池里面保存的其实不是真实的连接它只是一个worker_connections大小的一个ngx_connection_t结构的数组。
每次获取一个连接時就从空闲连接链表中获取一个,用完后再放回空闲连接链表里面。
因为作为反向代理服务器每个并发会建立与客户端的连接和与後端服务的连接,会占用两个连接
http请求是典型的请求-响应类型的的网络协议。http是文件协议所以我们在分析请求行与请求头,以及输出響应行与响应头往往是一行一行的进行处理。
通常在一个连接建立好后读取一行数据,分析出请求行中包含的method、uri、http_version信息
然后再一行┅行处理请求头,并根据请求method与请求头的信息来决定是否有请求体以及请求体的长度然后再去读取请求体。
得到请求后我们处理请求產生需要输出的数据,然后再生成响应行、响应头以及响应体
在将响应发送给客户端之后,一个完整的请求就处理完了
特别声明:本攵为网易自媒体平台“网易号”作者上传并发布,仅代表该作者观点网易仅提供信息发布平台。