[转帖]Nginx为什么高效?一文搞明白Nginx核心原理
Nginx为什么高效?一文搞明白Nginx核心原理
https://www.toutiao.com/a6733057587622707724/
Nginx 的进程模型
Nginx 服务器,正常运行过程中:
- 多进程:一个 Master 进程、多个 Worker 进程
 - Master 进程:管理 Worker 进程
 - 对外接口:接收外部的操作(信号)
 - 对内转发:根据外部的操作的不同,通过信号管理 Worker
 - 监控:监控 worker 进程的运行状态,worker 进程异常终止后,自动重启 worker 进程
 - Worker 进程:所有 Worker 进程都是平等的
 - 实际处理:网络请求,由 Worker 进程处理;
 - Worker 进程数量:在 nginx.conf 中配置,一般设置为核心数,充分利用 CPU 资源,同时,避免进程数量过多,避免进程竞争 CPU 资源,增加上下文切换的损耗。
 
思考:
- 请求是连接到 Nginx,Master 进程负责处理和转发?
 - 如何选定哪个 Worker 进程处理请求?请求的处理结果,是否还要经过 Master 进程?
 
HTTP 连接建立和请求处理过程:
- Nginx 启动时,Master 进程,加载配置文件
 - Master 进程,初始化监听的 socket
 - Master 进程,fork 出多个 Worker 进程
 - Worker 进程,竞争新的连接,获胜方通过三次握手,建立 Socket 连接,并处理请求
 
Nginx 高性能、高并发:
- Nginx 采用:多进程 + 异步非阻塞方式(IO 多路复用 epoll)
 - 请求的完整过程:
 - 建立连接
 - 读取请求:解析请求
 - 处理请求
 - 响应请求
 - 请求的完整过程,对应到底层,就是:读写 socket 事件
 
Nginx 的事件处理模型
request:Nginx 中 http 请求。
基本的 HTTP Web Server 工作模式:
- 接收请求:逐行读取请求行和请求头,判断段有请求体后,读取请求体
 - 处理请求
 - 返回响应:根据处理结果,生成相应的 HTTP 请求(响应行、响应头、响应体)
 
Nginx 也是这个套路,整体流程一致。
模块化体系结构
nginx的模块根据其功能基本上可以分为以下几种类型:
- event module: 搭建了独立于操作系统的事件处理机制的框架,及提供了各具体事件的处理。包括ngx_events_module, ngx_event_core_module和ngx_epoll_module等。nginx具体使用何种事件处理模块,这依赖于具体的操作系统和编译选项。
 - phase handler: 此类型的模块也被直接称为handler模块。主要负责处理客户端请求并产生待响应内容,比如ngx_http_static_module模块,负责客户端的静态页面请求处理并将对应的磁盘文件准备为响应内容输出。
 - output filter: 也称为filter模块,主要是负责对输出的内容进行处理,可以对输出进行修改。例如,可以实现对输出的所有html页面增加预定义的footbar一类的工作,或者对输出的图片的URL进行替换之类的工作。
 - upstream: upstream模块实现反向代理的功能,将真正的请求转发到后端服务器上,并从后端服务器上读取响应,发回客户端。upstream模块是一种特殊的handler,只不过响应内容不是真正由自己产生的,而是从后端服务器上读取的。
 - load-balancer: 负载均衡模块,实现特定的算法,在众多的后端服务器中,选择一个服务器出来作为某个请求的转发服务器。
 
[转帖]Nginx为什么高效?一文搞明白Nginx核心原理的更多相关文章
- 这一次搞懂SpringBoot核心原理(自动配置、事件驱动、Condition)
		
@ 目录 前言 正文 启动原理 事件驱动 自动配置原理 Condition注解原理 总结 前言 SpringBoot是Spring的包装,通过自动配置使得SpringBoot可以做到开箱即用,上手成本 ...
 - 一文搞懂CDN加速原理
		
开源Linux 长按二维码加关注~ 一.什么是 CDN CDN的全称是(Content Delivery Network),即内容分发网络.其目的是通过在现有的Internet中增加一层新的CACHE ...
 - 【python测试开发栈】带你彻底搞明白python3编码原理
		
在之前的文章中,我们介绍过编码格式的发展史:[文章传送门-todo].今天我们通过几个例子,来彻底搞清楚python3中的编码格式原理,这样你之后写python脚本时碰到编码问题,才能有章可循. 我们 ...
 - Web端即时通讯基础知识补课:一文搞懂跨域的所有问题!
		
本文原作者: Wizey,作者博客:http://wenshixin.gitee.io,即时通讯网收录时有改动,感谢原作者的无私分享. 1.引言 典型的Web端即时通讯技术应用场景,主要有以下两种形式 ...
 - 三文搞懂学会Docker容器技术(中)
		
接着上面一篇:三文搞懂学会Docker容器技术(上) 6,Docker容器 6.1 创建并启动容器 docker run [OPTIONS] IMAGE [COMMAND] [ARG...] --na ...
 - 一文搞懂指标采集利器 Telegraf
		
作者| 姜闻名 来源|尔达 Erda 公众号  导读:为了让大家更好的了解 MSP 中 APM 系统的设计实现,我们决定编写一个<详聊微服务观测>系列文章,深入 APM 系统的产品.架构 ...
 - 一文搞懂Flink Window机制
		
Windows是处理无线数据流的核心,它将流分割成有限大小的桶(buckets),并在其上执行各种计算. 窗口化的Flink程序的结构通常如下,有分组流(keyed streams)和无分组流(non ...
 - 一文搞懂 Netty 发送数据全流程 | 你想知道的细节全在这里
		
欢迎关注公众号:bin的技术小屋,如果大家在看文章的时候发现图片加载不了,可以到公众号查看原文 本系列Netty源码解析文章基于 4.1.56.Final版本 在<Netty如何高效接收网络数据 ...
 - 一文搞定FastDFS分布式文件系统配置与部署
		
Ubuntu下FastDFS分布式文件系统配置与部署 白宁超 2017年4月15日09:11:52 摘要: FastDFS是一个开源的轻量级分布式文件系统,功能包括:文件存储.文件同步.文件访问(文件 ...
 
随机推荐
- (WAWAWAWAWAWA) BZOJ 1858: [Scoi2010]序列操作
			
二次联通门 : BZOJ 1858: [Scoi2010]序列操作 /* BZOJ 1858: [Scoi2010]序列操作 已经... 没有什么好怕的的了... 16K的代码... 调个MMP啊.. ...
 - 小程序 之eval替代方案(Binding.js)
			
一.下载 链接:https://pan.baidu.com/s/1D6vNSSBZI22_K1BzLEXpbg提取码:of6g 修改binding.js中的window.bind=binding为如下 ...
 - python3编程基础之一:量的表示
			
计算机的操作最终表现是数据的操纵,为了表示和存储数据,都需要对数据进行引用,计算机可以直接从内存地址实现一步访问数据,但是编程的人却没有这种能力.就像人可能够不到在高处的氢气球,但是可以拉动邦在氢气球 ...
 - mysql远程访问设置
			
MySQL GUI Tools 开启mysql的远程访问权限 默认mysql的用户是没有远程访问的权限的,因此当程序跟数据库不在同一台服务器上时,我们需要开启mysql的远程访问权限. 主流的有两种方 ...
 - libmidas.so.2
			
libmidas.so.2 libmidas.so.2文件,使DATASNAP FOR LINUX中间件,支持OleVariant格式的序列,使TDataSetProvider+TClientData ...
 - 常用的xml头文件
			
原文:https://www.cnblogs.com/uniquezhangqi/p/9199329.html#commentform xmlns,xmlns:xsi,xsi:schemaLocati ...
 - C++ 中virtual 用法
			
一.virtual 修饰基类中的函数,派生类重写该函数: #include using namespace std; class A{ public: virtual void display(){ ...
 - 不建议在for循环中使用”+”进行字符串拼接
			
https://mp.weixin.qq.com/s/qG6bdhndAip9s-_XM9oP3A 为什么阿里巴巴不建议在for循环中使用”+”进行字符串拼接 互联网后端架构 1周前
 - appium-FAQ(持续更新...)
			
Q1:未安装APP直接启用appium sever,初始化driver :driver = new AndroidDriver(new URL("http://127.0.0.1:4723/ ...
 - osg 自定义图元
			
osg::ref_ptr<osg::Geode> OSG_Qt_::createBox() { osg::ref_ptr<osg::Geode> osg_geode = new ...