nginx配置负载均衡详解

在现代的 web 应用中,负载均衡是确保高可用性、可扩展性和稳定性的关键技术之一。Nginx 是一个非常流行的反向代理服务器和负载均衡器,它支持多种负载均衡策略,能够帮助将客户端的请求分发到多个后端服务器,以提高系统的整体性能和可靠性。

dokcer 镜像下载:Nginx1.27.1.tar

1. Nginx 负载均衡基本概念

负载均衡(Load Balancing)指的是通过分配客户端请求到多个服务器(也称为后端服务器或上游服务器),从而平衡各个服务器的负载。Nginx 支持以下几种负载均衡方法:

  • 轮询(Round Robin):请求按顺序分发到所有后端服务器。
  • 最少连接(Least Connections):请求分发到当前连接数最少的服务器。
  • IP 哈希(IP Hash):根据客户端 IP 地址的 hash 值决定将请求发送到哪台服务器。

2. 配置 Nginx 负载均衡

2.1 基本负载均衡配置

在 Nginx 中配置负载均衡,通常需要配置一个 upstream 块来定义一组后端服务器,并在 server 块中将请求转发到这些服务器。

步骤 1: 修改 nginx.conf 文件来配置负载均衡。

http {
    upstream backend {
        # 服务器地址和端口
        server backend1.example.com;
        server backend2.example.com;
        server backend3.example.com;

        # 负载均衡策略
        # default is round robin (轮询)
        # server backend4.example.com;
    }

    server {
        listen 80;

        location / {
            proxy_pass http://backend;  # 将请求转发到 upstream 后端服务器
            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;
        }
    }
}
2.2 负载均衡策略
轮询(Round Robin)

这是默认的负载均衡方式,Nginx 会将请求按顺序轮流分发到每个后端服务器。

upstream backend {
    server backend1.example.com;
    server backend2.example.com;
    server backend3.example.com;
}
最少连接(Least Connections)

使用最少连接策略时,Nginx 会将请求转发给当前连接数最少的后端服务器,这在负载不均匀时特别有用。

upstream backend {
    least_conn;  # 使用最少连接策略
    server backend1.example.com;
    server backend2.example.com;
    server backend3.example.com;
}

IP 哈希(IP Hash)

通过使用 IP 哈希策略,Nginx 会根据客户端的 IP 地址来决定请求转发到哪台服务器。这可以确保同一客户端的请求始终转发到相同的服务器,从而避免会话问题。

 
upstream backend {
    ip_hash;  # 使用 IP 哈希
    server backend1.example.com;
    server backend2.example.com;
    server backend3.example.com;
}
2.3 设置权重

你可以为每个后端服务器设置不同的权重,这样就能控制请求的分发比例。例如,你可以给某台性能较强的服务器设置更高的权重,确保它处理更多的请求。

upstream backend {
    server backend1.example.com weight=3;  # 权重 3
    server backend2.example.com weight=2;  # 权重 2
    server backend3.example.com weight=1;  # 权重 1
}

在这个例子中,backend1.example.com 会处理 3 倍于 backend3.example.com 的请求。

2.4 健康检查

Nginx 通过 fail_timeoutmax_fails 配置来控制服务器的健康检查。当后端服务器在一定时间内失败的次数超过 max_fails 配置时,Nginx 会将其从负载均衡池中暂时移除,避免发送请求到故障的服务器。

upstream backend {
    server backend1.example.com max_fails=3 fail_timeout=30s;
    server backend2.example.com max_fails=3 fail_timeout=30s;
    server backend3.example.com max_fails=3 fail_timeout=30s;
}
  • max_fails:指定服务器在 fail_timeout 时间内允许的最大失败次数。
  • fail_timeout:指定服务器在多长时间内无法正常响应时被认为是失败的。
2.5 配置负载均衡的重定向(代理请求头)

通常我们会希望把客户端的 IP 地址、原始主机名等信息传递到后端服务器,避免请求丢失这些信息。Nginx 提供了多种方法来设置请求头,常见的做法是设置 X-Real-IPX-Forwarded-For

location / {
    proxy_pass http://backend;
    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;
}

3. 高级负载均衡配置

3.1 负载均衡与缓存

Nginx 可以与缓存机制结合使用,以提高负载均衡的效率。可以使用 proxy_cache 来缓存从后端服务器获取的响应,这有助于减轻后端的负担,提高处理请求的速度。

http {
    proxy_cache_path /tmp/cache keys_zone=my_cache:10m;

    upstream backend {
        server backend1.example.com;
        server backend2.example.com;
    }

    server {
        location / {
            proxy_cache my_cache;
            proxy_pass http://backend;
            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_cache 用来缓存来自后端服务器的响应。

3.2 使用 SSL 进行加密

如果后端服务需要加密通信,可以通过 SSL 配置进行保护。你可以在 Nginx 中为 upstream 配置 SSL。

upstream backend {
    server backend1.example.com:443 ssl;
    server backend2.example.com:443 ssl;
}

server {
    listen 443 ssl;
    server_name www.example.com;
    ssl_certificate /path/to/cert.pem;
    ssl_certificate_key /path/to/cert.key;

    location / {
        proxy_pass https://backend;
    }
}
3.3 动态添加后端服务器

在某些场景下,你可能希望能够动态地添加或删除后端服务器而不重启 Nginx。这可以通过 nginxnginx -s reload 命令来实现。动态更新可以配合监控和自动化脚本进行。

4. 总结

Nginx 配置负载均衡的基本步骤是:

  1. 使用 upstream 定义后端服务器集群。
  2. 配置负载均衡算法:轮询、最少连接或 IP 哈希。
  3. 配置健康检查机制,确保故障服务器不会接收到流量。
  4. 配置代理请求头,转发原始客户端信息到后端服务器。

负载均衡不仅能提高网站的可用性和扩展性,还能帮助减轻单台服务器的负载。在高可用性和高流量场景下,Nginx 是一个强大的负载均衡解决方案。

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

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

相关文章

公开一下我的「个人学习视频」!

哈喽,大家好,我是六哥。 鉴于上次分享,很多同学说,六哥能整一些百度网盘的资源吗? 可以,来安排,看看有你心动的吗? 性能测试系列 测开系列 python方向 Java方向 主管必会系列 质…

13.观察者模式设计思想

13.观察者模式设计思想 目录介绍 01.观察者模式基础 1.1 观察者模式由来1.2 观察者模式定义1.3 观察者模式场景1.4 观察者模式思考 02.观察者模式实现 2.1 罗列一个场景2.2 用例子理解观察者2.3 案例演变分析2.4 观察者模式基本实现 03.观察者模式分析 3.1 观察者模式案例3.2…

webpack指南

​🌈个人主页:前端青山 🔥系列专栏:webpack篇 🔖人终将被年少不可得之物困其一生 依旧青山,本期给大家带来webpack篇专栏内容:webpack-指南 概念 中文: webpack | webpack中文文档 | webpack中文网 英文&…

CSS高级技巧_精灵图_字体图标_CSS三角_vertical-align(图像和文字居中在同一行)_溢出文字省略号显示

目录 CSS高级技巧 1. 精灵图 1.1 为什么需要精灵图 1.2 精灵图(sprites)的使用 1.2 精灵图的使用 案例:拼出自己名字 2. 字体图标 2.1 字体图标的产生 2.2 字体图标的优点 2.3 字体图标的下载 2.4 字体图标的引入 2.4.1 字体文件格…

仪表板展示|DataEase看中国:历年双十一电商销售数据分析

背景介绍 2024年“双十一”购物季正在火热进行中。自2009年首次推出至今,“双十一”已经成为中国乃至全球最大的购物狂欢节,并且延伸到了全球范围内的电子商务平台。随着人们消费水平的提升以及电子商务的普及,线上销售模式也逐渐呈现多元化…

若依项目-结构解读

项目结构 admin模块 common模块 framework模块 service模块 配置 依赖关系 前端接口 src 表结构

RTSP前端实时流

因项目需求探索前端实时流,本文介绍了 RTSP 前端不能直接播放,需中间层转换协议,如 RTSP 转 RTMP、HLS、HTTP-FLV,分别阐述其特点、配置和播放方式,还提及关键帧、延迟与卡顿的关系,以及直播平台使用云服务…

植物大战僵尸杂交版v2.6.1最新版本(附下载链接)

B站游戏作者潜艇伟伟迷于11月3日更新了植物大战僵尸杂交版2.6.1版本!!!,有b站账户的记得要给作者三连关注一下呀! 不多废话下载链接放上: 夸克网盘链接:https://pan.quark.cn/s/279e7ed9f878 新…

qsqlmysql.lib的编译和使用

文章目录 打开源码 打开源码 打开qt源码安装路径 src相对路径下的文件Src\qtbase\src\plugins\sqldrivers\mysql 比如我是5.9.9版本我的路径就是:D:\Qt5.9.9\5.9.9\Src\qtbase\src\plugins\sqldrivers\mysql 可以看到待编译的mysql驱动文件 使用IDE打开pro文件进…

Window下PHP安装最新sg11(php5.3-php8.3)

链接: https://pan.baidu.com/s/10yyqTJdwH_oQJnQtWcwIeA 提取码: qz8y 复制这段内容后打开百度网盘手机App,操作更方便哦 (链接失效联系L88467872) 1.下载后解压文件,将对应版本的ixed.xx.win文件放进php对应的ext目录下,如图所示 2.修改ph…

30.超市管理系统(基于springboot和Vue的Java项目)

目录 1.系统的受众说明 2.相关技术和开发环境 2.1 相关技术 2.1.1 Java语言 2.1.2 HTML、CSS、JavaScript 2.1.3 MySQL 2.1.4 Vue.js 2.1.5 SpringBoot 2.2 开发环境 3. 系统分析 3.1 可行性分析 3.1.1 经济可行性 3.1.2 技术可行性 3.1.3 运行可行性 3.2…

去地面算法——depth_clustering算法调试(1)

1 源码下载 论文: 《2016-Fast Range Image-Based Segmentation of Sparse 3D Laser Scans for Online Operation》 《2017-Efficient Online Segmentation for Sparse 3D Laser Scans》 代码:git链接 2 问题记录 2.1 无法找到qt问题 问题截图&…

pyspark入门基础详细讲解

1.前言介绍 学习目标:了解什么是Speak、PySpark,了解为什么学习PySpark,了解课程是如何和大数据开发方向进行衔接 使用pyspark库所写出来的代码,既可以在电脑上简单运行,进行数据分析处理,又可以把代码无缝…

Qt 编写插件plugin,支持接口定义信号

https://blog.csdn.net/u014213012/article/details/122434193?spm1001.2014.3001.5506 本教程基于该链接的内容进行升级,在编写插件的基础上,支持接口类定义信号。 环境:Qt5.12.12 MSVC2017 一、创建项目 新建一个子项目便于程序管理【…

【python】python使用虚拟环境

使用虚拟环境的好处是创建一个独立干净的环境 首先cd到新项目的目录下 创建虚拟环境 使用日期命名方便自己找到版本 python -m venv venv20241114激活虚拟环境 .\venv20241114\Scripts\activate会创建一个文件夹 点进去可以看到是python的脚本所存文件结构 纯净环境 p…

CSS 技巧:如何让 div 完美填充 td 高度

引言 一天哈比比突然冒出一个毫无理头的一个问题: 本文就该问题进行展开… 原文链接: 昆仑虚F2E 一、需求说明 大致需求如下, 当然这里做了些简化 有如下初始代码: 一个自适应的表格每个单元格的宽度固定 200px每个单元格高度则是自适应每个单元格内是一个 div 标签, div 标签…

跟上AI的浪潮

现在AI技术已广泛应用至语音助手、写作、绘图、视频,甚至是各种语言的代码编写。平常我们都是应用别人开发好的模型,或者说智能体,那么我们自己能否做那个开发AI智能体的人,近期加了一个AI学习的大社区,几万在AI道路上…

专题十八_动态规划_斐波那契数列模型_路径问题_算法专题详细总结

目录 动态规划 动态规范五步走: 1. 第 N 个泰波那契数(easy) 解析: 1.状态表达式: 2.状态转移方程: 3.初始化: 4.填表顺序: 5.返回值 编写代码: 总结&#xff…

MySQL技巧之跨服务器数据查询:基础篇-更新语句如何写

MySQL技巧之跨服务器数据查询:基础篇-更新语句如何写 上一篇已经描述:借用微软的SQL Server ODBC 即可实现MySQL跨服务器间的数据查询。 而且还介绍了如何获得一个在MS SQL Server 可以连接指定实例的MySQL数据库的连接名: MY_ODBC_MYSQL 以及用同样的…

C/C++语言 多项式加法和乘法

多项式加法和乘法 多项式的加法题目描述输入输出样例步骤代码段全局变量设定新建结点合并链表 完整代码 多项式乘法题目描述输入输出样例代码段计算两多项式结果输入 完整代码 多项式的加法 题目描述 输入输出 样例 步骤 总体思想是用链表来做 ① 我们发现输入样例中&#xf…