(十七) 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 协议的优化处理。

相关推荐
邂逅星河浪漫5 分钟前
【DockerFile+Nginx+DockerCompose】前后端分离式项目部署(docker容器化方式)
nginx·docker·centos·部署·docker-compose·dockerfile·容器化部署
天空之外1361 小时前
nginx xxs漏铜修复、nginx 域名配置、nginx https证书配置、Http不安全处理方法
运维·nginx
倔强青铜三1 小时前
苦练Python第58天:filecmp模块——文件和目录“找不同”的利器
人工智能·python·面试
倔强青铜三1 小时前
苦练Python第59天:tempfile模块,临时文件自动删!再也不用手动清理到怀疑人生
人工智能·python·面试
Q741_1472 小时前
C++ 位运算 高频面试考点 力扣 371. 两整数之和 题解 每日一题
c++·算法·leetcode·面试·位运算
神秘人X7072 小时前
Nginx 访问控制、用户认证与 HTTPS 配置指南
nginx·https
Aniugel4 小时前
渐进式 Web 应用(PWA)
面试·pwa
失因4 小时前
Nginx 反向代理、负载均衡与 Keepalived 高可用
运维·nginx·负载均衡
码界奇点5 小时前
Nginx 502 Bad Gateway从 upstream 日志到 FastCGI 超时深度复盘
运维·nginx·阿里云·性能优化·gateway
神经骚栋5 小时前
Flutter面试题01-Flutter中的三棵树
flutter·面试