Skip to content

介绍

在上篇中利用反向代理将http请求映射到后端服务器,但是为了应对并发,就有了负载均衡的概念。它通常配合反向代理的使用,将请求映射到多个后端服务器上。nginx会根据配置均匀的将请求分配给每个服务器。

upstream

结合反向代理,配置负载均衡:

nginx
serevr {
  listen 80;
  server_name jsgoshu.cn;
  location /api/ {
    proxy_set_header X-Real-IP $ClientRealIP;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_http_version 1.1 ;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection 'upgrade';
    access_log logs/api_access.log;
    error_log  logs/api_error.log;
    #在这里自定一个路径即可
    proxy_pass http://blog_nginx;
  }
}
#对应反向代理的路径 将请求根据策略分发到不同的服务器上
upstream blog_nginx {
  #ip_hash;
  server 192.168.168.70:8600 weight=1 max_fails=3 fail_timeout=30s;
  server 192.168.168.69:8600 weight=1 max_fails=3 fail_timeout=30s;
}

负载均衡的策略

负载均衡的策略,大致有4种:

  1. 轮询(默认)

轮询策略就是按照顺序将请求分配给不同的服务器。譬如有3台服务器A B C。第一次访问是A,第二次就是B,第三次就是C。

nginx
upstream pollingServer {
  server 127.0.0.1:8081 weight=1 max_fails=3 fail_timeout=30s;
  server 127.0.0.1:8082 weight=1 max_fails=3 fail_timeout=30s;
  server 127.0.0.1:8083 weight=2 max_fails=3 fail_timeout=30s;
}

轮询策略提供了一些额外的参数。他们的含义分别是:

  • weight:权重。默认为1,值越大,表示这台机器被访问的几率越大。(可以结合ip_hash策略来使用)。适用于服务器硬件配置差别比较大的情况。
  • max_fails:最大失败次数。
  • fail_timeout:超过服务器的最大失败次数后的暂停时间。
  • fail_time:服务器会被认作停机的时间长度。默认是10s。
  • backup:表示该服务器为备用服务器。当其他所有非备用服务器挂掉时,会将请求分配到该备用服务器。
  • down:表示该服务器停机,不再参与负载。
  1. 根据响应时间(fair)

fair根据服务器的响应时间来分配。响应时间短的优先分配。它是第三方策略。需要按照对应的nginx插件。

nginx
upstream fairServer {
  fair;
  server 127.0.0.1:8081;
  server 127.0.0.1:8082;
}
  1. 根据IP(ip_hash)

ip_hash根据客户端的IP来分配服务器,使得同一个客户端的请求都转发到同一个后端服务器。保证了session的统一性。

nginx
upstream ipHashServer {
  ip_hash;
  server localhost:8081;
  server localhost:8082 backup;
  server localhost:8083 max_fails=3 fail_timeout=20s;
  server localhost:8084 weight=2;
}
  1. 根据URL(url_hash)

url_hash是按照访问url的hash结果来分配请求,使得每个url定向到同一个后端服务器,要配合缓存命中来使用。同一个资源多次请求,可能会到达不同的服务器上,导致不必要的多次下载,缓存命中率不高,以及一些资源时间的浪费。而使用url_hash的话,就可以使得同一个url(也就是同一个资源请求)到达同一台服务器,一旦缓存住了资源,再次收到请求,就可以从缓存中读取。它也是第三方策略,需要额外安装插件。

nginx
upstream urlHashServer {
  url_hash;
  server 127.0.0.1:8081;
  server 127.0.0.1:8082;
}