【翻译】Nginx的HTTP负载均衡

将请求负载均衡到多个应用实例是一个常用的技术,它起到优化资源使用率、最大化吞吐量、降低延迟、保证容错性。

Nginx是一个非常有效的HTTP负载均衡工具,它将请求分发到多个应用服务器,从而提升Web应用的性能、扩展性、可靠性。

负载均衡策略

Nginx支持以下负载均衡机制:

  • 循环:请求循环地分发到多个应用实例
  • 最少连接:下一个请求分发到最少有效连接的应用实例
  • IP哈希:对用户的IP作哈希计算,哈希结果用于决定将此请求分发到哪个应用实例

默认负载均衡配置

最简单的负载均衡配置如下:

http {
    upstream myapp1 {
        server srv1.example.com;
        server srv2.example.com;
        server srv3.example.com;
    }

    server {
        listen 80;

        location / {
            proxy_pass http://myapp1;
        }
    }
}

如上例所示,同样的应用有3个实例分别运行在服务器srv1到srv3中。当没有指定负载均衡方法,默认是循环。全部请求被代理到服务组myapp1,nginx用负载均衡去分发请求。

Nginx的反向代理实现包括给HTTP、HTTPS、FastCGI、uwsgi、SCGI和memcached。

为HTTPS配置负载均衡,只需用https即可。

当为FastCGI、uwsgi、SCGI、memcached配置负载均衡,分别使用fastcgi_pass、uwsgi_pass、scgi_pass、memcached_pass即可。

最少连接机制

另一个负载均衡机制是最少连接。在一些请求需耗时较长的场景下,最少连接允许更公平地调控应用实例的负载。

当使用最少连接机制,nginx会通过将新请求分发给不忙的应用实例,使繁忙的应用实例不超载。

当在服务组中使用least_conn指令,nginx会激活最少连接机制。

upstream myapp1 {
        least_conn;
        server srv1.example.com;
        server srv2.example.com;
        server srv3.example.com;
    }

粘性会话机制

我们需注意一点,对于循环、最少连接机制,每个客户端的请求可能被分到在不同的服务器,不保证同一客户端的请求会被分发到同一台服务器中。

如果需要绑定一个客户端的请求总被分发到同一个服务器,可以使用IP哈希机制。

在IP哈希机制中,用客户端的IP计算哈希结果,此结果用于决定应该将请求分发到服务组的哪个服务器。此机制保证了来自同一客户端的请求会被分发到同一服务器,除非那服务器是不可用的。

配置IP哈希机制,只需在服务组中使用ip_hash指令。

upstream myapp1 {
    ip_hash;
    server srv1.example.com;
    server srv2.example.com;
    server srv3.example.com;
}

权重机制

我们可以通过配置服务器的权重,去影响nginx负载均衡的算法。

在上面的例子中,没有配置服务器的权重,在指定的负载均衡机制中意味着全部服务器均被视为相同权重的。

尤其在循环机制,它意味着将请求平均地分发到不同的服务器中。

当给服务器指定了权重,权重会被负载均衡机制纳入计算因素之一。

upstream myapp1 {
        server srv1.example.com weight=3;
        server srv2.example.com;
        server srv3.example.com;
    }

在这个配置中,每5个新请求分发到应用实例的请求如下:3个请求会被分发到srv1,一个请求到srv2,一个请求到srv3。

最新版本的nginx,同样也可以使用权限到最少连接机制和IP哈希机制中。

健康检查

Nginx的反向代理实现包括服务器的健康检查。如果一个服务器返回的响应是错误的,nginx会标记此服务器是不可用的,并且会避免将接下来一段时间的请求分发到此服务器。

用max_fails参数设置跟服务器通信的连续失败的次数。max_fails默认为1,当设置为0时,健康检查对此服务器不可用。fail_timeout参数定义服务器会被标记为不可用多长时间。在fail_timeout期间后,nginx会用客户端的请求优雅地试探服务器,如果探针表示成功,服务器会被标记为成功的。

更多阅读

此外,有很多指令和参数用来控制服务器负载均衡,比如proxy_next_upstream、backup、down、keepalive。更多信息请查阅文档。

最后但不是最不重要的,服务组的application_load_balancing、application_health_checks、activity_monitoring、onthe-fly_reconfiguration是可用的。

下列文档详细描述nginx Plus负载均衡:略

Original: https://www.cnblogs.com/nick-huang/p/8577211.html
Author: nick_huang
Title: 【翻译】Nginx的HTTP负载均衡

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/543057/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Java开发学习(十二)—-基于注解开发依赖注入

    Spring为了使用注解简化开发,并没有提供 构造函数注&#x…

    Java 2023年5月29日
    079
  • ucore操作系统学习(一) ucore lab1系统启动流程分析

    一、ucore操作系统介绍 操作系统作为一个基础系统软件,对下控制硬件(cpu、内存、磁盘网卡等外设),屏蔽了底层复杂多样的硬件差异;对上则提供封装良好的应用程序接口,简化应用程序…

    Java 2023年6月8日
    097
  • 设计模式学习笔记(十七)中介者模式及其应用场景

    中介者(Mediator)模式指定义了一个单独的中介对象,来封装一组对象之间的交互。即将这组对象之间的交互委派给中介对象,从而来避免对象之间的直接交互。比如我们各种设备之间的通信,…

    Java 2023年6月6日
    090
  • 单链表插入删除完整版

    #include #include using namespace std; //c++中默认的格式,在iomanip 这个头文件中,io 表示输出,manip 是manipula…

    Java 2023年6月5日
    068
  • 整理在Spring IOC容器初始化后可以处理特定逻辑的多种实现方式

    Spring框架的核心是依赖注入、切面;Spring Boot是在Spring框架的基础上为其提供许多默认配置、默认约定(约定优于配置),从而达到减少或减化配置进而可开箱即用、快速…

    Java 2023年6月9日
    066
  • Springboot整合RocketMQ简单使用

    简单研究下Springboot 整合RocketMQ。 使用的是Apache的rocketmq-spring-boot-starter 1. 初始化项目 pom 文件

    Java 2023年5月30日
    0105
  • 非自交任意多边形与矩形框的交集面积计算方法

    非自交任意多边形与矩形框的交集面积计算方法 1、应用背景 在对象识别的AI计算时,有时需要限定检测区域,即目标对象落在限定区域内有效,在区域外忽略。转换为数学模型为:目标检测框与限…

    Java 2023年6月14日
    076
  • 【每天学一点-03】 使用Html5+Less实现简单的静态登录界面(入门Less)

    1、首先引用Less 有npm安装、cdn引用、或者下载Less.js本地引用,我采用的是第三种方法 less.js引用: 下载地址:https://github.com/less…

    Java 2023年6月5日
    093
  • Git 代码提交和下载

    1、新建一个目录,存放下载下来的项目; 2、进入刚刚新建的文件夹,点击鼠标右键,选择”Git Bash Here” 3、进行基础配置,作为 Git 的基础配…

    Java 2023年6月5日
    073
  • 设计模式介绍和单一职责原则

    设计模式的目的 编写软件过程中,程序员面临着来自 耦合性,内聚性以及可维护性,可扩展性,重用性,灵活性 等多方面的 挑战,设计模式是为了让程序(软件),具有更好 代码重用性 (即:…

    Java 2023年6月15日
    076
  • 关于Java中的继承和组合的一个错误使用的例子

    相信绝大多数人都比较熟悉Java中的「继承」和「组合」这两个东西,本篇文章就主要就这两个话题谈论一下。如果我某些地方写的不对,或者比较幼稚,论证不清晰,欢迎大家留言指正。 什么是「…

    Java 2023年5月29日
    086
  • PoweJob高级特性-MapReduce完整示例

    由于网上搜索 PowerJob MapReduce 都是设计原理,demo也展示个空壳子,没有演示Map到Reduce结果怎么传递,对于没有MR开发经验的人来说并没有什么帮助,所以…

    Java 2023年6月6日
    085
  • MyBatis数据输入,总体机制的概括

    My Batis数据输入 1 .1 M ybatis 总体机制概括 1.2 概念说明 注意:这里的简单类型不是指的基本数据类型。 1.3 单个简单类型参数 1.3 . 1 M ap…

    Java 2023年6月16日
    081
  • Spring Boot2配置Swagger2生成API接口文档

    一、Swagger2介绍 前后端分离开发模式中,api文档是最好的沟通方式。Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服…

    Java 2023年6月15日
    071
  • java中的一维数组

    数组(array):是一种用于存储多个相同数据类型的存储模型(可以理解为容器) 数组定义和静态初始化 数组的两种定义格式: 格式1: 数据类型[] 变量名; 范例: int[] a…

    Java 2023年6月15日
    094
  • 数组

    学习笔记——Java基础 数组 解决 : 将数据进行 存储 —-》引入∶数组 数组的作用 : 数组用来存储数据的,在程序设计中,为了处理方便,数组用来将相同类型的若干数…

    Java 2023年6月5日
    056
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球