什么是Nginx(简述版)

首先你写文本为xx.txt,拖在网站打开就可以看到你写的内容,但太过单调-----------------------------怎么办了???-----------------------------

-------这时候你就想到了加样式及<h1></h1> <b></b> color……-----------------------这时候就出现了一个加了样式的文件,现在人把他以

HTML结尾即我们前端学的HTML-----------------浏览器只要识别里面的是HTML标签就会把它的标签解析出来----------------我们看到的网页

都是看别人的HTML页面,但我们又是怎么看到的???-----------------是从远程某个服务器传到我们的电脑浏览器后打开的------------------

---我们是怎么获得这个服务器的HTML的文件的??? --------------------------所以肯定有一个中间人,即Nginx(不止这一个,毕竟人类都最

初至少有两个吧)--------------------------1,2,3,4,5,6,7它主要做这些,只要你写好配置,它能为你做任何事(wc 天生牛马圣体)


1.HTTP服务器

介绍nginx之前你首先要了解--------------------------什么是HTTP服务器???-------------------------------回到之前问题我想要让本地服务器

获取到远端服务器的内容----------------------------我该怎么办????--------------------------我可以在远端服务器启动一个进程(资源分配

和调度)------------------------------------这个进程对外提供HTTP服务(即我们看到的URL:ip 域名……)----------------------------------当我

们输入这个URL时,浏览器就会给这个进程发一个HTTP请求,进程收到请求后就会给我们发一个HTML文件(多好的一个人啊,但每个人是不

同的,所以限制不同)---------------------------我们收到后浏览器就开始解析展示了

总结:根据HTTP请求访问进程之后传输给我们就叫:HTTP服务器


2.负载均衡、反向代理

接下来你还要了解什么是反向代理-----------------------------------一个产品肯定不止一个页面吧???(最起码前端页面与后端页面)-------

------------------------为什么要有那么多页面了????--------------------------------比如京东页面,某个东西卖完了你不可能手动删除吧,

这时候就需要某个页面给他更新产品数据即后端服务-----------------------------你遇到过网站卡断的情况没,就好比过年抢票卡死-------------

-------------------------------所以这时候服务器肯定扛不住---------------------这时候咋办???--------------------(算了吧不管了等着呗,躺

平等死,假设你付钱了呢,WC赶紧解决那是我生活费)---------------------------我会增加多个服务(可以吧,我真聪明),他们都有对应的ip

与端口(至少要有个名字吧)-----------------------------------------------------(但这是我加的又不是电脑加的),电脑就不知道访问哪个-----

-------------------------------(真难受啊,还需要我指向)这是时候加个进程吧,对外提供一个URL域名,这样就可以分配啊-------------------

-------------------------这叫做负载均衡(起名还好最起码能理解)----------------------------像这种屏蔽掉有哪些服务器的代理方式就叫做

向代理--------------------------------------------这时候对外只提供一个URL/域名------------------之后根据需要随时扩缩服务-----------------

(现在的已经什么都不缺了---圣主)HTTP服务 + 反向代理可以说非常流弊了-------------------------现在最起码算个网关了------------------所

以我现在加个日志:{方便后续排查问题} 压缩:{减小带宽消耗} ip{限流或者封禁} 内容{修改}……------------------------------(给你们了)设置

这些为开发接口,自定义模块(你们随便设置)----------------------------------------------我想把这个分享给更多人使用,怎么办???------

-------------------(改协议)让它支持TCP、UDP、HTTP2、Websocket、(不写了给他们权限吧让他们随便加)、自定义模块

总结:服务器均匀分配:负载均衡

屏蔽掉有哪些服务器的代理:反向代理


3.配置能力

我搞了这么多,以及用户添加的自定义模块,太多了,肯定不会全部用上------------------------------(存起来)把用户要用的给放在一个配置

文件中,即nginx.conf

总结:把用户要用的给放在一个配置文件中:nginx.con---配置能力


4.单线程、多进程(worker进程)

现在业务多了,不同用户使用不同业务,执行的进程不同容易多进程并发-------------------------咋办了???-------------------(找一个指挥

就好了)我可以把这些多进程给到一个就好了:单线程--------------------(兄弟,你是真不把机器人当人看啊)多个进程给它压力也很大,还

慢,还要等(非常容易直接不干)--------------------------(多招人吧)把单线程弄成多个:多线程------------------------------这时候就算一

个不想干了还都其他的----------------------让他们同时监听一个IP或者端口,一有业务出来随机给到其中一个---------------------将进程数量

设置跟CUP核数一致(绝杀)-----------------------问题1:为什么多个进程同时监听同一个端口不会冲突?????

总结:多进程给到一个 :单线程

单线程弄成多个: 多进程(worker进程)


5.内存共享

现在要使他们工作相同,(否则说我偏心)----------------------------给他们(任务相同) 限流-----------但又是随机给他们的------------啊u哦

一给他们一个共享内存区域,方便他们共同一份数据逻辑,确保系统数据一致 -----------------提高利用率、防止高并发

总结:为了是他们能够限流给他们一个内存:内存共享


6.Proxy Cache(空间换时间)

每次请求相同的内容时都要经历一遍:前端—线程-----后端 后端------线程-------前端麻烦----------------------------------------如果能够读取

前端每次执行相同的行为 ,直接通过线程给他就好了????----------------------给共享内存????----------------------------内存太贵了-

--------------------我们可以搞一个文件 用来请求过程中暂存返回的值 后面再有相同请求时直接给他

总结:搞一个文件放请求数据,不用重复执行: Proxy Cache


7.加入Masteer进程

如果我网站更新怎么办,他们会同时更新,网络链接全部断掉 (全部放假,没人工作)-------------------------让他们挨个更新就好,创建

worker和关闭worker(让他们轮流放假)------------------这时候需要一个新的进程协调worker(找个管理者):Masteer进程------------------------

---让Masteer进程读取nginx.conf配置统一管理多个worker

总结:读取nginx.conf配置统一管理多个worker防止全部宕机: Masteer进程

问题1:为什么多个进程同时监听同一个端口不会冲突?????

问题2:怎么解决nginx单点(服务器宕机了,nginx也得G)问题?

问题3:他有集群模式(将多台独立的计算机通过网络连接起来,协同工作以共同完成一项或多项任务的技术架构)吗?

什么是Nginx(优化版)—— 从网页访问到核心能力拆解

我们先从一个日常场景切入:当你想在网页上展示内容时,最初可能会写一个 xx.txt 文件,拖到网站打开就能看到文字,但内容单调、毫无格式。这时候,你会想到用 <h1> 标题、<b> 加粗、color 颜色等样式标签美化它 —— 此时这个带样式的文件,就是我们前端学习的 HTML 文件。浏览器只要识别到 HTML 标签,就会解析并展示出排版精美的内容。


但我们看到的网页,本质是 “远程服务器的 HTML 文件” 传到本地浏览器后打开的。那问题来了:我们怎么从远程服务器获取到这个 HTML 文件?这就需要一个 “中间人” 来衔接 ——Nginx 就是最常用的 “中间人” 之一。它的核心能力可以拆解为 7 个方向,只要配置得当,就能灵活满足各类服务需求。

1. 核心能力一:HTTP 服务器 —— 网页传输的 “连接器”

在了解 Nginx 前,先搞懂什么是 HTTP 服务器
回到 “获取远程服务器内容” 的问题 —— 要实现这个需求,只需在远程服务器上启动一个 “特殊进程”:

  • 这个进程会对外提供 HTTP 服务(通过 URL、IP、域名等标识自己);

  • 当我们在浏览器输入 URL 时,浏览器会向这个进程发送 HTTP 请求

  • 进程收到请求后,会把对应的 HTML 文件(或其他资源)返回给浏览器;

  • 浏览器解析文件后,就展示出我们看到的网页。


总结:通过 HTTP 请求衔接 “用户 - 服务器”,并传输资源的进程,就是 HTTP 服务器。Nginx 最基础的功能,就是充当这个 “连接器”。

2. 核心能力二:负载均衡 + 反向代理 —— 解决 “服务器扛不住” 的问题

一个产品不会只有 “前端页面”,还需要 “后端服务”(比如京东商品卖完后,自动更新库存的服务)。但遇到高并发场景(如过年抢票),单台服务器很容易 “卡死”,这时候该怎么办?

第一步:用 “负载均衡” 分摊压力

我们可以新增多台后端服务器(每台都有独立 IP 和端口),但电脑不知道该访问哪台 —— 这时候 Nginx 就能充当 “分配员”:

  • Nginx 对外只提供一个统一的 URL / 域名;

  • 当用户请求进来时,Nginx 会按规则(如轮询、权重)把请求分配到不同的后端服务器上;

  • 这样就避免了单台服务器过载,实现 “压力均匀分摊”

第二步:用 “反向代理” 隐藏后端细节

用户只知道 “访问 Nginx 的 URL”,完全不知道背后有多少台后端服务器、每台的 IP 是什么 —— 这种 “屏蔽后端服务器真实信息” 的代理方式,就是 反向代理

额外扩展:加上这两个能力后,Nginx 基本能当 “网关” 用了 —— 还能额外配置日志(方便排查问题)、压缩(减小带宽消耗)、IP 限流 / 封禁(防恶意请求)、内容修改等功能,甚至支持 TCP、UDP、HTTP2、Websocket 等协议,也能通过自定义模块扩展更多能力。


总结

  • 负载均衡:把请求均匀分配给多台服务器,避免单台过载;

  • 反向代理:隐藏后端服务器细节,对外只暴露统一入口。

3. 核心能力三:配置能力 —— 灵活控制功能的 “开关”

Nginx 支持的功能(包括自定义模块)非常多,但实际使用中不会全部用到。为了方便管理,Nginx 把 “用户需要启用的功能” 集中放在一个配置文件里 ——nginx.conf

比如你想启用 “反向代理”,就在 nginx.conf 里写对应的代理规则;想关闭 “日志功能”,就注释掉日志相关配置。只需修改这个文件,就能灵活控制 Nginx 的功能。

总结:通过 nginx.conf 配置 “需要启用的功能”,就是 Nginx 的配置能力。

4. 核心能力四:单线程 + 多进程(Worker 进程)—— 高效处理并发

业务变多后,不同用户的请求会触发不同进程,容易出现 “多进程并发混乱”。Nginx 用 “单线程 + 多进程” 的架构解决了这个问题:

第一步:从 “多进程” 到 “单线程指挥”

最初用 “单线程” 统一管理多进程,但单线程压力太大(处理慢、容易崩溃);

第二步:从 “单线程” 到 “多 Worker 进程”

把单线程拆成多个 Worker 进程(类似 “多个人一起干活”):

  • 所有 Worker 进程同时监听同一个 IP 和端口;

  • 有新请求时,随机分配给一个 Worker 进程处理;

  • 最佳实践是 “Worker 进程数量 = CPU 核数”(避免进程切换消耗,效率最高)。

补充问题:为什么多个 Worker 进程监听同一个端口不会冲突?(后文问题 1 会详细解答)

总结:用 “多 Worker 进程” 替代单线程,既避免了并发混乱,又提高了处理效率。

5. 核心能力五:内存共享 —— 确保 “多进程数据一致”

多 Worker 进程是 “随机处理请求” 的,但我们需要它们执行相同的规则(比如限流:每秒钟最多处理 1000 个请求)。如果每个进程各自维护一套数据,很容易出现 “规则不一致”(比如 A 进程限 1000,B 进程限 2000)。

这时候 内存共享 就派上用场了:
Nginx 会开辟一块 “共享内存区域”,让所有 Worker 进程都能访问同一份数据(如限流规则、统计数据)。这样既能确保所有进程的逻辑一致,又能提高资源利用率,防止高并发下的数据混乱。

总结:通过共享内存让多进程共用一套数据,确保规则统一、防并发混乱。

6. 核心能力六:Proxy Cache(代理缓存)—— 用 “空间换时间” 提升速度

每次请求相同内容(比如同一篇文章),都要走 “前端→Nginx→后端→Nginx→前端” 的完整流程,效率很低。有没有办法 “跳过后端” 直接返回数据?

答案是 Proxy Cache

  • Nginx 会在本地创建一个 “缓存文件”;

  • 第一次请求某内容时,Nginx 从后端获取数据后,会把数据暂存在缓存文件里;

  • 后续再有相同请求时,Nginx 直接从缓存文件中读取数据返回,不用再请求后端。

虽然缓存用 “文件” 而非 “内存”(内存成本高),但能大幅减少后端请求次数,用 “存储空间” 换 “响应速度”,性价比很高。

总结:用缓存文件暂存重复请求的结果,避免重复走 “后端流程”,提升响应速度。

7. 核心能力七:Master 进程 —— 管理 Worker 进程的 “指挥官”

如果需要更新 Nginx 配置或重启服务,直接操作 Worker 进程会有问题:所有 Worker 同时停止,会导致网络连接全部断开(相当于 “所有员工同时放假,没人干活”)。

这时候就需要 Master 进程 来协调:

  • Master 进程的核心作用是 “管理 Worker 进程”:读取 nginx.conf 配置、创建 Worker 进程、关闭旧 Worker 进程;

  • 更新配置时,Master 会先启动新的 Worker 进程(加载新配置),再逐个关闭旧的 Worker 进程;

  • 这样就能实现 “无缝更新”,不会出现 “服务中断” 的情况。


总结:Master 进程是 Worker 进程的 “指挥官”,确保服务更新时不中断,提升稳定性。