upstream配置

  1. updtream backend {
  2. server 192.168.1.1:8080 weight=1;
  3. server 192.168.1.2:8080 weight=2;
  4. }

upstream server 的主要配置如下:

  • ip + 端口:配置上游服务器的IP 和 端口
  • 权重:weight用来配置权重,默认是1,权重越高,分配给这台服务器的请求数就越多,实际生产中,需要根据服务器的实际处理能力来分配权重。

然后,配置如下配置来处理请求:

  1. location / {
  2. proxy_pass http://backend;
  3. }

当访问nginx时,会将请求反向代理到backend配置的upstream server。

负载均衡算法

round-robin: 轮询算法

默认负载均衡的算法,通过配合weight权重,以轮询的方式将请求转发到上游服务器。

ip_hash

根据客户Ip进行负载均衡,相同的ip将负载均衡到同一个upstream server,如下:

  1. updtream backend {
  2. ip_hash;
  3. server 192.168.1.1:8080 weight=1;
  4. server 192.168.1.2:8080 weight=2;
  5. }

hash key [consistent]

对某一个key进行hash或者使用一致性hash算法进行负载均衡。使用Hash算法存在的问题是:当添加/删除一台服务器时,将导致很多key被重新负载到不同的服务器,从而导致后端可能会出现问题,因此考虑使用一致性哈希算法,这样当添加/删除一台服务器时,只有少量的key会被重新负载到新的服务器。

哈希算法:

可以根据uri进行负载均衡,也可以使用nginx变量,因为,可以实现复杂的算法:

  1. updtream backend {
  2. hash $uri;
  3. server 192.168.1.1:8080 weight=1;
  4. server 192.168.1.2:8080 weight=2;
  5. }

一致性哈希 consistent_key 动态指定:
  1. updtream backend {
  2. hash $consistent_key consistent;
  3. server 192.168.1.1:8080 weight=1;
  4. server 192.168.1.2:8080 weight=2;
  5. }

实际一般使用lua设置一致性hash_key,

  1. set_by_lua_file $consistent_key "lua_balancing.lua"

least_conn

将请求负载均衡到最少活跃的上游服务器。如果配置的服务器较少,则使用基于权重的轮询。

失败重试

  1. updtream backend {
  2. hash $uri;
  3. server 192.168.1.1:8080 weight=1 max_fails=2 fail_timeout=10s;
  4. server 192.168.1.2:8080 weight=2 max_fails=2 fail_timeout=10s;
  5. }

通过配置上游服务器的max_fails 和 fail_timeout ,来指定每个上游服务器,当在fail_timeout时间内,失败了max_fails次数,则认为该上游服务器不可用,然后摘掉该上游服务器,等到fail_timeout时间后,再次将该上游服务器加入到列表中进行重试。

  1. location / {
  2. proxy_connect_timeout 5s;
  3. proxy_read_timeout 5s;
  4. proxy_send_timeout 5s;
  5. proxy_next_upstream error timeout;
  6. proxy_next_upstream_timeout 10s;
  7. proxy_next_upstream_tries 2;
  8. }

通过配置proxy_next_upstream,当遇到错误的配置时,会尝试下一台上游服务器。

健康检查

nginx对上游服务器的健康检查,默认采用的是惰性策略,也可以集成nginx_upstream_check_module模块主动进行健康检查。

TCP心跳检查

  1. updtream backend {
  2. hash $uri;
  3. server 192.168.1.1:8080 weight=1 max_fails=2 fail_timeout=10s;
  4. server 192.168.1.2:8080 weight=2 max_fails=2 fail_timeout=10s;
  5. check interval=3000 rise=1 fail=3 timeout=2000 type=tcp;
  6. }

此处配置使用tcp进行健康检查,

  • interval:检测间隔时间,此处配置每隔3s检测一次
  • fail:检测失败多少次后,上游服务器被标记为不存活
  • rise:检测成功多少次后,上游服务器被标记为存活,并用来处理请求

    HTTP心跳检查

    1. updtream backend {
    2. hash $uri;
    3. server 192.168.1.1:8080 weight=1 max_fails=2 fail_timeout=10s;
    4. server 192.168.1.2:8080 weight=2 max_fails=2 fail_timeout=10s;
    5. check interval=3000 rise=1 fail=3 timeout=2000 type=http;
    6. check_http_send "HEAD /status HTTP/1.0\r\n\r\n";
    7. check_http_expect_alive http_2xx http_3xx;
    8. }
  • check_http_send:检查时发出的http请求内容

  • check_http_expect_alive:当上游服务器返回匹配的http状态码时,认为上游服务器存活
  • 需要设置合理的间隔时间,不能太短,否则太频繁会导致上游服务器挂掉。

    不可用上游服务器

    1. updtream backend {
    2. hash $uri;
    3. server 192.168.1.1:8080 weight=1 max_fails=2 fail_timeout=10s;
    4. server 192.168.1.2:8080 weight=2 max_fails=2 fail_timeout=10s down;
    5. check interval=3000 rise=1 fail=3 timeout=2000 type=http;
    6. }
    永久摘掉192.168.1.2:8080这台机器,设置为不可用。

    长链接

    ```nginx updtream backend { hash $uri; server 192.168.1.1:8080 weight=1 max_fails=2 fail_timeout=10s; server 192.168.1.2:8080 weight=2 max_fails=2 fail_timeout=10s; check interval=3000 rise=1 fail=3 timeout=2000 type=http; check_http_send “HEAD /status HTTP/1.0\r\n\r\n”; check_http_expect_alive http_2xx http_3xx; keepalive 16; }

location / {

支持keepalive

proxy_http_version 1.1; proxy_set_header Connection “”; proxy_pass http://backend; } ``` 通过keepalive指令配置长链接数量。配置每个worker进程与上游服务器之间可缓存的空闲连接的最大数量。当超出这个数量时,最近最少使用的连接将被关闭。