关于nginx,负载均衡是什么?它能给我们的业务带来什么?怎么去配置它?

User
关于nginx,我还想知道,负载均衡是什么?它能为我的业务带来什么?怎么去配置它?


Assistant
负载均衡是 Nginx 另一个非常强大的功能,也是构建高可用、高性能应用的关键技术之一。我们来详细了解一下。

1. 什么是负载均衡 (Load Balancing)?

想象一下一个超市只有一个收银台,高峰期肯定会排起长队。负载均衡就像是超市增开了多个收银台,并有一个调度员指挥顾客去当前最空闲或下一个可用的收银台结账。

在网络世界里:

  • 负载均衡 是一种将网络请求(比如来自用户浏览器的 HTTP 请求)分发多个后端服务器上的技术。
  • 这些后端服务器都运行着相同的应用程序或服务(比如你的 FastAPI 应用)。
  • Nginx 可以扮演这个“调度员”的角色,接收所有进来的请求,然后根据一定的策略(算法)将请求转发给后端服务器集群(也称为“上游服务器组”或 “Upstream”)中的某一台服务器。

核心目的:

  • 防止单点过载: 避免所有请求都压在单一服务器上,导致其性能下降甚至崩溃。
  • 提高处理能力: 多个服务器协同工作,可以处理比单个服务器大得多的并发请求量。
  • 提升可用性: 如果后端集群中的某台服务器发生故障,负载均衡器可以检测到并停止向其发送请求,将请求转发给其他健康的服务器,从而保证服务的持续可用。

2. 负载均衡能为你的业务带来什么?

为你的 Vue + FastAPI 项目引入 Nginx 负载均衡,可以带来显著的好处:

  • 高可用性 (High Availability):
    • 这是最重要的好处之一。如果你的 FastAPI 应用部署在多台服务器上(或者同一台服务器的多个端口上运行多个实例),当其中一个实例因为维护、更新或意外崩溃而宕机时,Nginx 会自动将新的请求发送给其他健康的实例。用户几乎不会察觉到服务中断(或者中断时间极短),大大提高了应用的稳定性和可靠性。
  • 提升性能和响应速度:
    • 通过将请求分散到多个后端服务器,减轻了单个服务器的压力。每台服务器可以更快地处理分配给它的请求,从而缩短用户的等待时间,提升整体体验。
  • 更好的可伸缩性 (Scalability):
    • 当你的用户量增长,请求压力增大时,你不需要去升级单台服务器的硬件(垂直扩展,成本高且有上限)。你可以简单地在后端集群中增加更多的应用实例(水平扩展),然后在 Nginx 的 upstream 配置中添加这些新实例即可。Nginx 会自动将负载分配到这些新加入的服务器上,轻松应对流量增长。
  • 简化维护:
    • 你需要更新后端应用版本或进行服务器维护时,可以先将某台服务器从 Nginx 的负载均衡池中平滑移除(或标记为 down),Nginx 不再向其发送新请求。等现有请求处理完毕后,你就可以安全地对其进行操作,完成后再加回池中。整个过程对用户是透明的,服务不中断。

3. 如何配置 Nginx 负载均衡?

配置 Nginx 负载均衡主要涉及两个部分:upstream 块和修改 location 块中的 proxy_pass

步骤:

  1. 准备多个后端实例: 首先,你需要确保你的后端服务(FastAPI 应用)有多个正在运行的实例。这些实例可以:

    • 同一台服务器的不同端口上运行(例如:127.0.0.1:8080, 127.0.0.1:8081, 127.0.0.1:8082)。
    • 不同的服务器上运行(例如:192.168.1.10:8080, 192.168.1.11:8080)。
  2. 定义 upstream 块:

    • 在 Nginx 配置文件 (nginx.conf 或相关的虚拟主机配置文件) 的 http 上下文内(通常在 server之前),定义一个 upstream 块。这个块用来列出所有提供相同服务的后端服务器。
    • 给这个 upstream 块起一个名字,比如 my_backend_serversapi_cluster
    http {# ... 其他 http 配置 ...# 定义后端 API 服务器集群upstream backend_api_servers {# Nginx 会轮流将请求发往这些服务器 (默认 Round Robin 策略)server 120.78.7.226:8080;       # 你的第一个 FastAPI 实例# 假设你在同一台机器的 8081 端口启动了第二个实例server 120.78.7.226:8081;# 如果有第三个实例...# server 120.78.7.226:8082;# 如果实例在其他机器上...# server backend_server_ip_2:8080;}server {listen 80;server_name 120.78.7.226 _;root /www/wwwroot/dist;index index.html index.htm;# ... 其他 server 配置 ...# API 请求的 location 块location /api/ {# 将 proxy_pass 指向 upstream 块的名称proxy_pass http://backend_api_servers/; # 注意这里的名称和 upstream 块一致,末尾斜杠用于去除 /api/ 前缀# 其他代理设置保持不变或按需添加proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;proxy_connect_timeout 60s;proxy_send_timeout 60s;proxy_read_timeout 60s;}# ... 其他 location 块 ...}
    }
    
  3. 修改 location 块的 proxy_pass:

    • 找到之前处理 API 请求的 location /api/ 块。
    • proxy_pass 指令的值,从指向单个后端服务器地址 (http://120.78.7.226:8080/) 修改为指向你刚刚定义的 upstream 块的名称 (http://backend_api_servers/)。 注意: 这里的 http:// 不能省略,并且如果你想让 Nginx 去掉 /api/ 前缀,目标 upstream 名称后面仍然需要加上斜杠 /
  4. 选择负载均衡策略 (可选):

    • Nginx 默认使用轮询 (Round Robin) 策略:按顺序将请求依次分配给后端服务器。
    • 你可以在 upstream 块中指定其他策略:
      • least_conn;: 将请求分配给当前活动连接数最少的服务器。适合处理耗时不同的请求。
      • ip_hash;: 根据客户端的 IP 地址进行哈希计算,确保来自同一客户端的请求总是被发送到同一台后端服务器。这对于需要保持会话状态(Session)但又没有使用共享 Session 机制的应用很有用。但可能导致负载不均。
      • hash $request_uri consistent; (需要 Nginx 1.7.2+): 基于某个 key (如请求 URI) 进行哈希,consistent 参数保证后端服务器增减时,只有少量 key 的映射会改变。
    upstream backend_api_servers {least_conn; # 使用最少连接策略server 120.78.7.226:8080;server 120.78.7.226:8081;
    }
    
  5. 配置健康检查 (可选但推荐):

    • 为了让 Nginx 能够自动剔除故障服务器,可以在 server 指令后面添加参数:
      • max_fails=number: 在 fail_timeout 时间内,尝试连接后端服务器失败多少次后,就认为该服务器宕机。默认为 1。
      • fail_timeout=time: 服务器被标记为宕机后,多长时间内 Nginx 不会再尝试向其发送请求。同时也是 max_fails 的统计时间窗口。默认 10 秒。
    • Nginx 开源版本只提供被动的健康检查(即请求失败时才发现)。Nginx Plus(商业版)或使用第三方模块可以实现主动健康检查(定期发送探测请求)。
    upstream backend_api_servers {server 120.78.7.226:8080 max_fails=3 fail_timeout=30s; # 30秒内失败3次则标记为宕机30秒server 120.78.7.226:8081 max_fails=3 fail_timeout=30s;
    }
    
  6. 测试并重载配置:

    • 修改完配置后,务必先用 nginx -t 测试语法是否正确。
    • 如果测试通过,使用 nginx -s reload (或在宝塔面板点击重载/重启) 使新配置生效。

现在,Nginx 就会根据你选择的策略,将所有发往 /api/ 的请求分发给你在 upstream 块中定义的多个后端 FastAPI 实例了。

总结:

负载均衡是 Nginx 作为反向代理核心能力的重要延伸。通过简单的 upstreamproxy_pass 配置,你就能为你的应用带来高可用、高性能和高可伸缩性,是现代 Web 服务架构中不可或缺的一环。

如果你打算在生产环境中正式部署,强烈建议考虑使用负载均衡。即使初期只有少量用户,它也能为你未来的扩展和维护提供极大的便利。

相关文章

  • Nginx 反向代理,啥是“反向代理“啊,为啥叫“反向“代理?而不叫“正向”代理?它能干哈?-CSDN博客

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

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

相关文章

前端如何优雅地对接后端

作为一名前端开发者,与后端对接是我们日常工作中不可避免的一部分。从API设计的理解到错误处理的优雅实现,前端需要的不只是调用接口的代码,更是一种协作的艺术。本文将从Vue 3项目出发,分享如何与后端高效协作,减少联…

PYTHON用几何布朗运动模型和蒙特卡罗MONTE CARLO随机过程模拟股票价格可视化分析耐克NKE股价时间序列数据

原文链接:http://tecdat.cn/?p27099 金融资产/证券已使用多种技术进行建模。该项目的主要目标是使用几何布朗运动模型和蒙特卡罗模拟来模拟股票价格。该模型基于受乘性噪声影响的随机(与确定性相反)变量(点击文末“阅读原文”获取…

头歌之动手学人工智能-机器学习 --- PCA

目录 第1关:维数灾难与降维 第2关:PCA算法流程 任务描述 编程要求 测试说明 第3关:sklearn中的PCA 任务描述 编程要求 测试说明 第1关:维数灾难与降维 第2关:PCA算法流程 任务描述 本关任务:补充…

IOMUXC_SetPinMux的0,1参数解释

IOMUXC_SetPinMux(IOMUXC_ENET1_RX_DATA0_FLEXCAN1_TX, 0); 这里的第二个参数 0 实际上传递给了 inputOnfield,它控制的是 SION(Software Input On)位。 当 inputOnfield 为 0 时,SION 关闭,此时引脚的输入/输出方向由…

express响应设置 以及redirect,download,json.sendFdile

Express 中常用响应方法 的整理,包括设置响应头、重定向、下载、发送 JSON、发送文件等👇 📤 一、设置响应头与状态码 设置状态码 res.status(404).send(Not Found);设置响应头 res.set(Content-Type, text/plain); // 设置内容类型 res.s…

深度学习-数值稳定性和模型初始化

到目前为止,我们实现的每个模型都是根据某个预先制定的分布来初始化模型的参数,有人会认为初始化方案时理所当然的,忽略了如何做出这些选择的细节,甚至有人可能会觉得,初始化方案的选择并不是特别重要,实际…

SFINAE(Substitution Failure Is Not An Error)

C 中的 SFINAE(替换失败并非错误) SFINAE(Substitution Failure Is Not An Error)是 C 模板元编程的核心机制之一,允许在编译时根据类型特性选择不同的模板实现。以下通过代码示例和底层原理,逐步解析 SFI…

【Python笔记 04】输入函数、转义字符

一、Input 输入函数 prompt是提示,会在控制台显示,用作提示函数。 name input("请输入您的姓名:") print (name)提示你输入任意信息: 输入input test后回车,他输出input test 二、常用的转义字符 只讲…

什么是量子计算?它能做什么?

抛一枚硬币。要么正面朝上,要么反面朝上,对吧?当然,那是在我们看到硬币落地的结果之后。但当硬币还在空中旋转时,它既不是正面也不是反面,而是正面和反面都有一定的可能性。 这个灰色地带就是量子计算的简…

入门 Go 语言

本专栏的 Go 语言学习参考了B站UP 软件工艺师的视频 本节需要: Go 语言环境VSCode 安装环境 下载 Go 环境,并安装下载 VSCode,安装。在 VSCode 中安装 Go 扩展: 接下来就可以编写 Go 语言了 第一条 Go Go 语言是一种编译型…

Oracle EBS R12.2 汉化

一、前言 在使用oracle ebs时,使用中文会更好的理解整个ebs流程,以下介绍oracle r12中文补丁的方式 如果你的系统除了支持英语外,还支持其他语言,比如中文,那你在下载补丁的时候除了下载Generic Platform版本外&#…

参考文献新国标GB/T 7714-2025的 biblatex 实现

参考文献新国标GB/T 7714-2025的biblatex实现 新版 GB/T 7714 目前正在修订和征求意见(https://std.samr.gov.cn/gb/search/gbDetailed?id14CA9D282EB75AC8E06397BE0A0AEA2E)。 根据已经呈现的草案,初步实现了biblatex样式(详见biblatex-gb…

Discuz!与DeepSeek的深度融合:打造智能网址导航新标杆

引言 在数字化信息爆炸的时代,网址导航网站作为用户获取优质资源、高效浏览互联网的重要入口,其信息筛选能力、用户体验和商业化潜力成为了决定其竞争力的核心要素。Discuz!作为国内应用广泛的社区论坛系统,以其强大的功能扩展性和用户管理能…

Linux424 chage密码信息 gpasswd 附属组

https://chat.deepseek.com/a/chat/s/e55a5e85-de97-450d-a19e-2c48f6669234

【低配置电脑预训练minimind的实践】

低配置电脑预训练minimind的实践 概要 minimind是一个轻量级的LLM大语言模型,项目的初衷是拉低LLM的学习门槛,让每个人都能从理解每一行代码开始, 从零开始亲手训练一个极小的语言模型。对于很多初学者而言,电脑配置仅能够满足日…

docker部署Ollama并简单调用模型

Ollama简介 Ollama 是一个开源的大型语言模型(LLM)平台,旨在让用户能够轻松地在本地运行、管理和与大型语言模型进行交互。 Ollama 提供了一个简单的方式来加载和使用各种预训练的语言模型,支持文本生成、翻译、代码编写、问答等…

Redis安装及入门应用

应用资料:https://download.csdn.net/download/ly1h1/90685065 1.获取文件,并在该文件下执行cmd 2.输入redis-server-lucifer.exe redis.windows.conf,即可运行redis 3.安装redis客户端软件 4.安装后运行客户端软件,输入链接地址…

《重塑AI应用架构》系列: Serverless与MCP融合创新,构建AI应用全新智能中枢

在人工智能飞速发展的今天,数据孤岛和工具碎片化问题一直是阻碍AI应用高效发展的两大难题。由于缺乏统一的标准,AI应用难以无缝地获取和充分利用数据价值。 为了解决这些问题,2024年AI领域提出了MCP(Model Context Protocol模型上…

从入门到精通【MySQL】视图与用户权限管理

文章目录 📕1. 视图✏️1.1 视图的基本概念✏️1.2 试图的基本操作🔖1.2.1 创建视图🔖1.2.2 使用视图🔖1.2.3 修改数据🔖1.2.4 删除视图 ✏️1.3 视图的优点 📕2. 用户与权限管理✏️2.1 用户🔖…

输入捕获模式测频率

前提工作: PA6、PA0通过跳线相连,PA6测试PA0的输出频率 本来只有下列函数,改变占空比 但是我们需要测试频率,需要动态改变频率。 void PWM_SetCompare1(uint16_t Compare) {TIM_SetCompare1(TIM2, Compare); //设置CCR1的值 }…