【视频笔记】Nginx是什么?Nginx高并发架构拆解指南

多个后端服务器时,前端不知道找哪个机器,就需要一个中间进程来做流量转发和分发(负载均衡)

 屏蔽掉后面具体有哪些服务器的代理方式,就是常说的反向代理

 

有了反向代理,我们对外就可以只提供一个URL域名,背后根据需要,随时扩缩容服务
这个反向代理的程序,刚好可以加到前面放html文件的进程上(http服务器)
前后端网络流量都要经过这个中间进程,那也算是一个网关了,那就再加上一些通用的网关能力:
加日志, 记录每次调用的结果,方便后面排查问题
对输入输出加入压缩的功能,减小网络带宽消耗 
对某个ip进行限流或封禁
对输入输出的内容进行修改
提供用户自定义功能,来实现特定功能
协议:
已支持http,还可以支持tcp、udp、http2、websocket
这些能力,可以让用户来选择用哪些,于是可以加个配置文件,也就是nginx.conf
现在这个网关进程的主要任务,就是跟上下游建立网络连接,顺便内部做下处理
多个客户端请求,通过网络进入到一个进程,如果用多线程并发处理,那就需要考虑并发问题影响性能
怎么办? 外部请求都塞到一个线程上处理

 将单个进程换成多个进程,管他们叫worker进程

 用多个worker进程,同时监听一个ip地址加端口,一有流量进来,操作系统就会随机给到其中一个进程处理

将进程数量设置为跟操作系统cpu核数一致,那每个进程都能得到一个核
问题1 :用多个worker进程,同时监听一个ip地址加端口,这里为什么不会端口冲突?

上面多个worker进程模型,流量被分到多个worker进程,要限流的话,每一个worker进程要单独计数,那还怎么限流

给多个进程,分配一块共享内存,使多个进程能够基于相同一份数据做计算

proxyCache

一些用户请求可以在前期访问后端服务器之后,缓存在网关,后面再访问,可以直接返回缓存的数据。 用磁盘空间,换取网络传输或CPU计算耗时

 需要一个协调进程,协调worker进程谁先谁后,比如worker进程滚动升级等,这个协调进程就是master进程

master进程读取nginx.conf配置,统一管理多个worker

最开始那个单进程的网关服务,演变为具有上述丰富功能的网关服务,他就是nginx

 做好相关配置,性能5万QPS轻松应付

问题2: 现在它还只是一台服务器上的多个进程,服务器跪了,nginx也就跪了,成了单点问题,怎么解决呢? nginx有集群模式吗?

 

一些评论

 罗任何

回复 @浪浪山怀民 :有共享内存,但更重要的是什么时候用。每个请求都只会在一个worker里处理,所以内存池和连接池也是以worker为单位分配的,那worker在处理这个请求的时候自然不需要加锁也不需要共享内存(你看到的那个说法可能在说这种情况)。如果说worker间抢accept负载均衡锁,或者说统计一些全局信息,还是要用共享内存的。

 

电石QwQ 笔记

一、Nginx 架构核心设计总结

1. 基础功能定位

  • HTTP 服务器:直接提供静态资源(HTML/CSS/JS),支持高效的文件传输
  • 反向代理:接收客户端请求并转发至后端服务集群,实现负载均衡
  • 模块化网关:通过插件机制扩展功能(如限流、缓存、SSL 终止等)

2. 核心架构特性

  • 单线程异步非阻塞:基于事件驱动模型,一个线程处理所有 IO 事件,避免上下文切换开销
  • Master-Worker 进程模型:
  • Master 进程:管理 worker 进程生命周期,负责配置热加载和滚动升级
  • Worker 进程:实际处理请求,数量通常等于 CPU 核心数,独立监听同一端口(通过 SO_REUSEADDR 实现)
  • 共享内存机制:用于存储计数器(如限流)、缓存元数据等全局状态
  • Proxy Cache:将后端响应缓存到磁盘,降低后端负载(需配置 proxy_cache_path)

3. 关键设计优势

  • 高性能:5 万 QPS + 处理能力(静态资源场景)
  • 高可靠性:worker 进程独立,单进程崩溃不影响整体服务
  • 灵活性:通过配置文件(nginx.conf)实现功能组合,支持动态加载模块

二、单点故障问题分析

问题描述:

当 Nginx 所在服务器宕机时,所有依赖其代理的服务将不可用,形成单点故障。

解决方案:

通过高可用(HA)架构消除单点风险,常见方案如下:

  1. 主备模式(Keepalived + VRRP)
  • 部署两个 Nginx 实例(主 + 备)
  • Keepalived 监控主节点状态,通过 VRRP 协议实现虚拟 IP(VIP)漂移
  • 优点:简单可靠,成本低
  • 缺点:备节点资源闲置,切换时短暂中断
  1. 负载均衡集群(Nginx + 负载均衡器)
  • 前端部署硬件负载均衡器(如 F5)或软件负载均衡器(如 HAProxy)
  • 后端多个 Nginx 实例组成集群,负载均衡器按策略分发流量
  • 优点:实现流量分担和故障转移
  • 缺点:增加架构复杂度
  1. DNS 轮询
  • 同一域名解析到多个 Nginx 实例 IP
  • 客户端通过 DNS 返回的 IP 列表进行请求分发
  • 优点:无需额外硬件 / 软件
  • 缺点:负载均衡效果差,无法感知节点状态
  1. 服务网格(如 Istio)
  • 在 Kubernetes 环境中,通过服务网格实现 Nginx 实例的自动发现和流量管理
  • 优点:动态扩缩容,故障自愈能力强
  • 缺点:需容器化环境支持

三、架构优化建议

  1. 配置优化
  2. nginx
worker_processes 4;  # 与CPU核心数一致
events {
    worker_connections 1024;
    use epoll;  # Linux高效事件驱动
}
http {
    proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=mycache:10m max_size=1g;
    proxy_cache_valid 200 302 1h;
}
  1. 监控与报警
  • 监控指标:QPS、延迟、错误率、连接数
  • 工具推荐:Prometheus + Grafana
  1. 动态扩展
  • 结合 Kubernetes 实现 Nginx 实例的自动扩缩容
  • 使用 Ingress Controller 管理入口流量

四、总结

Nginx 通过单线程异步模型和Master-Worker 架构实现了高性能与灵活性的平衡,但单点故障需通过高可用方案解决。根据业务规模选择合适的 HA 架构:

  • 中小规模:Keepalived 主备模式
  • 大规模:负载均衡集群 + 服务网格
  • 容器化环境:Kubernetes Ingress + Service Mesh

通过上述方案,可将 Nginx 的可用性提升至 99.99% 以上,满足大多数生产环境需求。

 

http { server { # 监听 80 端口,并启用 SO_REUSEPORT listen 80 reuseport; # IPv4 listen 【::】:80 reuseport; # IPv6 # 其他配置(如 server_name、location 等) server_name example.com; ... } }

 

投幣點讚了 想要說一下 在 bare metal 上面強調高併發是沒有意義的,physical I/O 決定了一切 throughput 因為任何服務在沒有 isolation(隔離性)的情況下 concurrency(併發)都是不可用(不可靠)的 在bare metal的情況下除非整台服務器只跑nginx一個服務,這樣調整worker master 達成並發才有意義 但是現代k8s啟蒙下 caddy, traefik 這些 golang based reverse proxy 經過一些調整在單台服務器上幾乎不會跟 nginx 有太多差別之外 在多台服務器配置上比nginx 要方便太多了 HAProxy Nginx 已經是上個時代的產物了,雖然他穩定高效 架不住 cilium 等現代 CNI + Cloud Native 服務快又方便啊

--   在K8S中,CNI模型有哪些? - 黄嘉波 - 博客园

 

主进程监听,子进程消费

 

参考:Nginx是什么?Nginx高并发架构拆解指南_哔哩哔哩_bilibili

posted @ 2025-05-27 10:37  fanblog  阅读(19)  评论(0)    收藏  举报