Skip to content

Nginx 负载均衡详解

提示

核心:将客户端请求均匀分配到多个后端服务器(比如:nodejs、php、java 等后端服务器),以此提升系统吞吐量、可靠性和容灾能力 本质:在 Nginx 服务器(作为反向代理)和后端业务服务器(如 Tomcat、Node.js)之间,建立一层请求分发机制,避免单台服务器过载,并实现故障自动切换。

实现原理

通过 http 块中的 upstream 模块定义后端服务器集群,再在 server 块的 location 中通过 proxy_pass 指向该集群,即可开启负载均衡。

shell
http {
    # 1. 定义后端服务器集群(名称可自定义,如 my_server_group)
    upstream my_server_group {
        # 后端服务器地址+端口,weight 为权重(默认1,值越大分配到的请求越多)
        server 192.168.1.101:8080 weight=5;
        server 192.168.1.102:8080 weight=3;
        server 192.168.1.103:8080; # 权重默认为1
    }

    # 2. 定义前端监听(客户端请求入口)
    server {
        listen 80; # Nginx 监听端口
        server_name localhost; # 访问域名

        # 3. 匹配请求并转发到后端集群
        location / {
            proxy_pass http://my_server_group; # 指向 upstream 定义的集群名称
            # 可选:设置反向代理的基础头信息
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
    }
}

策略一:默认的轮询

将每个请求按照请求的先后顺序平均分配到不同的服务器上

shell
http {
    upstream mypros {
        server 192.168.76.100:80;
        server 192.168.76.129:80;
    }
  
    server {
        listen 80;
        server_name localhost;
  
        location / {
            proxy_pass http://mypros; 
            proxy_set_header Host $proxy_host;
        }
    }
}

策略二:权重轮询

设置轮询的访问几率,当接受到四个请求时,会分配给 101 服务器1个请求,分配给 102 服务器3个请求

shell
upstream my_server_group {
    server 192.168.1.101:8080 weight=1;
    server 192.168.1.102:8080 weight=3;
}

策略三:ip哈希轮询

按照客户端IP进行分配,同一个ip只能访问同一台终端服务器,解决 session 跨域不共享的问题

shell
upstream my_server_group {
    ip_hash; # 开启IP哈希策略
    server 192.168.1.101:8080;
    server 192.168.1.102:8080;
}

策略四:最少连接轮询

将请求转发给连接数较少的服务器上

shell
upstream my_server_group {
    least_conn; # 开启最少连接策略
    server 192.168.1.101:8080;
    server 192.168.1.102:8080;
}

策略五:最短时间轮询

按照服务器端的响应时间来分配请求,响应时间短的优先分配。

shell
upstream my_server_group {
    fair; # 开启最短时间轮询
    server 192.168.1.101:8080;
    server 192.168.1.102:8080;
}

策略六:url 哈希轮询

按照访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,需要配合缓存用

shell
upstream my_server_group {
    hash $request_uri; # 开启 url 哈希
    server 192.168.1.101:8080;
    server 192.168.1.102:8080;
}

高级特性:健康检查与容错

为避免将请求转发到故障服务器,Nginx 提供健康检查机制,自动剔除故障节点,恢复后重新加入集群。

shell
upstream my_server_group {
    server 192.168.1.101:8080;
    server 192.168.1.102:8080;
    # 健康检查核心参数
    max_fails 3;    # 允许请求失败的最大次数(默认1),超过则服务器被标记为 “不可用”。
    fail_timeout 10s; # 服务器被标记为 “不可用” 后,将在该时间内不再接收请求,过了这个时间重新尝试(默认10s)
    proxy_next_upstream error timeout invalid_header; # 定义哪些情况会触发 “放弃当前服务器,转发到下一台”,常见值包括 error(连接错误)、timeout(请求超时)、invalid_header(响应头无效)。
}

注意

  1. 后端服务需无状态:除 IP 哈希场景外,后端服务器不能存储会话信息(如登录态),否则请求分配到不同服务器会导致会话丢失。建议使用 Redis 等工具统一存储会话。
  2. 权重配置需合理:根据服务器性能(CPU、内存、带宽)调整 weight,避免性能差的服务器承担过高负载。
  3. 监控与日志:开启 Nginx 访问日志(access_log)和错误日志(error_log),便于排查负载不均衡或后端故障问题。
  4. 动静分离结合:可将静态资源(图片、CSS、JS)由 Nginx 直接处理,动态请求(如接口)转发到后端服务器,进一步提升性能。