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

ops/2024/12/22 22:32:43/

一、概述

  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.ppmy.cn/ops/144146.html

相关文章

FPGA 16 ,Verilog中的位宽:深入理解与应用

目录 前言 一. 位宽的基本概念 二. 位宽的定义方法

node express服务器配置orm框架sequilize

搭建服务器直接读取数据库时&#xff0c;有些逻辑会比较麻烦&#xff0c;性能上也不是很好&#xff0c;选用orm框架式一个很好的选择&#xff0c;我这里使用expresssequilize 安装sequilize npm install --save sequelize 创建sequilize文件&#xff1a; const { Sequelize…

酒蒙子骰子小程序系统

酒蒙子流量变现小程序小游戏 后端tp8 前端uniapp 会员变现 分销推广 流量主 …

kratos源码分析:熔断器

文章目录 为什么需要熔断Google sre弹性熔断算法kratos Breaker源码分析公共接口sre实现上报请求结果判定是否熔断 为什么需要熔断 一般来说&#xff0c;当服务器过载&#xff08;overload&#xff09;时&#xff0c;需要给client返回服务过载的报错 但是拒接请求也有成本&…

《Vue 响应式数据原理》

一、引言 在 Vue.js 中&#xff0c;响应式数据是其核心特性之一。响应式数据使得当数据发生变化时&#xff0c;视图能够自动更新&#xff0c;从而提高了开发效率和用户体验。本文将深入探讨 Vue 响应式数据的原理&#xff0c;包括数据侦测、依赖收集和派发更新等方面。 二、Vue…

基于MNE的EEGNet 神经网络的脑电信号分类实战(附完整源码)

利用MNE中的EEG数据&#xff0c;进行EEGNet神经网络的脑电信号分类实现&#xff1a; 代码&#xff1a; 代码主要包括一下几个步骤&#xff1a; 1&#xff09;从MNE中加载脑电信号&#xff0c;并进行相应的预处理操作&#xff0c;得到训练集、验证集以及测试集&#xff0c;每个…

深入探讨C++标准输入输出流:iostream

C标准库中的输入输出流(iostream)是处理数据输入和输出的核心部分&#xff0c;提供了灵活且高效的方式来读写各种数据类型。通过理解和运用iostream&#xff0c;开发者可以实现丰富的输入输出功能&#xff0c;从而增强程序的交互性和用户体验。本文将深入探讨C的标准输入输出流…

STM32 水质水位检测项目 显示模块

Driver层 FSMC&#xff08;之前代码&#xff09; Interface层 LCD&#xff08;之前代码&#xff09; App层 Display&#xff08;显示模块&#xff09; display.h #ifndef __DISPLAY_H__ #define __DISPLAY_H__#include "lcd.h"//初始化 void Display_Init(voi…