nginx 是一个轻量级的http 服务程序,相比其他服务器程序如apache,nginx占用内存少,稳定性高,并发处理能力强。同时nginx 还是一个反向代理服务程序,和邮件代理服务程序。nginx具有丰富的模块库、灵活的配置、较低资源消耗等优点。下面,我们一起深入看一下nginx的工作机制
1. nginx 如何实现高性能低消耗的呢?我们从以下几个方面说明以下:
网络事件处理机制
nginx 采用异步非阻塞的方式处理请求,可以同时处理上万的请求nginx 支持 select/epoll 等流行事件处理机制,根据系统环境自动选择nginx 采用独立于系统的事件处理机制,能够高效处理请求资源分配技术
nginx 采用分阶段资源分配技术,使得它的cpu和内存消耗非常低多核处理优化
nginx 默认采用多进程启动模式nginx 包含master 进程 和 worker 进程能够充分利用 smp 对称多处理的优势,减少worker进程磁盘i/o的阻塞nginx 支持worker进程和cpu内核 一一对应绑定,避免进程上下文的切换致使cache失效基于上面提到技术,以及nginx很多地方的优化,让nginx成为最快的http服务器。
2.nginx的进程模型在nginx的技术架构中,进程模型是至关重要的一部分。接下来,我们一起看看nginx进程模型,以及它们的工作机制。
linux 系统中,nginx默认以守护进程daemon方式启动,默认采用多进程方式。nginx包括两种类型的进程:
master 进程,数量只有一个,管理nginx本身和worker进程worker 进程,数量一般和cpu核数相等,nginx的所有请求处理,均是在worker进程中完成下面,我们分别深入看一下master和worker进程。
2.1 master 进程工作机制
在nginx启动时,master进程创建,主要负责初始化nginx和相关模块、fork worker进程、接收处理外界信号等工作。
nginx的初始化过程:
解析配置文件,这是nginx初始化最重要的一个环节调用各个配置指令回调函数,完成各个模块的配置、相互关联等建立listen 的 socket(listenfd)准备工作都完成后,fork worker子进程和cache子进程master 进程信号处理机制
我们通过kill命令发送信号给nignx master 进程,看看master进程如何处理:
分析流程:
master 进程接收到 hup 信号master 进程重新加载配置文件master 进程启动新的worker进程master 进程发送信号给worker 进程老的worker进程不再接收新的请求老的worker进程处理完当前请求,退出至此,nginx完成平滑重启注意:nginx 0.8 版本以后,提供了 -s参数,用于管理nginx服务的停止和重启,注意line 11:
2.2 worker 进程工作机制
worker进程负责所有请求的处理工作,我们通过一个http请求,来梳理一下worker的工作流程:
新的请求到来:所有的work进程的listenfd都会变得可读竟抢互斥锁:所有 worker 进程在注册listenfd读事件前,要先抢accept_mutex抢到互斥锁的worker,注册listenfd读事件,在事件中调用accept接受该连接拿到请求后,worker进程开始读取请求,解析请求,处理请求,产生数据,再返回给客户端worker进程断开连接需要注意:一个http请求,完全由worker进程处理,而且只在一个worker中处理
2.3 master-worker 进程架构机制的优势有哪些??
对于每个worker 进程来说,独立的进程,不需要加锁,节约锁导致的资源开销;worker进程之间,互不干扰,平滑重启就是很好的例子,服务不中断。
2.4 网络事件处理机制
nginx 采用的是异步非阻塞事件处理机制,支持select/poll/epoll/kqueue 等等。nginx 同时会监控多个事件,调用他们是阻塞的。但是调用有超时时间,在超时时间内,如果有事件准备好了,就返回,否则重新放入epoll中。当读写返回eagain时,事件将会被再次放入epoll中。
处理线程只有一个,同时处理的请求也只有一个,所谓多请求并发,只是在不断的切换请求而已。虽然是切换,但这种切换不涉及上下文切换,相比十分轻量。更多的并发,只是会占用更多的内存。
进程相关的还有,信号和定时器,这部分另外单独讲解。
nginx 包含哪些模块nginx是模块化架构的服务,丰富的模块,松散耦合,也让nginx更加强大!我看看nginx 都有哪些模块
内核模块
实现了底层的通讯协议,为其他模块/进程构建运行环境、协作基础,打开listen 的端口,启动worker进程
http/mail模块
两个特殊模块,位于内核模块和各功能模块间;在内核模块之上实现了另一层的抽象;处理http/mail协议事件;确保调用功能模块顺序正确。
event模块
负责监听accept后建立的连接,对读写事件进行添加删除;与非阻塞 i/o 模型结合使用;支持select/poll/epoll/kqueue等;注意惊群效应,后面有解释。
handler模块
负责接受客户端请求并产生输出;通过配置文件中location指令配置 content handler 模块。
filter模块
负责输出内容处理,修改输出内容;fiter模块在获取回复内容之后,向用户发送响应之前,执行处理动作;调用顺序在编译时就确定了。
upstream模块
实现反向代理的功能,负责将请求转发到后端服务器上,并读取响应,发回客户端;跨越单机的限制,完成网络数据的接收、处理和转发;
loadbalancer模块
根据配置指定算法,在众多的后端服务器中选择一个,完成请求的转发服务器;都有哪些算法呢?
惊群效应:
当内核 accept 一个连接时,会唤醒所有等待中的进程但实际上只有一个进程能获取连接,其他的进程都是被无效唤醒的所以 nginx 采用了自有的一套 accept 加锁机制,避免多个进程同时调用 acceptnginx 多进程的锁在底层默认是通过 cpu 自旋锁来实现。如果操作系统不支持自旋锁,就采用文件锁。
数据监测模块的实时性分析与设计
AMD发布嵌入式GPU E6760
海尔中央空调获智能化认证 持续创新用户体验
蜂巢能源最新发布,500亿合作官宣!
电动飞机技术发展的核心是什么 电动飞机的关键技术分析
Nginx 如何实现高性能低消耗
食品包装薄膜表面瑕疵检测系统介绍
USB硬件协议分析仪之一:力科-独孤求败之独孤九剑
星网锐捷:目前有很多解决方案基于***开发
2019常州智能制造创新大赛初赛在常州天宁经济开发区举办
两岸手机芯片业者火拼 台积电、联电坐收订单之利
紫光展锐的5G芯片春藤510将具备SA和NSA能力
常见的三种蓝牙天线
一款高精度基准电压源的设计方案
SOLIDWORKS 2024-CAM增加功能简介(一)
一文了解吴忌寒用5年:从比特币布道者到AI巨头
增收不增利,三孚新科上半年净亏损同比扩大11.11%
基于卷积的框架有效实现及视觉Transformer背后的关键成分
RCP实现混合型电力滤波器
网关有辐射吗_网关地址如何修复