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. 日志文件: 配置访问日志和错误日志的存储路径及日志级别。
相关推荐
檀越剑指大厂12 分钟前
【Python系列】Python中的`any`函数:检查“至少有一个”条件满足
开发语言·python
I_Am_Me_1 小时前
【JavaEE初阶】线程安全问题
开发语言·python
运维&陈同学1 小时前
【Elasticsearch05】企业级日志分析系统ELK之集群工作原理
运维·开发语言·后端·python·elasticsearch·自动化·jenkins·哈希算法
ZHOUPUYU2 小时前
最新 neo4j 5.26版本下载安装配置步骤【附安装包】
java·后端·jdk·nosql·数据库开发·neo4j·图形数据库
Q_19284999063 小时前
基于Spring Boot的找律师系统
java·spring boot·后端
ZVAyIVqt0UFji4 小时前
go-zero负载均衡实现原理
运维·开发语言·后端·golang·负载均衡
谢家小布柔4 小时前
Git图形界面以及idea中集合Git使用
java·git
smileSunshineMan4 小时前
vertx idea快速使用
java·ide·intellij-idea·vertx
阿乾之铭4 小时前
IntelliJ IDEA中的语言级别版本与目标字节码版本配置
java·ide·intellij-idea