菜鸟笔记
提升您的技术认知

Nginx负载均衡

server {
    listen 80 default_server;
    listen [::]:80 default_server;

    upstream TestServer{
        server 127.0.0.1:5000;
        server 127.0.0.1:5001;
        server 127.0.0.1:5002;
    }
    location / {
        proxy_pass http://TestServer/;
    }
}

负载均衡策略

轮询(Round Robin)

原理:这是 Nginx 默认的负载均衡策略。它按顺序依次将客户端请求分发到后端服务器列表中的每一台服务器,当所有服务器都被轮询过一次后,又会重新从第一台服务器开始。
适用场景:服务器性能相近、处理能力相当的场景。

upstream backend {
    server backend1.example.com;
    server backend2.example.com;
}

server {
    location / {
        proxy_pass http://backend;
    }
}

加权轮询(Weighted Round Robin)

原理:在轮询策略的基础上,为每台后端服务器分配一个权重值。权重值越高的服务器,被分配到请求的概率就越大。这使得性能更强的服务器能够处理更多的请求。
适用场景:硬件配置、性能等存在差异时,使用加权轮询可以更合理地分配请求

upstream backend {
    server backend1.example.com weight=3;
    server backend2.example.com weight=1;
}

server {
    location / {
        proxy_pass http://backend;
    }
}

IP 哈希(IP Hash)

原理:根据客户端的 IP 地址进行哈希计算,将相同 IP 地址的客户端请求始终分发到同一台后端服务器上。这样可以保证客户端与服务器之间的会话一致性。
适用场景:适用于需要保持会话状态的应用,如购物车、用户登录等单机部署场景。

upstream backend {
    ip_hash;
    server backend1.example.com;
    server backend2.example.com;
}

server {
    location / {
        proxy_pass http://backend;
    }
}

最少连接

原理:将新的客户端请求分发到当前连接数最少的后端服务器上。这样可以确保每台服务器的负载相对均衡,避免某些服务器因连接过多而性能下降。
适用场景:适用于处理请求时间差异较大的场景,比如不同的后端服务器处理复杂业务逻辑的能力不同。

upstream backend {
    least_conn;
    server backend1.example.com;
    server backend2.example.com;
}

server {
    location / {
        proxy_pass http://backend;
    }
}

加权最少连接(Weighted Least Connections)

这是目前最优解,综合考虑了服务器性能差异与业务逻辑性能占用差异
原理:结合了加权轮询和最少连接的思想。在选择连接数最少的服务器时,还会考虑服务器的权重。权重高的服务器即使连接数稍多,也更有可能被选中。
适用场景:在后端服务器性能有差异且请求处理时间不同的情况下使用。

upstream backend {
    least_conn;
    server backend1.example.com weight=3;
    server backend2.example.com weight=1;
}

server {
    location / {
        proxy_pass http://backend;
    }
}

随机(Random)

原理:随机地将客户端请求分发到后端服务器列表中的某一台服务器上。
适用场景:在对负载均衡的精确性要求不高,且后端服务器性能差异不大的场景中可以使用。

upstream backend {
    random;
    server backend1.example.com;
    server backend2.example.com;
}

server {
    location / {
        proxy_pass http://backend;
    }
}

随机加权(Random with Weight)

原理:在随机分配的基础上,考虑服务器的权重。权重高的服务器被随机选中的概率更大。
适用场景:综合了随机和加权的优点,适用于多种复杂场景。

upstream backend {
    random two least-time=header;
    server backend1.example.com weight=3;
    server backend2.example.com weight=1;
}

server {
    location / {
        proxy_pass http://backend;
    }
}

健康度检查

当我们配置负载均衡后,如果某一台服务器挂了。Nginx不会主动感知服务器是否挂掉,所以请求可能会超时无响应。
因此可以通过 Nginx 的 ngx_http_upstream_module 模块配置主动健康检查,或者使用第三方模块(如 ngx_http_upstream_check_module)来实现更完善的健康检查功能

http {
    upstream backend {
        # 定义后端服务器
        server backend1.example.com;
        server backend2.example.com;

        # 配置健康检查
        # interval=3000:每隔3秒对后端服务器进行一次健康检查
        # rise=2:连续两次检查结果正常时,才标记为可用
        # fall=3:连续3次检查结果异常,标记为不可用
        # timeout=1000:检查的超时时间
        # type=http:使用htpp协议进行检查
        check interval=3000 rise=2 fall=3 timeout=1000 type=http;
        # 对应服务器的检查检查地址
        check_http_send "HEAD /healthcheck HTTP/1.0\r\n\r\n";
        # 设置当服务器返回2xx 3xx 状态码时,认为服务器正常
        check_http_expect_alive http_2xx http_3xx;
    }

    server {
        listen 80;
        server_name example.com;

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