Nginx

目录

1.定位

2.架构

3.配置

3.1.基本

3.2.指令上下文

3.3.存在于main上下文中的配置指令

3.4.存在于http 上下文中的指令

3.5.存在于mail上下文中的指令

3.6.存在于 server 上下文中的配置指令

3.7.存在于location上下文中的指令

4.模块化体系结构

4.1.总述

4.2.模块分类

5.handler模块的挂载

5.1.按处理阶段挂载

5.2.按需挂载


1.定位

Nginx 是一款轻量级的Web 服务器、反向代理服务器、电子邮件(IMAP/POP3)代理服务器,其特点是占有内存少,并发能力强;

2.架构

1.后台进程包含一个master进程、多个worker进程,即以多进程方式运行;

2.开发者可以手动关闭后台模式,开启前台模式,还可以通过配置来取消master进程,只保留一个worker单进程来运行;

3.master进程:用来管理worker进程,包含:接收来自外界的信号、向各worker进程发送信号、监控worker进程运行状态、当worker进程退出后自动重新启动新的worker进程;

4.worker进程:处理具体的网络事件,多个worker进程之间是平等的,彼此同等竞争来自客户端的请求,且各进程互相之间是独立的;一个请求只能在一个worker进程中处理;一个worker进程不可能处理其它进程的请求;worker进程的个数是可以设置的,一般设置与机器cpu核数一致;

5.重启master进程加载最新的配置文件:①master进程在接到信号后会先重新加载配置文件;②再启动新的worker进程,新worker启动后就开始接收新的请求;③向所有老worker进程发送信号,老worker在收到来自master信号后,就不再接收新的请求,并在当前进程中的所有未处理完的请求处理完成后,再退出;

6.进程模型:①每个worker进程都是从master进程fork过来,过程如下:在master进程里面,先建立好需要listen的socket(listenfd)之后,然后再fork出多个worker进程;②所有worker进程的listenfd会在新http连接到来时变得可读,为保证只有一个进程处理该连接,所有worker进程在注册listenfd读事件前抢夺accept_mutex,抢到互斥锁的进程注册listenfd读事件,在读事件里调用accept接受该连接;③当一个worker进程在accept这个连接之后,就开始读取请求、解析请求、处理请求、产生数据后,再返回给客户端,最后才断开连接,这就是一个完整的请求;

7.异步非阻塞方式处理客户端请求:操作系统提供的select/poll/epoll/kqueue之类的函数,让你可以同时监控多个事件,调用这些函数时是阻塞的,但可以设置超时时间,在超时时间之内,如果有事件准备好了就返回,利用该特性,我们可以把读HTTP操作放到这类函数里面,当把读的数据都准备好之后,我们再去处理这些数据;

3.配置

3.1.基本

1.Nginx 配置系统由一个主配置文件nginx.conf、多个辅助配置文件组成,配置文件全部位于Nginx安装目录下的conf目录下;

2.注释行以#作为开头;

3.辅助配置文件只会在某些情况下才使用的,而主配置文件是在任何情况下都被使用的;

4.配置指令是一个字符串,可以用单引号或者双引号括起来,也可以不括。但是如果配置指令包含空格,一定要引起来;

3.2.指令上下文

①main: Nginx在运行时与具体业务功能无关的一些参数;

②http: 与提供http服务相关的一些配置参数;

③server: http服务上支持若干虚拟主机,每个虚拟主机一个对应的server配置项,配置项里面包含该虚拟主机相关的配置;在提供mail服务的代理时也可以建立若干server,每个server通过监听的地址来区分;

④location: http服务中,某些特定的URL对应的一系列配置项;

⑤mail: 实现email相关的 SMTP/IMAP/POP3代理时,共享的一些配置项;

3.3.存在于main上下文中的配置指令

user/worker_processes/error_log/events/http/mail

3.4.存在于http 上下文中的指令

server

3.5.存在于mail上下文中的指令

server/auth_http/imap_capabilities

3.6.存在于 server 上下文中的配置指令

listen/server_name/access_log/location/protocol/proxy/smtp_auth/xclient

3.7.存在于location上下文中的指令

index/root

4.模块化体系结构

4.1.总述

1.Nginx是由核心模块、功能模块共同组成;

2.核心模块实现了底层的通讯协议,为其他模块、Nginx进程构建了基本的运行时环境,并且构建了其他各模块的协作基础;至于大部分与协议相关的,或者应用相关的功能,都是在功能模块中所实现;

3.Nginx将各功能模块组织成一条链,当有请求到达的时候,请求依次经过这条链上的部分或者全部模块来进行处理;

4.每个模块实现特定的功能,例如,实现对请求解压缩的模块、实现SSI的模块、实现与上游服务器进行通讯的模块、实现与 FastCGI服务进行通讯的模块;

5.有两个模块比较特殊,其位于Nginx core与各功能模块的中间:http模块、mail模块;

6.http模块、mail模块分别处理与HTTP协议和Email相关协议(SMTP/POP3/IMAP)有关的事件,并且确保这些事件能被以正确的顺序调用其他的一些功能模块;

4.2.模块分类

模块根据其功能基本上可以分为以下几种类型:

①event module

搭建了独立于操作系统的事件处理机制的框架,及提供了各具体事件的处理,其代表有ngx_events_module、ngx_event_core_module、ngx_epoll_module等;

②phase handler

此类型的模块也被直接称为handler模块。主要负责处理客户端请求并产生待响应内容,其代表有ngx_http_static_module模块等;

③output filter

也称为filter模块,主要是负责对输出的内容进行处理,可以对输出进行修改;

④upstream

实现反向代理的功能,将真正的请求转发到后端服务器上,并从后端服务器上读取响应,返回客户端;

upstream模块是一种特殊的handler,只不过响应内容不是真正由自己产生的,而是从后端服务器上读取的;

⑤load-balancer

负载均衡模块,实现特定的算法,在众多的后端服务器中,选择一个服务器出来作为某个请求的转发服务器;

5.handler模块的挂载

handler模块通过2种方式挂载到处理过程中:

按处理阶段挂载

按需挂载。

5.1.按处理阶段挂载

为了更精细地控制对于客户端请求的处理过程,Nginx把这个处理过程划分成了11个阶段:

NGX_HTTP_POST_READ_PHASE: 读取请求内容阶段

NGX_HTTP_SERVER_REWRITE_PHASE: Server请求地址重写阶段

NGX_HTTP_FIND_CONFIG_PHASE: 配置查找阶段

NGX_HTTP_REWRITE_PHASE: Location 请求地址重写阶段

NGX_HTTP_POST_REWRITE_PHASE: 请求地址重写提交阶段

NGX_HTTP_PREACCESS_PHASE: 访问权限检查准备阶段

NGX_HTTP_ACCESS_PHASE: 访问权限检查阶段

NGX_HTTP_POST_ACCESS_PHASE: 访问权限检查提交阶段

NGX_HTTP_TRY_FILES_PHASE: 配置项try_files处理阶段

NGX_HTTP_CONTENT_PHASE: 内容产生阶段

NGX_HTTP_LOG_PHASE: 日志模块处理阶段

一般情况下,自定义的模块大多数是挂载在 NGX_HTTP_CONTENT_PHASE阶段;

注意:有几个阶段是特例,它不调用挂载地任何的handler,也就是你就不用挂载到这几个阶段了:

NGX_HTTP_FIND_CONFIG_PHASE

NGX_HTTP_POST_ACCESS_PHASE

NGX_HTTP_POST_REWRITE_PHASE

NGX_HTTP_TRY_FILES_PHASE

使用这种方式挂载的handler也被称为content phase handlers;

5.2.按需挂载

以这种方式挂载的handler也被称为content handler;

当一个请求进来以后,Nginx从NGX_HTTP_POST_READ_PHASE阶段开始依次执行每个阶段中所有handler。执行到 NGX_HTTP_CONTENT_PHASE阶段的时候,如果这个location有一个对应的content handler模块,那么就去执行这个content handler模块真正的处理函数。否则继续依次执行NGX_HTTP_CONTENT_PHASE阶段中所有content phase handlers,直到某个函数处理返回NGX_OK 或者NGX_ERROR。

由此我们可以得出结论:

①当某个location处理到NGX_HTTP_CONTENT_PHASE阶段时,如果有content handler模块,那么NGX_HTTP_CONTENT_PHASE挂载的所有content phase handlers都不会被执行了;

②content handler模块必须在NGX_HTTP_CONTENT_PHASE阶段才能执行到,如果想让自定义handler在更早的阶段执行,那就不要使用这种挂载方式;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值