当前位置: 首页 > article >正文

Nginx - 负载均衡及其配置(Balance)

一、概述

  1. 定义:在多个计算机(计算机集群)、网络连接、CPU、磁盘驱动器或其他资源中分配负载
  2. 目标:最佳化资源使用、最大化吞吐率、最小化响应时间、避免过载
  3. 功能:使用多台服务器提供单一服务(服务器农场)
  4. ⭐ 工作流程
    1. 负载均衡器(server)监听 1~n 个外部端口(port)
    2. 客户端访问端口,向服务器(server)发起请求
    3. 负载均衡器根据负载均衡策略选择后端内网服务器(upstream)
    4. 负载均衡器将用户请求发送到选定的后端内网服务器(upstream)
    5. 内网服务器将请求的响应返回给负载均衡器(server)
    6. 负载均衡器再将响应发送到客户端
  5. 优点
    1. 安全性:向客户端隐藏内网结构,阻止了用户直接访问后台(内网)服务器,可以阻止对核心网络栈和运行在其它端口服务的攻击
    2. 可用性:当所有后台服务器出现故障时,负载均衡器转发请求到一个备用的负载均衡器、显示一条关于服务中断的消息等,提高容错能力

二、上游服务器组(upstream)

⭐ 调度算法

算法说明
轮询(默认)请求按时间顺序逐一分配到不同的后端服务器,Weight 指定轮询权值,Weight 值越大访问机率越高,用于后端服务器性能不均的情况
ip_hash按访问 IP 的 hash 结果将请求分配给服务器,来自同一个 IP 的访客固定访问一个后端服务器,解决动态网页的 session 共享问题
fair根据后端服务器的响应时间来分配请求,响应时间短的优先分配(必须下载 Nginx 的 upstream_fair 模块)
url_hash按访问 url 的 hash 结果将请求分配给服务器,每个 url 定向到同一个后端服务器,进一步提高后端缓存服务器的效率
least_conn将请求转发给当前连接数最少的后端服务器,能够有效地将请求分配给负载较轻的服务器
hash

状态参数

状态参数
down当前服务器废了,当前的 server 暂时不参与负载均衡
backup预留的备份机器,当所有非 backup 机器故障或者繁忙时,才会请求 backup 机器,因此这台机器的压力最轻
max_fails允许请求失败的次数,默认为 1,当超过最大次数时,返回 proxy_next_upstream 模块定义的错误
fail_timeout经历 max_fails 次失败后,暂停服务的时间

注意:负载调度算法为 ip_hash 时,后端服务器在负载均衡调度中的状态不能有 backup server,因为ip_hash不会基于可用性分配,仍会分给目标服务器

backup 服务器

  1. 功能:所有服务器都不能提供服务时,避免降低用户体验,配置 backup 服务器显示错误信息

  2. backup server 配置

    1. backup upstream 服务器错误时的备份服务器
    2. localhost:8080 upstream 服务器错误时访问的 IP 和端口号
    3. /data/www/errorpage/index.html:错误时显示的页面的地址
  3. 示例

    upstream webservers {
        server 192.168.18.201 weight=1 max_fails=2 fail_timeout=2;
        server 192.168.18.202 weight=1 max_fails=2 fail_timeout=2;
        server 127.0.0.1:8080 backup;
    }
    
    server {
        listen 8080;
        server_name localhost;
        root /data/www/errorpage;
        index index.html;
    }
    
    server {
    		...
    }
    

三、示例

  1. 功能

    1. 设置一个 backend 上游服务器组
    2. 设置一个 backup 备份服务器
  2. 代码实现

    # 定义一个名为 `backend` 的上游服务器组
    upstream backend {
    
        # 定义负载均衡算法,这里使用 `least_conn` 算法
        least_conn;
        
        # 定义上游服务器,并设置不同的状态参数
        server backend1.example.com weight=3 max_fails=2 fail_timeout=30s;
        server backend2.example.com weight=2 max_fails=3 fail_timeout=30s;
        server backend3.example.com weight=1 max_fails=2 fail_timeout=20s;
        
        # 定义一个备份服务器,当所有主服务器都不可用时,流量将转发到备份服务器
        server backup.example.com backup;
    
    }
    
    # 定义一个虚拟主机
    server {
        listen 80;
        server_name www.example.com;
    
        # 配置静态文件路径
        location / {
            root /data/www;
            index index.html;
        }
    
        # 配置负载均衡
        location /api/ {
            # 将所有 /api/ 开头的请求代理到 `backend` 上游服务器组
            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_connect_timeout 60s;
            proxy_send_timeout 60s;
            proxy_read_timeout 60s;
            proxy_buffering on;
            proxy_buffer_size 4k;
            proxy_buffers 4 32k;
            proxy_busy_buffers_size 64k;
            proxy_temp_file_write_size 64k;
        }
    
        # 配置错误页面处理
        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
            root /usr/share/nginx/html;
        }
    
        # 配置日志文件
        access_log /var/log/nginx/access.log;
        error_log /var/log/nginx/error.log warn;
    }
    
  3. 配置解析

    1. upstream backend
      • least_conn: 使用最少连接数算法,优先选择连接数最少的服务器来处理请求。
      • 服务器配置:
        • weight: 指定服务器的权重,权重越高,被选中的概率越大。
        • max_fails: 允许的最大失败尝试次数,超过这个次数后,服务器将被标记为不可用。
        • fail_timeout: 如果服务器达到 max_fails 限制,将在指定的时间段内被标记为不可用。
      • 备份服务器: 当所有主服务器都不可用时,请求将被转发到备份服务器 backup.example.com。
    2. server:
      • 监听端口: 配置监听在 80 端口。
      • 静态文件路径: 配置根目录为 /data/www,默认首页为 index.html。
      • 负载均衡配置: 将 /api/ 路径下的请求代理到 backend 上游服务器组。
      • 头部信息传递: proxy_set_header 指令用于传递客户端请求的头部信息到上游服务器。
      • 超时和缓冲设置: 配置请求超时时间和缓冲区大小,以优化代理请求的性能。
    3. 错误页面处理: 当发生 500、502、503 或 504 错误时,重定向到 /50x.html 错误页面。
    4. 日志文件: 配置访问日志和错误日志的存储路径及日志级别。


http://www.kler.cn/a/447804.html

相关文章:

  • 飞牛 fnos 使用docker部署 bili-sync:打造自动化 B 站资源下载器,与主流媒体服务器无缝衔接
  • CSS系列(30)-- 逻辑属性详解
  • 网络安全防范
  • 简洁IIC协议讲述
  • P1305 新二叉树
  • 【计算机网络2】计算机网络的性能能指标
  • SVM理论推导
  • NLP自然语言学习路径图
  • MAC地址和IP地址的区别
  • 【HarmonyOs学习日志(14)】计算机网络之域名系统DNS
  • 【Pandas】pandas Series size
  • mysql,数据库数据备份
  • [Unity Shader]【游戏开发】【图形渲染】 Shader数学基础5-方阵、单位矩阵和转置矩阵
  • 地址栏输入URL浏览器会发生什么?
  • 有关异步场景的 10 大 Spring Boot 面试问题
  • CentOS 7 安装、测试和部署FastDFS
  • 在 K8S 中创建 Pod 是如何使用到 GPU 的: nvidia device plugin 源码分析
  • 得物Java后端一面,扛住了!
  • 数据结构与算法学习笔记----Kruskal算法
  • Moretl非共享文件夹日志采集
  • 计算世界之安生:C++继承的文水和智慧(上)
  • 数据仓库工具箱—读书笔记02(Kimball维度建模技术概述03、维度表技术基础)
  • Cmd命令大全(万字详细版)
  • Python小游戏开发:从零实现贪吃蛇游戏
  • Django-路由
  • 计算机网络:应用层 —— 应用层概述