Skip to content

负载均衡

Nginx 的负载均衡

Nginx 是一个非常高效的反向代理服务器,支持多种负载均衡策略,能够将请求分发到多个后端服务器(服务器集群),提高服务的可用性、处理能力和扩展性。负载均衡使得系统可以横向扩展,通过增加后端服务器的数量来应对更大的并发量。

Nginx 的负载均衡分发请求到多个后端服务器,常用于 Web 服务器集群、API 服务集群等场景。

Nginx 支持的负载均衡策略

Nginx 提供了多种负载均衡策略,适用于不同的应用场景:

轮询(Round Robin)

  • 默认策略,按照顺序依次将请求分发给后端服务器。
  • 简单易用,适用于大多数场景。
nginx
upstream backend {
    server 192.168.0.101:8080;
    server 192.168.0.102:8080;
}

权重轮询(Weighted Round Robin)

  • 允许为后端服务器设置不同的权重,权重越高,服务器接收到的请求越多。
  • 适合后端服务器性能不一致的场景。
nginx
upstream backend {
    server 192.168.0.101:8080 weight=3;  # 权重为3
    server 192.168.0.102:8080 weight=1;  # 权重为1
}

最少连接数(Least Connections)

  • 将请求分发给当前活动连接数最少的后端服务器。
  • 适合服务器处理时间不一致或负载波动较大的情况。
nginx
upstream backend {
    least_conn;  # 启用最少连接数策略
    server 192.168.0.101:8080;
    server 192.168.0.102:8080;
}

IP 哈希(IP Hash)

  • 将相同 IP 地址的客户端请求分配到同一个后端服务器,适合需要保持会话一致性的场景(如登录状态、购物车等)。
nginx
upstream backend {
    ip_hash;  # 启用 IP 哈希
    server 192.168.0.101:8080;
    server 192.168.0.102:8080;
}

公平负载均衡(Fair Load Balancing)(需要第三方模块)

  • 根据后端服务器的响应时间,将请求分发给响应速度最快的服务器。
  • Nginx 开源版不支持该功能,但可以通过第三方模块实现。

如何实现服务器集群和负载均衡

实现服务器集群和负载均衡的步骤如下:

定义后端服务器集群

在 Nginx 配置文件中,使用 upstream 指令定义后端服务器集群。每个服务器都指定 IP 地址或域名,Nginx 将根据设置的负载均衡策略分发请求。

nginx
http {
    upstream backend_servers {
        server 192.168.0.101:8080;
        server 192.168.0.102:8080;
        server 192.168.0.103:8080;
    }

    server {
        listen 80;
        server_name example.com;

        location / {
            proxy_pass http://backend_servers;  # 将请求转发到后端服务器集群
            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;
        }
    }
}
  • upstream backend_servers:定义一个名为 backend_servers 的服务器集群,包含三个后端服务器。
  • proxy_pass http://backend_servers;:将所有请求转发到服务器集群,实现负载均衡。

测试配置并重启 Nginx

  1. 检查 Nginx 配置是否正确:

    bash
    sudo nginx -t
  2. 重启 Nginx 使配置生效:

    bash
    sudo systemctl restart nginx

健康检查和服务器故障处理

负载均衡中的一个重要方面是健康检查。Nginx 需要定期检查后端服务器是否健康(可用),如果某个服务器出现故障,Nginx 会自动跳过该服务器,将流量分发给其他可用服务器。

基础的被动健康检查

Nginx 开源版支持被动健康检查,即当 Nginx 检测到某个后端服务器返回 502、503、504 错误时,会自动将其标记为不可用,并停止将请求转发给该服务器。你可以通过 max_failsfail_timeout 参数来配置这一机制。

nginx
upstream backend_servers {
    server 192.168.0.101:8080 max_fails=3 fail_timeout=30s;
    server 192.168.0.102:8080;
}
  • max_fails=3:如果服务器连续失败 3 次,标记为不可用。
  • fail_timeout=30s:服务器在 30 秒内如果失败超过 max_fails 次,将被移除,30 秒后重新尝试连接。

主动健康检查(Nginx Plus)

Nginx 开源版不提供主动健康检查功能,Nginx Plus 支持主动健康检查功能,即定期向后端服务器发送健康检查请求(如 HTTP 请求),确认服务器的状态。如果某个服务器健康检查失败,Nginx Plus 会自动将其移除出负载均衡池,直到服务器恢复正常。

主动健康检查配置(Nginx Plus 示例)

nginx
upstream backend_servers {
    server 192.168.0.101:8080;
    server 192.168.0.102:8080;

    # 主动健康检查配置
    health_check interval=5s fails=2 passes=2;
}
  • interval=5s:每 5 秒进行一次健康检查。
  • fails=2:如果服务器连续失败 2 次,标记为不可用。
  • passes=2:如果服务器连续成功 2 次,标记为可用。

自定义错误页面和故障处理

为了提升用户体验,当某个服务器发生故障时,可以配置自定义的错误页面,或将用户重定向到备用的服务器。

nginx
server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://backend_servers;
        error_page 502 503 504 /custom_50x.html;  # 自定义错误页面
    }

    location = /custom_50x.html {
        root /usr/share/nginx/html;
    }
}
  • error_page 502 503 504:当后端服务器返回 502、503 或 504 错误时,使用 /custom_50x.html 页面。

总结

  • 负载均衡策略:Nginx 支持多种负载均衡策略,包括轮询、权重轮询、最少连接数、IP 哈希等,满足不同应用场景的需求。
  • 服务器集群:通过 upstream 指令定义后端服务器集群,并结合 proxy_pass 实现负载均衡。
  • 健康检查:Nginx 开源版支持被动健康检查,Nginx Plus 支持主动健康检查,可以自动检测后端服务器的健康状态并移除不可用的服务器,保障系统的稳定性。
  • 故障处理:通过自定义错误页面和备用服务器配置,提升系统的容错性和用户体验。
编程洪同学服务平台是一个广泛收集编程相关内容和资源,旨在满足编程爱好者和专业开发人员的需求的网站。无论您是初学者还是经验丰富的开发者,都可以在这里找到有用的信息和资料,我们将助您提升编程技能和知识。
专业开发
高端定制
售后无忧
站内资源均为本站制作或收集于互联网等平台,如有侵权,请第一时间联系本站,敬请谅解!本站资源仅限于学习与参考,严禁用于各种非法活动,否则后果自行负责,本站概不承担!