Nginx 实现高并发的原理分析

本文将讲解一下内容:

1、Nginx 的进程模型分析

2、Nginx 实现高并发原理分析

这篇文章首先会讲解一下 Nginx 的进程模型,只有先理解了 Nginx 进程模型,才能深入理解 Nginx 实现高并发的原理。

1、Nginx 进程模型介绍
Nginx 的进程模型也是采用 Master/Worker 形式。当 Nginx 启动时,会先创建一个 Master 进程,Master 进程会 fork 出若干个 Worker 子进程(具体是多少个子进程可以在 Nginx 的配置文件中来配置)

Master 进程的作用如下:

Master 进程主要是接收外界信号(如重载配置等),传递给 Worker 进程

监听 Worker 进程的运行状态,负责 Worke 进程的创建和销毁 Worker 进程的作用如下:

处理 Master 进程传递过来的信号

处理网络事件,比如客户端请求

这种进程模型看似跟 PHP-FPM 的处理方式类似,它们之间的区别在哪里呢?

回答这个问题,就要从两者的定位入手了。Nginx 是一个 HTTP 服务器,负责转发请求,不负责处理具体的业务。PHP-FPM 需要处理具体的业务,特别是有些是耗时的业务场景。在 Nginx+PHP-FPM 的架构中,Nginx 的 Worker 进程将请求转发给 PHP-FPM 后,并没有停下来等待 PHP-FPM 返回数据,而是设置了一个回调事件,然后就去处理请他请求了。当 PHP-FPM 业务逻辑处理完后,会执行 Nginx 中 Worker 进程设置的回调事件,这时 Nginx 的 Worker 进程就会停下手中的工作,开始处理回调函数的返回值,直到数据返回给用户端。

所以,Nginx 的 Worker 进程无需等待,可以一直处理请求。但是 PHP-FPM 的 Worker 进程需要将每个请求处理完才能处理下一个请求。

image.png

2、Nginx 实现高并发的原理分析
Nginx 和 Apache 都是 Web 服务器,但是两者有着很大的区别。

Apache 处理请求是同步阻塞方式,每一个请求到达,apache 都会去 fork 一个子进程去处理这个请求,直到这个请求处理完毕。低并发时,这种模式没有什么缺点。面对高并发时,如果要想提高处理能力,就需要创建很多进程,进程太多了会出现进程切换,浪费 CPU 资源。

与 Apache 相比,Nginx 在处理高并发时特别有优势。Nginx 是如何实现高并发的呢?答案就是 I/O 复用技术(select、poll、epoll 模型),即多个 I/O 可以复用一个进程。

elect、poll 原理:当连接有 I/O 流事件产生的时候,就会去唤醒进程去处理,但是进程不知道是哪个连接产生的 I/O 流事件,于是就得挨个去遍历进程,遍历进程会浪费大量 CPU 时间片。select、poll 原理是一样的,只不过 select 只能观察 1024 个连接,poll 可以观察无限个连接。

epoll 原理连接有 I/O 流事件产生的时候,epoll 就会去告诉进程哪个连接有 I/O 流事件产生,然后进程就去处理这个链接。

Nginx 就是采用 epoll 模型来实现的。流程就像上文所说的一样,每处理完一个请求,就会设置一个事件回调,然后开始处理新的请求。当回调事件被触发时再腾出手来处理回调事件之后的逻辑,整个过程中不会出现等待的情况。所以理论上 Ngnix 的一个进程就可以处理无限数量的连接,而且无需轮询。

以上就是对文中开始提到的两个问题的解答,有点绕,可能没有完全解释清楚。后面将会在新的文章中把大家提出的问题逐步解答清楚。

完整附件:http://github.crmeb.net/u/defu


Vue手把手从零入门
Vue手把手入门,从零学习,拆解每一个知识点!

CRMEB新零售社交电商会员管理营销系统!

143 声望
16 粉丝
0 条评论
推荐阅读
微信小程序商城高并发解决方案
③数据量大。如果单次qps超过50W,单条1kb,50万就是5GB了,1分钟30G,对底层数据存储和访问压力很大。本文将讨论如何处理这些棘手的问题。

CRMEB阅读 436

年度最佳【golang】sync.Pool详解
最近在工作中碰到了 GC 的问题:项目中大量重复地创建许多对象,造成 GC 的工作量巨大,CPU 频繁掉底。准备使用 sync.Pool 来缓存对象,减轻 GC 的消耗。为了用起来更顺畅,我特地研究了一番,形成此文。本文从使...

去去10023阅读 4k评论 1

CentOS从零开始部署Nodejs项目
原文地址:[链接]安装nodejs、npm/cnpm {代码...} 安装mysql卸载 {代码...} 安装 {代码...} 启动 {代码...} 登录 {代码...} 修改root密码 {代码...} 允许远程访问,与本地密码区分,是两个密码 {代码...} 安装git...

jigsaw3阅读 5k评论 3

Nginx 配置常用参数,看这一篇就够了
最近在全面学习Nginx,当作笔记了,如有错误,欢迎指出或深入交流。主模块 {代码...} 事件模块 {代码...} http部分 {代码...} 部分参数详细说明server_name {代码...} location {代码...} location表达式类型 {代...

13sai2阅读 1.8k

把 Go 放到 Nginx C module 之中
最近一段时间,我在做一件有趣的事情,让一个 Nginx C module 通过 Go 代码来访问 gRPC 服务。不得不感慨 Go 真的很流行,让人无法拒绝。之前我做 wasm-nginx-module 时就试图把 tinygo 跑在 Nginx 里面,这次则...

spacewander2阅读 2.1k评论 2

与CompletableFuture有关的一些知识
Java1.5引入了Future,在1.8中又引入了CompletableFuture。他的出现可以使我们更好的去对任务进行编排,合理的使用会极大的缩减多任务的处理时间,达到事半功倍的目的。下面让我们一块来看一下与它相关的一些知识。

lpe2342阅读 1.2k

封面图
2023年了 对Go做一个全网最全的总结
转眼之间,又到了2023,2022似乎比往年过得更快一些。这一年经历3-6月的上海封城、经历了8月的找工作、经历了公司的不断裁员、经历不断地核酸、经历了疫情的全民放开和经历了你阳了吗等等,这一年大家的生活好像...

7small72阅读 1.2k

封面图

CRMEB新零售社交电商会员管理营销系统!

143 声望
16 粉丝
宣传栏