• Post author:
  • Post category:nginx
  • Post comments:0评论

1、定义一个虚拟资源池

Syntax: upstream name { ... }
Default:    —
Context:    http

2、定义资源池中服务器的地址和其状态

Syntax: server address [parameters];
Default:    —
Context:    upstream

address此地址一般指定为域名或者IP地址,后可接端口。parameters可选参数如下:


   ◇ backup:热备服务器,当其他所有服务器不能访问时,自动启用。

   ◇ down:当前的server不可用。

   ◇ weight=number:加权轮询,设置服务器的权重,其值越大分配到的访问越多,默认为1。

   ◇ max_conns=number
      ▪ 限制同时活动连接的最大数量,默认值为零,表示没有限制。注意每一个请求都算活动连接,如果网页完全出来需要10个请求,那么此处配置2,只会有两个请求成功,其余请求返回502。

   ◇ fail_timeout=time:
      ▪ 定义和服务器的通信失败尝试重连的时间范围,如果在这个时间范围内失败超过次数,则接下来这个时间段里服务器被当作不可用。

   ◇ max_fails=number:
      ▪ 定义在被fail_timeout参数定义的时间内和服务器通信失败最大可尝试的次数。默认值为1,适用于下面;配置为0,表示不限制失败可尝试次数。
      ▪ 通俗点说,当没有配置fail_timeout时,如果此值设置为2,那么默认在10秒内连接失败两次,则随后10秒服务器不可用(即便服务在不可用的时间段里恢复了正常),10秒后才会去尝试连接服务器是否可用,如果不可用,那么只会允许失败一次,然后继续10秒时间不可用。
      ▪ 如果配置了fail_timeout=30,此值设置为2,那么在30秒内连接失败两次,则随后30秒服务器不可用(即便服务在不可用的时间段里恢复了正常),30秒后才会去尝试连接服务器是否可用,如果不可用,那么只会允许失败一次,然后继续30秒时间不可用。
      ▪ 值得注意的是在上面30秒内,如果失败一次,服务恢复正常,在离上次失败还没有30秒间隔再出现一次失败,也会算做30秒内失败两次,导致随后30秒服务器算做不可用。

3、 负载均衡调度算法

调度算法 含义
轮询 每个请求按照时间顺序轮流分配到不同的后端服务器(默认)。
weight 加权轮询,设置服务器的权重,其值越大分配到的访问越多,weight值和访问率成正比,默认为1。
ip_hash 每个请求按照访问ip的hash结果分配,使得来自同一IP的客户端固定访问一个后端服务器。
least_conn 优先分配请求给活动连接数最少的服务器。
url_hash 每个请求按照访问url的hash结果来分配,使得相同的url固定访问到一个后端服务器。主要应用于缓存场景,以提高缓存命中率。nginx原生不支持,第三方。
fair 公平地按照后端服务器的响应时间分配请求,响应时间越短的后端服务器优先分配请求。nginx原生不支持,第三方。

4、指定当出现哪些情况时,请求应该被传递到另一个服务器

  在运行过程中,后端节点难免会因为某些原因,不能正确响应用户请求,而是返回状态码,例如网络连接超时,后端服务器超时或者过载等。当出现这些情况,那我们要如何避免返回状态码,而是将请求转移到另一个节点,以提高用户的体验感。
  要知道按照nginx本身机制,只有服务器服务宕机了连接失败,负载均衡才会将这台节点上的请求转移到其它节点。如果服务器服务运行正常,那么该返回什么状态码就会返回什么状态码。所以对此我们可以配置下面配置来解决这个问题。

Syntax: proxy_next_upstream error | timeout | invalid_header | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | http_429 | non_idempotent | off ...;
Default:    proxy_next_upstream error timeout;
Context:    http, server, location

error:连接错误
timeout:连接超时
http_*:状态码

示例:

[root@lb01 ~]# vim /etc/nginx/conf.d/proxy_wordpress.conf 
upstream wordpress {
    server 172.16.1.7:80;
    server 172.16.1.8:80;
}

server {
    listen 80;
    server_name wordpress.cp.com;

    location / {
        proxy_pass http://wordpress;
        include proxy_params;
        proxy_next_upstream error timeout http_500 http_502 http_503 http_504;
    }
}

5、示例

upstream backend {        //定义一个名为backup的虚拟资源池

    server backend1.example.com      weight=5;      //设置服务器轮询权重为5
    server backend2.example.com:8080 max_fails=3 fail_timeout=5s;  //代理服务器和此服务器在5秒内连接失败3次,随后5秒服务器算做不可用
    server 192.0.2.1                 max_fails=3;   //代理服务器和此服务器在10秒内连接失败3次,随后10秒服务器算做不可用

    server backup3.example.com  down;      //当前的server不可用
    server backup4.example.com  backup;    //备用server
}    

    //总体来说,当有7个请求,其中5个分配给backend1.example.com;backend2.example.com:8080分配一个,且当代理服务器和此服务器在5秒内连接失败3次,随后五秒此服务器算做不可用;192.0.2.1服务器分配一个,且当代理服务器和此服务器在10秒内连接失败3次,随后10秒此服务器算做不可用。backup3.example.com服务器不参与负载均衡,backup4.example.com服务器做为热备服务器,当其他所有服务器不能访问时,自动启用。

server {
    location / {
        proxy_pass http://backend;      //将用户请求代理转发到backend资源池
        proxy_next_upstream error timeout http_500 http_502 http_503 http_504;
            //当某台节点出现连接错误、连接超时、500、502、503和504这些情况时,将这台节点上的请求转移到其它节点。
    }
}

发表评论

验证码: 3 + 6 =