(十七) Nginx解析:架构设计、负载均衡实战与常见面试问题

什么是Nginx?

Nginx 是一款高性能的 HTTP 服务器和反向代理服务器,同时支持 IMAP/POP3/SMTP 协议。其设计以高并发、低资源消耗为核心优势,广泛应用于负载均衡、静态资源服务和反向代理等场景。

一、Nginx 的核心优势

  1. 高并发处理能力采用异步非阻塞的 I/O 多路复用模型(如 epoll/kqueue),单机可支持 5 万+ 并发连接。相比传统多线程模型(如 Apache),资源消耗更低,内存占用仅为 Apache 的 1/5-1/10。
  2. 反向代理与负载均衡支持轮询、权重分配、IP哈希等策略,实现流量分发到多台后端服务器,提升系统容错性和处理效率。内置健康检查功能,自动剔除故障节点,保障服务可用性。
  3. 低资源消耗与高稳定性基于事件驱动模型,CPU 亲和性设计减少上下文切换开销。支持热部署,可在不中断服务的情况下更新配置或版本。
  4. 灵活的扩展性模块化架构支持第三方插件扩展(如缓存、安全防护等)。配置文件简洁,支持 Rewrite 规则和正则表达式匹配。

二、主要功能与应用场景

  1. Web 服务器静态资源高效处理:直接托管 HTML、图片等文件,响应速度远超传统服务器。动静分离:将动态请求(如 PHP、Node.js )与静态资源(如 CSS、JS)分开处理,降低后端压力。
  2. 反向代理与安全防护隐藏真实服务器 IP,抵御 DDoS 攻击,支持 SSL/TLS 加密。通过访问控制(IP 白名单、HTTP 认证)提升安全性。
  3. 缓存与性能优化支持 GZIP 压缩和浏览器缓存,减少带宽消耗。反向代理缓存动态内容,降低后端服务器负载。
  4. 邮件代理与多协议支持可作为 IMAP/POP3/SMTP 代理服务器,处理邮件收发请求。

三、典型应用场景

  • 大型网站架构:如新浪、腾讯等,用于负载均衡和静态资源加速。
  • 微服务网关:作为 API 网关统一管理请求路由和限流。
  • 内容分发网络(CDN):结合缓存机制加速静态资源访问。

四、与其他服务器的对比

特性

Nginx

Apache

并发模型

异步非阻塞(epoll)

多线程/多进程

内存消耗

低(约 2.5MB/万连接)

高(约 20MB/进程)

热部署

支持

不支持

五、核心架构与事件驱动模型

1. 多进程架构设计

• Master - Worker机制
主进程(Master)承担管理配置、信号分发以及监控工作进程(Worker)的职责,支持热部署(借助nginx -s reload可在无需停机的情况下进行更新)。工作进程(Worker)基于异步非阻塞模型构建,单线程能够处理数以万计的并发连接,通过共享内存达成高效通信。

2. 事件驱动模型

• Epoll/Kqueue高效处理
采用Reactor模式,仅聚焦于活跃连接(相较于select/poll,减少了O(n)的遍历开销),可实现单个Worker处理超过10万的并发连接。每个Worker独立运行事件循环,避免了线程切换的开销。

3. 内存管理优化

• 静态资源处理的内存消耗低至2.5MB/万连接,借助内存池机制减少内存碎片。

六、负载均衡深度配置

1. 基础配置模板

http {
    upstream backend {
        # 加权轮询(默认策略)
        server 192.168.1.101:8080 weight=5; 
        server 192.168.1.102:8080 weight=3; 
        server 192.168.1.103:8080 backup;  # 备用节点 
        
        # 策略选择 
        ip_hash;       # 会话保持(解决Session问题)
        # least_conn;  # 最小连接数策略 
    }
 
    server {
        location / {
            proxy_pass http://backend; 
            proxy_set_header Host $host; 
        }
    }
}

2. 高级策略解析

策略类型

适用场景

特点

IP哈希

需会话保持的业务(如购物车)

相同IP始终路由到固定节点,可能引发负载不均

加权最少连接

服务器性能差异大的集群

动态选择当前连接数最少的节点,需配合健康检查使用

响应时间优先

对延迟敏感的应用

需安装第三方模块(如nginx-upstream-fair),根据响应时间动态分配请求

七、常见面试题

Nginx 是一款轻量级的高性能 Web 服务器、反向代理服务器以及电子邮件(IMAP/POP3)代理服务器,由俄罗斯的软件工程师 Igor Sysoev 开发。以下是关于 Nginx 的详细介绍及其常见应用场景:

Nginx 的特点

  • 高性能和稳定性:Nginx 采用了事件驱动的异步非阻塞模型,能够在高并发情况下保持低资源消耗和高响应速度,稳定性强,可长时间稳定运行。
  • 低内存占用:在处理大量并发连接时,Nginx 对内存的占用相对较少,能够高效利用系统资源。
  • 丰富的模块功能:支持众多的模块,如 HTTP 模块、SSL 模块、反向代理模块等,通过这些模块可以方便地实现各种功能扩展。
  • 热部署:可以在不停止服务的情况下进行配置文件的更新和模块的升级,保证服务的连续性。

应用场景

Nginx 是什么?

Nginx 是一款轻量级的高性能 Web 服务器、反向代理服务器以及电子邮件(IMAP/POP3)代理服务器,由俄罗斯的软件工程师 Igor Sysoev 开发.

它有哪些应用场景?

  • Web 服务器:可作为独立的 Web 服务器,直接处理静态资源请求,如 HTML、CSS、JavaScript、图片等文件。它能够高效地将这些静态文件发送给客户端,减轻后端应用服务器的压力。
  • 反向代理服务器:Nginx 常被用于反向代理场景,接收互联网用户的请求,并将请求转发到后端的真实服务器上。同时,它还可以对后端服务器的响应进行缓存、过滤等处理,提高系统的性能和安全性。例如,当有大量用户访问一个网站时,Nginx 可以根据预设的规则,将请求分发到不同的后端服务器上,实现负载均衡,提升整体系统的处理能力。
  • 负载均衡器:Nginx 可以实现对多个后端服务器的负载均衡,通过轮询、IP 哈希、加权轮询等多种算法,将客户端请求均匀地分配到不同的服务器上,使各服务器的负载相对均衡,避免单点故障,提高系统的可靠性和可用性。
  • SSL/TLS 终端代理:Nginx 可以对 SSL/TLS 加密的流量进行处理,实现 SSL/TLS 的卸载。即 Nginx 在前端接收加密的 HTTPS 请求,进行解密后再将明文请求转发给后端服务器,这样可以减轻后端服务器的加密计算压力,提高整体系统的性能。
  • HTTP 缓存服务器:Nginx 可以对经常访问的静态资源和部分动态资源进行缓存,当客户端再次请求相同资源时,Nginx 可以直接从缓存中返回数据,而无需向后端服务器发送请求,大大提高了响应速度,降低了后端服务器的负载,节省了带宽资源。
  • 邮件代理服务器:Nginx 还可以作为电子邮件(IMAP/POP3)代理服务器,为邮件系统提供代理和缓存功能,提高邮件系统的性能和可靠性。

如何配置 Nginx 实现静态资源访问?

设置nginx.config 文件, 配置具体的访问路径

Nginx 的常用命令有哪些?

  • 启动 : nginx
  • 停止 : nginx -s stop
  • 重启: nginx -s restart
  • 先停止再启动 : nginx -s stop && sudo nginx
  • 重载配置文件: sudo nginx -s reload
  • 检查配置文件语法: nginx -t
  • 查看 Nginx 版本信息: nginx -v

如何在 Nginx 中获取当前时间?

$time_local或$time_iso8601来获取当前时间

Nginx 命令中 -s 参数的作用是什么?具体有哪些用法?

向主进程Matser发送信号来控制Worker进程, 如 nginx -s stop 等

如何禁止某个 IP 的访问?

在设置nginx.config 文件 中加入 如 ''deny 127.0.0.2"等,配置完后重新加载nginx

如何实现请求的重定向?

在设置nginx.config 文件 中加入 "如old-path-->new-path"

location /old-path {
     rewrite ^/old-path$ /new-path permanent;
}

什么是正向代理和反向代理?

  • 正向代理:为客户端服务,客户端主动使用,向代理服务器发送请求,代理再转发到目标服务器,可突破访问限制等,隐藏真实客户端。
  • 反向代理:为服务器服务,客户端无感知,请求直接到反向代理服务器,由其转发到内部真实服务器,常用于负载均衡等,隐藏真实服务器。

如何使用 Nginx 做反向代理?

  1. 安装 Nginx:以 Ubuntu 系统为例,通过 sudo apt update 和 sudo apt install nginx 命令完成安装。
  2. 配置反向代理编辑配置文件,常见路径为 /etc/nginx/sites - available/default 或 /etc/nginx/conf.d/default.conf。
  3. 检查配置语法:使用 sudo nginx -t 命令检查配置文件语法是否正确。
  4. 重新加载配置:执行 sudo systemctl reload nginx 使新配置生效。
  5. 验证反向代理:通过浏览器或其他工具访问配置的域名,验证请求是否被正确转发到后端服务器。

如何用 Nginx 做限流,有几种限流算法,分别如何实现?

限流算法介绍

  • 漏桶算法:将请求视为水,以固定速率处理,超量请求在桶中等待,桶满则丢弃新请求,用于严格控制请求速率的场景。
  • 令牌桶算法:系统按固定速率向桶中放令牌,请求需获取令牌才能处理,允许一定突发请求,适用于对突发流量有容忍度的场景。

实现方式

基于漏桶算法(limit_req模块)

  1. 配置限流区域:在 http 块定义,如 limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/s,依据客户端 IP 限流,每秒允许 10 个请求。
  2. 应用限流规则:在 server 或 location 块使用,如 limit_req zone=mylimit burst=20 nodelay,指定限流区域、突发请求数及不排队处理。

模拟令牌桶算法(limit_req模块结合burst参数)

通过设置 burst 参数,允许短时间内有额外 “令牌” 处理突发请求,突破 rate 限制但在 burst 范围内的请求可立即处理。

基于连接数限流(limit_conn模块)

  1. 配置连接限制区域:在 http 块定义,如 limit_conn_zone $binary_remote_addr zone=perip:10m,按客户端 IP 限制连接数。
  2. 应用连接限制规则:在 server 或 location 块使用,如 limit_conn perip 10 限制每个客户端 IP 并发连接数为 10 个。

为什么 Nginx 的性能那么高?

源于其多进程单线程与模块化的架构设计、异步非阻塞I/O的事件处理机制、高效的内存池与低内存占用管理、HTTP 及反向代理缓存机制以及对 HTTP 和 SSL/TLS 协议的优化处理。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Cpu100%问题(包括-线上docker服务以及Arthas方式进行处理)

🍓 简介:java系列技术分享(👉持续更新中…🔥) 🍓 初衷:一起学习、一起进步、坚持不懈 🍓 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正🙏 🍓 希望这篇文章对你有所帮助,欢…

【大模型】WPS 接入 DeepSeek-R1详解,打造全能AI办公助手

目录 一、前言 二、WPS接入AI工具优势​​​​​​​ 三、WPS接入AI工具两种方式 3.1 手动配置的方式 3.2 Office AI助手 四、WPS手动配置方式接入AI大模型 4.1 安装VBA插件 4.1.1 下载VBA插件并安装 4.2 配置WPS 4.3 WPS集成VB 4.4 AI助手效果测试 4.5 配置模板文…

架构思维:高性能架构_01基础概念

文章目录 概述基础概念性能指标利特尔法则(O T L)系统优化策略1. 降低耗时(L↓)2. 增加容量(O↑)3. 增加时延(L↑) 场景化指标选择响应时间优先吞吐量/容量优先平衡策略 概述 一个…

解决stylelint对deep报错

报错如图 在.stylelintrc.json的rules中配置 "selector-pseudo-class-no-unknown": [true,{"ignorePseudoClasses": ["deep"]} ]

VScode 中文符号出现黄色方框的解决方法

VScode 中文符号出现黄色方框的解决方法 我的vscode的python多行注释中会将中文字符用黄色方框框处: 只需要打开设置搜索unicode,然后将这一项的勾选取消掉就可以了: 取消之后的效果如下: 另一种情况:中文显示出现黄色…

大模型架构记录2

一 应用场景 1.1 prompt 示例 1.2 自己搭建一个UI界面,调用接口 可以选用不同的模型,需要对应的API KEY 二 Agent 使用 2.1 构建GPT

深度学习实战车辆目标跟踪与计数

本文采用YOLOv8作为核心算法框架,结合PyQt5构建用户界面,使用Python3进行开发。YOLOv8以其高效的实时检测能力,在多个目标检测任务中展现出卓越性能。本研究针对车辆目标数据集进行训练和优化,该数据集包含丰富的车辆目标图像样本…

升级到Android Studio 2024.2.2 版本遇到的坑

一、上来就编译报错,大概率是因为选择了替换安装,本地配置文件出错 找到本地当前版本的配置文件,删掉,重启studio就好了: 1、打开终端 2、“cd /Users/用户名/Library/Application\ Support/Google” //到Google目录 …

Git - 补充工作中常用的一些命令

Git - 补充工作中常用的一些命令 1 一些场景1.1 场景11.2 场景21.3 场景31.4 场景41.5 场景51.6 场景61.7 场景71.8 场景81.9 场景91.10 场景101.11 场景111.12 场景121.13 场景131.14 场景141.15 场景15 2 git cherry-pick \<commit-hash\> 和 git checkout branch \-\-…

【网络安全工程】任务11:路由器配置与静态路由配置

目录 一、概念 二、路由器配置 三、配置静态路由CSDN 原创主页&#xff1a;不羁https://blog.csdn.net/2303_76492156?typeblog 一、概念 1、路由器的作用&#xff1a;通过路由表进行数据的转发。 2、交换机的作用&#xff1a;通过学习和识别 MAC 地址&#xff0c;依据 M…

如何用更少的内存训练你的PyTorch模型?深度学习GPU内存优化策略总结

在训练大规模深度学习模型时&#xff0c;GPU 内存往往成为关键瓶颈&#xff0c;尤其是面对大型语言模型&#xff08;LLM&#xff09;和视觉 Transformer 等现代架构时。由于大多数研究者和开发者难以获得配备海量 GPU 内存的高端计算集群&#xff0c;掌握高效的内存优化技术至关…

Dify+DeepSeek | Excel数据一键可视化(创建步骤案例)(echarts助手.yml)(文档表格转图表、根据表格绘制图表、Excel绘制图表)

Dify部署参考&#xff1a;Dify Rag部署并集成在线Deepseek教程&#xff08;Windows、部署Rag、安装Ragan安装、安装Dify安装、安装ollama安装&#xff09; DifyDeepSeek - Excel数据一键可视化&#xff08;创建步骤案例&#xff09;-DSL工程文件&#xff08;可直接导入&#x…

linux下ollama离线安装

一、离线安装包下载地址 直接下载地址&#xff1a; https://github.com/ollama/ollama/releases/tag/v0.5.12 网络爬取地址&#xff1a; MacOS https://ollama.com/download/Ollama-darwin.zip Linux curl -fsSL https://ollama.com/install.sh | sh Windows https://olla…

MAC 搭建Dify+DeepSeek-R1整合部署

在开始安装之前&#xff0c;我们需要确保系统满足以下基本要求&#xff1a; CPU至少2核心内存至少4GB&#xff08;建议8GB以上&#xff09;硬盘空间至少20GB&#xff08;为了后续扩展&#xff09;操作系统支持&#xff1a;Windows、macOS或LinuxDocker环境 1. dify的安装步骤…

OpenManus介绍及本地部署体验

1.OpenManus介绍 OpenManus&#xff0c;由 MetaGPT 团队精心打造的开源项目&#xff0c;于2025年3月发布。它致力于模仿并改进 Manus 这一封闭式商业 AI Agent 的核心功能&#xff0c;为用户提供无需邀请码、可本地化部署的智能体解决方案。换句话说&#xff0c;OpenManus 就像…

springboot011基于springboot的课程作业管理系统(源码+包运行+LW+技术指导)

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得难了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等&#xff0c;你想解决的问题&#xff0c;今天…

swift -(5) 汇编分析结构体、类的内存布局

一、结构体 在 Swift 标准库中&#xff0c;绝大多数的公开类型都是结构体&#xff0c;而枚举和类只占很小一部分 比如Bool、 Int、 Double、 String、 Array、 Dictionary等常见类型都是结构体 ① struct Date { ② var year: Int ③ var month: Int ④ …

全域网络安全防御 健全网络安全防护体系

网络安全基本概念 网络安全&#xff08;Cyber Security&#xff09;是指网络系统的硬件、软件及其系统中的数据受到保护&#xff0c;不因偶然的或者恶意的原因而遭受到破坏、更改、泄露&#xff0c;系统连续可靠正常地运行&#xff0c;网络服务不中断&#xff0c;使网络处于稳…

记录小白使用 Cursor 开发第一个微信小程序(二):创建项目、编译、预览、发布(250308)

文章目录 记录小白使用 Cursor 开发第一个微信小程序&#xff08;二&#xff09;&#xff1a;创建项目、编译、预览、发布&#xff08;250308&#xff09;一、创建项目1.1 生成提示词1.2 生成代码 二、编译预览2.1 导入项目2.2 编译预览 三、发布3.1 在微信开发者工具进行上传3…

uploadlabs通关思路

目录 靶场准备 复现 pass-01 代码审计 执行逻辑 文件上传 方法一&#xff1a;直接修改或删除js脚本 方法二&#xff1a;修改文件后缀 pass-02 代码审计 文件上传 1. 思路 2. 实操 pass-03 代码审计 过程&#xff1a; 文件上传 pass-04 代码审计 文件上传 p…