【Nginx】Nginx基础架构
调用HTTP模块的流程:
Worker进程会在一个for循环语句中反复调用事件模块检测网络事件。当事件模块检测到某个客户端发起的TCP请求时(接收到SYN包),将会为它建立TCP连接,成功建立连接后根据nginx.conf文件中的配置会交由HTTP框架处理。HTTP框架会试图接收完整的HTTP头部,并在接受到完整的HTTP头部后将请求分发到具体的HTTP模块中处理。这种分发策略是多样化的,最常见的是根据请求的URI和nginx.conf里location配置项的匹配度来决定如何分发。HTTP模块在处理请求的结束时,大多会向客户端发送响应,此时会自动地依次调用所有的HTTP过滤模块,每个过滤模块可以根据配置文件决定自己的行为。
事件类型的模块主要处理I/O事件相关的功能,HTTP类型的模块主要处理HTTP应用层的功能。
Nginx在解析配置文件中的一个配置项时首先会遍历所有的模块,对于每一个模块而言,即通过遍历commands数组进行,另外,在数组中检查到ngx_null_command时,会停止使用当前模块解析该配置项。=>我的理解:如果在某模块中找到该配置项名称,则调用该模块中commands数组的set方法来解析该配置项。Set方法中会调用ngx_http_mytest_handler函数
一、Nginx的架构设计
1)优秀的模块化设计
1)高度抽象的模块接口
所有的模块都遵循着同样的ngx_module_t接口设计规范,ngx_module_t是所有模块的通用接口
2)模块接口非常简单,具有很高的灵活性
模块的基本接口ngx_module_t足够简单,只涉及模块的初始化、退出以及对配置项的处理
3)配置模块的设计
配置模块的类型是NGX_CONF_MODULE,它仅有的模块为ngx_conf_module,这是Nginx最底层的模块,它指导着所有模块以配置项为核心来提供功能
4)核心模块接口的简单化
基础类型的模块:核心模块,它的模块类型为NGX_CORE_MODULE,目前官方的核心类型模块中共有6个具体模块,分别是ngx_core_module,ngx_errlog_module,ngx_events_module,ngx_openssl_module,ngx_http_module,ngx_mail_module模块。定义核心模块是为了让非模块化的框架代码只关注于如何调用6个核心模块
核心模块的接口如下,它将ctx上下文进一步实例化为ngx_core_module_t结构体:
typedef struct{
//核心模块名称
ngx_str_t name;
void *(*create_conf)(ngx_cycle_t *cycle);
char *(*init_conf)(ngx_cycle_t *cycle,void *conf);
}ngx_core_module_t;
ngx_core_module_t上下文是以配置项的解析作为基础的,它提供了create_conf回调方法来创建存储配置项的数据结构,在读取nginx.conf配置文件时,会根据模块中的ngx_command_t把解析出的配置项存放在这个数据结构中;它还提供了init_conf回调方法,用于在解析完配置文件后,使用解析出的配置项初始化核心模块功能。
上述设计使得每个核心模块都可以自由地定义全新的模块类型,新定义的模块由核心模块管理。
5)多层次、多类别的模块设计
官方Nginx共有五大类型的模块:核心模块、配置模块、事件模块、HTTP模块、mail模块。
配置模块和核心模块由Nginx的框架代码定义,其他3种模块都不会和框架产生直接关系。
事件模块、HTTP模块、mail模块这三种模块在核心模块中各有一个模块作为自己的代言人,并在同类模块中有一个作为核心业务与管理功能的模块
在这5中模块中,配置模块与核心模块都是与Nginx框架密切相关的,是其他模块的基础。而事件模块则是HTTP模块和mail模块的基础。在事件模块中,ngx_event_core_module事件模块是其他所有事件模块的基础;在http模块中,ngx_http_core_module模块是其他所有HTTP模块的基础;在mail模块中,ngx_mail_core_module模块是其他所有mail模块的基础。
2)事件驱动架构
事件驱动架构是指由一些事件发生源来产生事件,由一个或多个事件收集器来收集、分发事件,然后许多事件处理器会注册自己感兴趣的事件,同时会消费这些事件。
对于Nginx而言,一般会由网卡、磁盘产生事件,事件模块将负责事件的收集、分发操作,而所有的模块都可能是事件消费者。
Nginx采用完全的事件驱动架构来处理业务。对于传统web服务器而言,事件驱动往往局限在TCP链接建立、关闭事件上,一个连接建立以后,在其关闭之前的所有操作逗不再是事件驱动,这时会退化成按序执行每个操作的批处理模式,这样每个请求在链接建立后都将始终占用着系统资源,知道连接关闭才会释放资源。传统web服务器往往把进程或线程作为事件消费者,当一个请求产生的事件被该进程处理时,知道这个请求处理结束时进程资源都将被这个请求所占用。
Nginx只有事件收集、分发器才有资格占用进程资源,它们会在分发某个事件时调用事件消费模块使用当前占用的进程资源。
3)请求的多阶段异步处理
即把一个请求的处理过程按照事件的触发方式分为多个阶段,每个阶段都可以由事件收集、分发器来触发。
关键在于划分请求的阶段,一般是找到请求处理流程中的阻塞方法(或者造成阻塞的代码段),在阻塞代码段上按照下面4种方式来划分阶段:
1.将阻塞进程的方法按照相关的触发事件分解为两个阶段
大部分情况下,一个阻塞进程的方法调用时可以划分为两个阶段:阻塞方法改为非阻塞方法调用,这个调用非阻塞方法并将进程归还给事件分发器的阶段就是第一阶段;增加新的处理阶段用于处理非阻塞方法最终返回的结果,这里的结果返回事件就是第二阶段的触发事件
2.将阻塞方法调用按照时间分解为多个阶段的方法调用
系统中的事件收集、分发者并非可以处理任何事件,如果按照前一种方式试图划分某个方法时,那么可能会发现找出的触发事件不能够被事件收集、分发器所处理,这时只能按照执行时间来拆分这个方法。
例如读取10MB的文件(ngx_epoll_module模块主要是针对网络事件),可以这样来分解读取文件调用:每次只读取10kb,这样该事件接收器占用进程的时间不会太久,整个进程可以及时地处理其他请求。
在读取0-10kb后,为了进入10kb-20kb阶段,可以用能被事件收集器处理的事件来触发,或者设置一个定时器。
3.在无所事事且必须等待系统的响应,从而导致进程空转时,使用定时器划分阶段
当定时器事件发生时就会检查标志,如果标志位不满足,就立刻归还进程控制权,同时继续加入期望的下一个定时器事件
4.如果阻塞方法完全无法继续划分,则必须使用独立的进程执行这个阻塞方法
4)管理进程、多工作进程设计
Nginx采用一个master管理进程、多个worker工作进程的设计方式。
优点:
1.利用多核系统的并发处理能力。
Nginx中所有的worker工作进程都是完全平等的。
2.负载均衡
多个worker工作进程间通过进程间通信来实现负载均衡,当一个请求到来时更容易被分配到负载较轻的worker工作进程中处理。
3.管理进程会负责监控工作进程的状态,并负责管理其行为。
5)内存池的设计
优点:把多次向系统申请内存的操作整合成一次,大大减少了cpu资源的消耗,同时减少了内存碎片,提高了内存的有效利用率和系统可处理的并发连接数。
二、Nginx框架中的核心结构体ngx_cycle_t
ngx_listening_t结构体
ngx_cycle_t对象中有一个动态数组成员叫做listening,它的每个数组元素都是ngx_listening_t结构体,而每个ngx_listening_t结构体代表着Nginx服务器监听的一个端口。
ngx_cycle_t结构体
Nginx框架是围绕着ngx_cycle_t结构体来控制进程运行的。ngx_cycle_t结构体的prefix,conf_prefix,conf_file等字符串类型成员保存着Nginx配置文件的路径。
三、Nginx启动时框架的处理流程
四、worker进程工作流程
五、master进程工作流程
参考:
http://blog.csdn.net/xifeijian/article/details/17385831
【Nginx】Nginx基础架构的更多相关文章
- Linux架构之Nginx Web基础1
第41章 Nginx Web基础入门 41.1 Nginx部署 41.1.1 Nginx的安装方式 源码编译 官方仓库 epel仓库 优点 规范 安装简单 安装简单 便于管理 配置易读 缺 ...
- nginx实现基础web
目录 nginx实现基础web 什么是lnmp lnmp架构如何工作 Nginx与Fast-CGO详细工作流程 LNMP环境准备 一,部署LNMP 1.使用nginx官方源 2.创建nginx用户 3 ...
- Nginx Web 基础入门
目录 Nginx Web 基础入门 Nginx快速安装 两种方式部署Nginx 如何升级nginx或者添加功能 使用systemd管理nginx nginx相关配置文件 nginx的配置文件详解 虚拟 ...
- nginx 的基础配置[转]
nginx 的基础配置 分类: 工具软件2013-11-13 23:26 11人阅读 评论(0) 收藏 举报 目录(?)[-] 管理配置文件 全局配置 虚拟机server配置 location配置 ...
- Nginx高性能服务器安装、配置、运维 (4) —— Nginx服务、架构及其信号
五.Nginx服务.架构及其信号 (1)Nginx服务的查看 1.netstat -antp 查看Nginx是否在80端口运行: 2.ps aux|grep nginx 查看nginx相关进程: 发现 ...
- nginx的基础应用
nginx的基础应用 一.简介 今天我们将介绍一些nginx的简单应用,启动.停止nginx,重载nginx的配置,nginx配置文件的格式,如何配置nginx服务静态资源,如何配置nginx作为反向 ...
- nginx的基础应用(续)
nginx的基础应用(续) 一.简介 上一篇文章我们介绍了nginx的基础应用,其中讲到了nginx作为代理服务器的使用,但是漏了一个重要的,也是使用非常普遍的特性--负载均衡.今天,我们将这段内容补 ...
- Nginx详解二十九:基于Nginx的中间件架构设计
基于Nginx的中间件架构 一:了解需求 1.定义Nginx在服务体系中的角色 1.静态资源服务 2.代理服务 3.动静分离 2.静态资源服务的功能设计 3.代理服务 二:设计评估 三:配置注意事项
- Docker+Nginx+Keepalived实现架构高可用
一.背景 通过keepalived实现nginx高可用,由于在家不想弄多台主机来搞,所以将运行环境用docker封装来模拟跨主机 docker基础镜像:centos 说之前,简单介绍一下: Keepa ...
- 包含jdk和nginx的基础镜像
目的 制作一个基础镜像,包含jdk和nginx,这样要将java项目或一些前端页面做成容器,可以稍作修改引用该镜像. Dockerfile FROM alpine:3.8 ENV \ LANG=C.U ...
随机推荐
- Python 使用random模块生成随机数
需要先导入 random 模块,然后通过 random 静态对象调用该一些方法. random() 函数中常见的方法如下: # coding: utf-8 # Team : Quality Mana ...
- 在虚拟机linux环境下编译windows版adb fastboot
原文出自:http://blog.chinaunix.net/uid-20546441-id-1746200.html 我根据虚拟机编译遇到的问题进行一些添加 [前提条件] Linux Android ...
- svn up 更新 校验和不匹配
BUNTU/Iproject/svn/dzradioclock-code/trunk/libs/dzlib/components/packages/DelphiXE2/dzComponentsR.dp ...
- C++位域和内存对齐问题
1. 位域: 1. 在C中,位域可以写成这样(注:位域的数据类型一律用无符号的,纪律性). struct bitmap { unsigned a : ; unsigned b : ; unsigned ...
- Release Python Program as exe
py2exe 可以用来将python program 以exe的形式发布. 安装py2exe 对于python 3.x pip install py2exe 可以直接安装 对于python 2.7, ...
- transformer模型解读
最近在关注谷歌发布关于BERT模型,它是以Transformer的双向编码器表示.顺便回顾了<Attention is all you need>这篇文章主要讲解Transformer编码 ...
- jquery 打星评分插件
<link rel="stylesheet" href="/static/vendor/raty/jquery.raty.css"> <scr ...
- Turtle库学习
Python Turtle (Python绘图工具) 导入库 import turtle as t ps:为了方便调用我们这里给这个模块在本程序内重命名为 t 1. 画布 顾名思义就是用于绘图的区域 ...
- centos7下安装Python3.7(与python2共存)
2019-01-22 22:50:05 centos7默认安装的是python2.7,然而python2基本上要淘汰了,所以有必要安装最新的python3 python,g++这些工具一般安装在/ ...
- 转载:CentOS7下部署Django项目详细操作步骤
部署是基于:centos7+nginx+uwsgi+python3+django 之上做的 文章转自:Django中文网 https://www.django.cn/article/sh ...