学习笔记
Git
  • C#
  • F#
  • AspNetCore
  • EF Core
  • WPF
  • Tauri
  • IoTDB
  • Redis
  • Docker
  • Kubernetes
  • RabbitMQ
  • 日志

    • NLog的配置文件
Linux
基础设施
  • Vue

    • Vue基础
VS Code的插件与玩法
Rust
Python
  • Maven
  • Spring Boot
实际项目
我的博客
Git
  • C#
  • F#
  • AspNetCore
  • EF Core
  • WPF
  • Tauri
  • IoTDB
  • Redis
  • Docker
  • Kubernetes
  • RabbitMQ
  • 日志

    • NLog的配置文件
Linux
基础设施
  • Vue

    • Vue基础
VS Code的插件与玩法
Rust
Python
  • Maven
  • Spring Boot
实际项目
我的博客

Nginx负载均衡

负载均衡在目前是非常重要的技术,当业务负载越来越高,就可以考虑使用负载均衡来水平扩展,这是负载均衡很重要的功能。不过绝大多数公司都用不着水平扩展,但是负载均衡仍然有用,比如说用来不间断更新服务,灰度发布什么的,总之学了还是很实用的

HTTP的负载均衡

http {

    # 其它配置内容

    upstream backend {
        server 10.10.12.45:80 weight=1;
        server app.example.com:80 weight=2;
        server spare.example.com:80 backup;
    }
    server {
        location / {
            proxy_pass http://backend;
        }
    }
}

此配置指定了两台主服务器和一台后备服务器,当两台主服务器都不可用时使用backup后备服务器

两台主服务器通过指定weight设置了权重,默认权重均为1,通过上述设置,Nginx会向第二台主服务器传输第一台主服务器两倍的请求,也就是请求1/3走第一台服务器,2/3走第二台服务器

负载均衡的方式

Nginx支持多种负载均衡方式,其默认负载均衡方式是轮询,除此之外还有最少连接、最短时间、通用哈希、随机算法和IP哈希等多种负载均衡方式

如果设备都不指定,那么使用默认的轮询方式进行负载均衡,如果要使用其他方式,则添加对应的指令

    upstream backend {
        # 使用最少连接进行负载均衡
        least_conn;
        server 10.10.12.45:80 weight=1;
        server app.example.com:80 weight=2;
        server spare.example.com:80 backup;
    }
负载均衡方式指令备注
轮询无默认方式,无需指令
最少连接least_conn
最短时间least_time仅在企业版提供
通用哈希hash
随机random
IP哈希ip_hash仅适用于HTTP

补充说明

通用哈希
upstream backend {
    hash $request_uri consistent;
    server backend1.example.com;
    server backend2.example.com;
}

使用通用hash时,指定一个变量定义哈希值,NGINX 能够为当前请求生成哈希值并将其放在上游服务器上,从而在这些服务器之间分发负载。consistent是一个可选参数,能够将重新分发带来的影响最小化

Nginx内置变量表

随机

使用random时,会随机选择一个服务器,如果使用了two参数,则会随机选择两个服务器,再按照后面的负载均衡方式选择一个

upstream backend {
    random two least_conn;
    server backend1.example.com;
    server backend2.example.com;
    server backend3.example.com;
    server backend4.example.com;
}

这个配置文件会随机选择2个服务器,然后使用最少连接的方式选择其中一个,least_conn是默认的方法,也可以省略(random two least_conn;等效random two;)

TCP/UDP负载均衡

TCP

stream {
    upstream mysql_read {
        server read1.example.com:3306 weight=5;
        server read2.example.com:3306;
        server 10.10.12.34:3306 backup;
    }
    server {
        listen 3306;
        proxy_pass mysql_read;
    }
}

UDP

stream {

    upstream stream_backend {
        server backend1.example.com:12345;
        server backend2.example.com:12345;
        server backend3.example.com:12346;
        # ...
    }

    upstream dns_servers {
        server 192.168.136.130:53;
        server 192.168.136.131:53;
        # ...
    }

    # ...
}

TCP和UDP的负载均衡,并不在HTTP模块,而是使用stream模块,不支持IP哈希,其他的语法是相同的

Last Updated:
Contributors: 吴俊城