Nginx底层架构(非常清晰)

news2025/4/19 23:32:24

目录

前言:

场景带入:

HTTP服务器是什么?

反向代理是什么?

模块化网关能力:

1.配置能力:

2.单线程:

3.多worker进程

4.共享内存:

5.proxy cache

6.master进程

最后:


前言:

在互联网流量呈指数级增长的今天,如何用有限的资源支撑百万级并发请求,是每个后端开发者必须面对的挑战。作为全球最受欢迎的高性能Web服务器之一,Nginx以不足2MB的内存占用轻松处理万级连接,其设计哲学堪称分布式系统的典范。
本文将深入Nginx的多进程架构事件驱动模型,揭开其“用最少的资源做最多的事情”的奥秘。从惊群效应的优雅规避,到SO_REUSEPORT的现代负载均衡策略,我们将通过源码级视角,解析Nginx如何在操作系统内核与用户态代码之间编织出一张高效网络。无论你是想优化现有服务,还是探索服务器编程的艺术,这趟旅程都将为你打开一扇新世界的大门。

场景带入:

      你是一个程序员,你在本地写了一个html文件,将他拖入到浏览器,就可以通过浏览器渲染出相应的数据。

    但这只是本地的,自己写的数据,我们在浏览器上访问到的数据和页面,都是通过,远端服务器传送到我们的客户端的。那二者之间是如何进行数据传输的呢?没有什么是加一层中间层不能解决的。如果有,那就再加一层,这次我们要加的中间层是nginx。

HTTP服务器是什么?

我们想要在远端服务器上拿到数据,就让远端服务器创建一个进程,并且让他对外提供HTTP服务,也就是提供一个URL。当用户在客户端输入这个URL时,比如(www.baidu.com),那客户端会对远端服务器发送一个HTTP请求,当远端服务器收到这个请求时,就会响应相应的数据。浏览器进行解析与展示,这就完成了一次普通的网页访问。

反向代理是什么?

一个完整的产品,它不止有前端页面,他还有后端服务。

前端需要时刻对后端请求最新数据。

此时,流量小的时候,压力并不大,后端服务还能轻松完成任务,不过流量一旦大起来,前端页面对后端的请求就会变多,那此时我们只能增多后端服务的数量,来完成对这些请求的处理,但是问题来了,后端服务多了,每个后端服务都有对应的IP与端口,前端就不知道该访问哪个服务了。还是那句话,没有什么是加一层中间层不能解决的。中间加一个进程,对外提供一个域名,当这些前端请求打过来的时候,这个进程就负责把这些请求均匀的转发给每个服务,让每个服务都能处理请求,这就是负载均衡。像这种屏蔽掉背后具体有哪些服务器的代理方式,我们就叫他反向代理

有了它,我们就可以对外只提供一个URL的域名。我们就可以根据需要,随时扩缩后端服务的数量

那我们这个反向代理就可以加在我们之前提到的远端服务器的那个进程上,这样不仅可以为前端提供HTTP服务,还可以将请求分给后端服务器。

模块化网关能力:

既然它是一个中间层,且会有大量的流量穿过它,那他高低也算个网关了。

那么我们就可以在他上面加入一些通用网关的功能,比如: 

1.日志:我们就可以记录每次调用的结果,方便后续排查问题;

2.压缩:我们就可以对输入输出内容进行压缩,减少网络带宽消耗;

3.限流与封禁:主要是对某个模块进行限流和封禁;

4.修改内容:修改输入输出的内容;

5.自定义:自己根据需要开发新的功能;

还可以添加新的协议如:HTTP,HTTP2,TCP,UDP,Websocket。 

1.配置能力:

前面提到那么多种能力,用户肯定不会全部用上,所以需要有个地方来让人选择用那些能力,于我们可以加个配置文件,也就是Nginx.conf,然后,用户在配置文件上选择自己想要的功能。

2.单线程:

这个网关需要有这个多的前端请求打过来,如果每个请求都要开一个单独的进程,那么开销会很大,那么只需要将这些请求的线程都塞到一个单线程里头去,就能避免并发问题和线程开销。

3.多worker进程

但单个网关进程要单线程处理这么多的网络流量,即使处理的再快,当有海量数据时,依然压力会很大。那么我们此时就将一个网关进程变成多个网管进程,我们叫他Worker进程,每个进程之间互不干扰。让多个进程监听一个端口,一有流量进来,我们就分给每个进程,将进程数量设置成和操作系统CPU核数一致,那每个进程都能够得到一个核,那这里就能让效率最大化。

问题来了:这么多的work进程监听同一个端口,不会造成端口冲突吗?

在传统的多进程服务器模型中(如Nginx的早期版本),通常由主进程(Master Process)创建并绑定监听套接字(Socket),随后通过fork()派生出多个Worker子进程。此时:

  • 共享文件描述符:所有Worker进程继承同一个监听套接字,而非各自独立创建新套接字。因此,它们实际上共享同一个内核套接字对象,不存在多个套接字绑定同一端口的问题。

  • 内核负载均衡:当新连接到达时,操作系统内核会选择一个处于accept()状态的Worker进程来处理连接。这种方式称为“惊群效应”优化后的负载均衡(现代内核如Linux通过EPOLLEXCLUSIVE等机制避免多个进程被同时唤醒)。

4.共享内存:

前端页面发来的请求都会打到worker进程上,那如果说要限流这样的要计数的功能,每个worker上的计数都不一样,这个时候我们就要创建一个共享内存了,每一个worker进程都共有一个内存,这样就能保证多个进程之间做逻辑,这样就能保证系统数据的一致性。

5.proxy cache

前端发送请求给后端,后端响应结果返回给前端,此时,每次的请求都要重复这一过程,那能不能像redis一样设置中间层,将查询的结果暂存,下次在查询时就能直接拿了。我们只需要准备一些磁盘文件,将查询的数据放在那里就可以了。注意:不能放在共享内存里,内存太贵了

6.master进程

每个worker会分走一部分流量,如果功能更新,所有的worker同时重启,上面的网络连接就会全部断掉。那么我们此时创建一个新的进程,让他读取前面的Nginx.conf文件,让他统一管理各个worker进程,解决谁先连谁后连的问题。

最后:

在数字世界的汪洋中,每一次TCP握手都是浪花,每一个HTTP请求皆是潮汐。Nginx像一位冷静的船长,用事件驱动的罗盘指引着数据洪流的航向。当我们惊叹于它举重若轻的并发处理能力时,或许更应该思考:在摩尔定律逐渐失效的今天,软件架构的智慧是否比硬件堆砌更具生命力?
下次当你看到Nginx的羽毛Logo时,愿你能听见多进程协同工作的交响,看见操作系统内核与现代软件设计的共舞。在技术的星辰大海中,Nginx永远是最可靠的灯塔之一——因为它告诉我们,真正的力量,往往藏匿于简洁之中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2337593.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Docker 设置镜像源后仍无法拉取镜像问题排查

#记录工作 Windows系统 在使用 Docker 的过程中,许多用户会碰到设置了国内镜像源后,依旧无法拉取镜像的情况。接下来,记录了操作要点以及问题排查方法,帮助我们顺利解决这类问题。 Microsoft Windows [Version 10.0.27823.1000…

Edge 浏览器推出 Copilot Vision:免费实时解析屏幕内容;Aqua Voice:极速 AI 语音输入工具丨日报

开发者朋友们大家好 这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的 技术 」、「有亮点的 产品 」、「有思考的 文章 」、「有态度的 观点 」、「有看…

async-profiler火焰图找出耗CPU方法

事情起于开发应用对依赖的三方包(apache等等)进行了升级后(主要是升级spring),CPU的使用率较原来大幅提升,几个应用提升50%-100%。 查找半天,对比每次版本的cpu火焰图,看不出有什么…

@Autowird 注解与存在多个相同类型对象的解方案

现有一个 Student 类,里面有两个属性,分别为 name 和 id;有一个 StuService 类,里面有两个方法,返回值均为类型为 Student 的对象;还有一个 StuController 类,里面有一个 Student 类型的属性&am…

WordPiece 详解与示例

WordPiece详解 1. 定义与背景 WordPiece 是一种子词分词算法,由谷歌于2012年提出,最初用于语音搜索系统,后广泛应用于机器翻译和BERT等预训练模型。其核心思想是将单词拆分为更小的子词单元(如词根、前缀/后缀),从而解决传统分词方法面临的词汇表过大和未知词(OOV)处…

PVE+CEPH+HA部署搭建测试

一、基本概念介绍 Proxmox VE ‌Proxmox Virtual Environment (Proxmox VE)‌ 是一款开源的虚拟化管理平台,基于 Debian Linux 开发,支持虚拟机和容器的混合部署。它提供基于 Web 的集中管理界面,简化了计算、存储和网络资源的配置与监控。P…

ROS ROS2 机器人深度相机激光雷达多传感器标定工具箱

系列文章目录 目录 系列文章目录 前言 三、标定目标 3.1 使用自定义标定目标 四、数据处理 4.1 相机数据中的标定目标检测 4.2 激光雷达数据中的标定目标检测 输入过滤器: 正常估算: 区域增长: 尺寸过滤器: RANSAC&a…

android rtsp 拉流h264 h265,解码nv12转码nv21耗时卡顿问题及ffmpeg优化

一、 背景介绍及问题概述 项目需求需要在rk3568开发板上面,通过rtsp协议拉流的形式获取摄像头预览,然后进行人脸识别 姿态识别等后续其它操作。由于rtsp协议一般使用h.264 h265视频编码格式(也叫 AVC 和 HEVC)是不能直接用于后续处…

熊海cms代码审计

目录 sql注入 1. admin/files/login.php 2. admin/files/columnlist.php 3. admin/files/editcolumn.php 4. admin/files/editlink.php 5. admin/files/editsoft.php 6. admin/files/editwz.php 7. admin/files/linklist.php 8. files/software.php 9. files…

DeepSeek 与开源:肥沃土壤孕育 AI 硕果

当 DeepSeek 以低成本推理、多模态能力惊艳全球时,人们惊叹于国产AI技术的「爆发力」,却鲜少有人追问:这份爆发力的根基何在? 答案,藏在中国开源生态二十余年的积淀中。 从倪光南院士呼吁「以开源打破垄断」&#xf…

Maven中clean、compil等操作介绍和Pom.xml中各个标签介绍

文章目录 前言Maven常用命令1.clean2.vaildate3.compile4.test5.package6.verify7.install8.site9.deploy pom.xml标签详解格式<?xml version"1.0" encoding"UTF-8"?>(xml版本和编码)modelVersion&#xff08;xml版本&#xff09;groupId&#xff…

力扣刷题-热题100题-第35题(c++、python)

146. LRU 缓存 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/lru-cache/?envTypestudy-plan-v2&envIdtop-100-liked 双向链表哈希表 内置函数 对于c有list可以充当双向链表&#xff0c;unordered_map充当哈希表&#xff1b;python有OrderedDic…

Nautilus 正式发布:为 Sui 带来可验证的链下隐私计算

作为 Sui 安全工具包中的强大新成员&#xff0c;Nautilus 现已上线 Sui 测试网。它专为 Web3 开发者打造&#xff0c;支持保密且可验证的链下计算。Nautilus 应用运行于开发者自主管理的可信执行环境&#xff08;Trusted Execution Environment&#xff0c;TEE&#xff09;中&a…

云服务器CVM标准型S5实例性能测评——2025腾讯云

腾讯云服务器CVM标准型S5实例具有稳定的计算性能&#xff0c;CPU采用采用 Intel Xeon Cascade Lake 或者 Intel Xeon Cooper Lake 处理器&#xff0c;主频2.5GHz&#xff0c;睿频3.1GHz&#xff0c;CPU内存配置2核2G、2核4G、4核8G、8核16G等配置&#xff0c;公网带宽可选1M、3…

leetcode面试经典算法题——2

链接&#xff1a;https://leetcode.cn/studyplan/top-interview-150/ 20. 有效的括号 给定一个只包括 ‘(’&#xff0c;‘)’&#xff0c;‘{’&#xff0c;‘}’&#xff0c;‘[’&#xff0c;‘]’ 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&#x…

Ubuntu20.04安装企业微信

建议先去企业微信官网看一下有没有linux版本&#xff0c;没有的话在按如下方式安装&#xff0c;不过现在是没有的。 方案 1、使用docker容器 2、使用deepin-wine 3、使用星火应用商店 4. 使用星火包deepin-wine 5、使用ukylin-wine 本人对docker不太熟悉&#xff0c;现…

在Ubuntu服务器上部署xinference

一、拉取镜像 docker pull xprobe/xinference:latest二、启动容器&#xff08;GPU&#xff09; docker run -d --name xinference -e XINFERENCE_MODEL_SRCmodelscope -p 9997:9997 --gpus all xprobe/xinference:latest xinference-local -H 0.0.0.0 # 启动一个新的Docker容…

异步编程——微信小程序

1. 前言 引用来自&#xff1a;微信小程序开发中的多线程处理与异步编程_微信小程序 多线程-CSDN博客 微信小程序是基于JavaScript开发的&#xff0c;与浏览器JavaScript不同&#xff0c;小程序运行在WebView内部&#xff0c;没有多线程的概念。小程序的 JavaScript 是单线程的…

STM32 四足机器人常见问题汇总

文章不介绍具体参数&#xff0c;有需求可去网上搜索。 特别声明&#xff1a;不论年龄&#xff0c;不看学历。既然你对这个领域的东西感兴趣&#xff0c;就应该不断培养自己提出问题、思考问题、探索答案的能力。 提出问题&#xff1a;提出问题时&#xff0c;应说明是哪款产品&a…

Windows 下实现 PHP 多版本动态切换管理(适配 phpStudy)+ 一键切换工具源码分享

&#x1f680; Windows 下实现 PHP 多版本动态切换管理&#xff08;适配 phpStudy&#xff09; 一键切换工具源码分享 &#x1f4e6; 工具特点&#x1f9ea; 效果展示&#x1f9f1; 环境要求&#x1f9d1;‍&#x1f4bb; 源码展示&#xff1a;php_switcher.py&#x1f6e0; 打…