集群部署的情况下,如何利用nginx负载均衡?

829 阅读3分钟

1、前言

什么是负载均衡?

当我们把应用部署在单个机器时,如果用户访问量越来越大时,服务器压力就会越来越大,大到超过自身承受能力时,服务器的服务就会崩溃,用户访问就会不正常。为了避免服务器崩溃,让用户有更好的体验,我们通过负载均衡的方式来分担服务器压力。

当我们把工程部署在多个服务器时,这就变成了服务器集群部署

当用户访问网站时,先访问一个web服务器,然后把请求通过TCP servers均匀分发到其他服务器,减少大量的集中的访问。如此以来,用户的每次访问,都会保证服务器集群中的每个服务器压力趋于平衡,分担了服务器压力,避免了服务器崩溃的情况

2、实现

普通单机反向代理如下

假设机器IP为: 118.224.178.5

server {
  listen       80;
  server_name  localhost;

  location / {
      root   /home/test/;
      try_files $uri /index.html;
      index  index.html index.htm;
      autoindex on;
  }

  location ~ ^/(api) {
    proxy_pass http://118.224.6.196:8280;
  }
}

负载均衡:

分发请求到多个服务器,到达均衡的目的

# 负载均衡服务
upstream backend {
  server 118.224.6.196:8280;
  server 118.224.6.181:8280;
}

server {
  listen       80;
  server_name  localhost;

  location / {
      root   /home/test/;
      try_files $uri /index.html;
      index  index.html index.htm;
      autoindex on;
  }

  location ~ ^/(api) {
    add_header backendIP $upstream_addr;
    add_header backendCode $upstream_status;
    add_header Cache-Control no-store;
    proxy_pass http://backend;
  }
}

假设:

nginx服务器0:118.224.178.5

server机器1:118.224.6.196

server机器2:118.224.6.181

我有一个nginx的web服务器,是一个验证码如图:

我在机器1和机器2,部署同一个server应用

当我关闭server1时,server2依然可以正常访问

当我关闭server2时,server1依然可以正常访问

当我关闭server1,同时关闭server2时,客户端不可以正常访问

以上为默认方式,每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器服务挂了,能自动连接其他服务;

参数有:

参数描述
fail_timeout与max_fails结合使用
max_fails设置在fail_timeout参数设置的时间内最大失败次数,如果在这个时间内,所有针对该服务器的请求都失败了,那么认为该服务器会被认为是停机了
fail_time服务器会被认为停机的时间长度,默认为10s
backup标记该服务器为备用服务器。当主服务器停止时,请求会被发送到它这里
down标记服务器永久停机了

3、其他方式

weight 指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况,

该配置存在一个问题:已经登录后,如果服务转发到其他服务器,登录的session信息会丢失

# 负载均衡服务
upstream backend {
  server 118.224.6.196:8280 weight=3;
  server 118.224.6.181:8280 weight=7;
}

获取验证码是在server1机器上,验证验证码却在server2机器上,验证码存在server1的session中,所以有很大几率会登录不成功

这种情况下,我们可以采用ip_hash指令解决这个问题,如果客户已经访问了某个服务器,当用户再次访问时,会将该请求通过哈希算法,自动定位到该服务器;

ip_hash

# 负载均衡服务
upstream backend {
  server 118.224.6.196:8280;
  server 118.224.6.181:8280;
  ip_hash;
}

fair(第三方插件)

这种方式根据后端服务器的响应时间进行分配,响应快的优先分配请求

# 负载均衡服务
upstream backend {
  server 118.224.6.196:8280;
  server 118.224.6.181:8280;
  fair;
}

url hash(第三方插件)

此种方式和ip_hash比较类似,根据url的hash值进行分配,将url分配到同一个后端服务器,当服务器存在缓存时比较有效

# 负载均衡服务
upstream backend {
  server 118.224.6.196:8280;
  server 118.224.6.181:8280;
  hash $request_uri;
  hash_method crc32;
}

4、总结

以上只是其中几个方式,这里只是简单说明,有时间再补充。