nginx基本原理,nginx实现原理,详解Nginx 工作原理

nginx基本原理,nginx实现原理,详解Nginx 工作原理

本文主要介绍nginx的工作原理,帮助你更好的了解和学习Nginx。感兴趣的朋友可以了解一下。

Nginx工作原理

Nginx由内核和模块组成。

实际上NGX本身做的工作很少。当它接收到一个HTTP请求时,只是通过查找配置文件将请求映射到一个位置块,在这个位置配置的每条指令都会启动不同的模块来完成工作,所以模块可以算是Nginx真正的劳动者。通常,一个位置中的一条指令涉及一个处理程序模块和多个过滤器模块(当然,多个位置可以重用同一个模块)。Handler模块负责处理请求并完成响应内容的生成,而filter模块处理响应内容。

用户根据自身需求开发的所有模块都属于第三方模块。正是有了这么多模块的支持,Nginx的功能才如此强大。

Nginx的模块在结构上分为核心模块、基础模块和第三方模块:

核心模块:HTTP模块、事件模块和邮件模块。

基本模块:HTTP访问模块,HTTP FastCGI模块,HTTP代理模块和HTTP重写模块,

第三方模块:HTTP上游请求哈希模块、通知模块和HTTP访问密钥模块。

Nginx的模块按照功能分为以下三类:

处理器(处理器模块)。这种模块直接处理请求,输出内容并修改头信息。处理器模块只能有一个处理程序。

过滤器(过滤器模块)。这类模块主要是修改其他处理器模块的输出,最后由Nginx输出。

代理(代理模块)。这类模块就是类似Nginx的HTTP上游的模块。这些模块主要与FastCGI等一些后端服务进行交互。并实现服务代理、负载均衡等功能。

Nginx进程模型

NGX默认采用多进程工作模式。Nginx启动后,会运行一个主进程和几个工作进程。Master作为整个进程组与用户的交互接口,监控进程,管理worker进程,实现服务重启、平滑升级、更改日志文件、配置文件实时生效等功能。工作器用于处理基本的网络事件。工人是平等的,他们一起竞争来处理来自客户的请求。

nginx的流程模型如图所示:

创建主进程时,首先建立需要监控的socket(listenfd),然后从主进程中分叉出几个worker进程(),让每个worker进程可以监控更多用户请求的socket。一般来说,当一个连接进来时,所有的Worker都会被通知,但是只有一个进程可以接受连接请求,其他的都会失败。这就是所谓的恐慌现象。Nginx提供了一个accept_mutex(互斥锁)。有了这个锁,在同一时间,accpet中只会连接一个进程,这样就不会出现死机问题。

先打开accept_mutex选项,只有获得了accept_mutex的进程才会添加accept事件。NGX使用一个名为ngx_accept_disabled的变量来控制是否竞争accept_mutex锁。ngx _ accept _ disabled=NGINX单个进程所有连接的总数/8-空闲连接数。当NGX _ ACCEPT _ DISABLED大于0时,将不会尝试获取accept_mutex锁。NGX _ ACCEPT _ DISABLED越大,它放弃的机会就越多,这样其他进程获得锁的机会就越大。如果不接受,将控制每个工作进程的连接数,并利用其他进程的连接池。通过这种方式,nginx控制多个进程之间的连接平衡。

每个工作进程都有一个独立的连接池,连接池的大小是worker_connections。这里的连接池中存储的其实不是真正的连接,而是一个ngx_connection_t结构的数组,大小为worker_connections。另外,nginx会通过free_connections的链表来保存所有空闲的ngx_connection_t _ t。每次获得一个连接,都会从空闲连接列表中获取一个,用完之后再放回空闲连接列表中。nginx可以建立的最大连接数应该是worker _ connections * worker _ processes。当然这里说的是最大连接数。对于请求本地资源的HTTP,可以支持的最大并发数是worker _ connections * worker _ processes,而对于作为反向代理的HTTP,最大并发数应该是worker _ connections * worker _ processes/2。作为一个反向代理服务器,每个并发都会建立一个与客户端的连接和一个与后端服务的连接,这将占用两个连接。

Nginx处理HTTP请求流程

Http是典型的请求-响应网络协议。Http是一个文件协议,所以我们分析请求行和请求头,输出响应行和响应头,往往是逐行处理。通常在连接建立后,读取一行数据,分析请求行中包含的方法、uri和http_version信息。然后逐行处理请求头,根据请求方法和请求头的信息决定是否有请求体和请求体的长度,然后读取请求体。收到请求后,我们处理请求以生成要输出的数据,然后生成响应行、响应头和响应体。在响应被发送到客户机之后,一个完整的请求被处理。

处理流程图:

以上是Nginx工作原理的详细说明。更多关于Nginx工作原理的信息,请关注我们的其他相关文章!

nginx基本原理,nginx实现原理,详解Nginx 工作原理