Nginx http_upstream_module 负载均衡策略

负载均衡


负载均衡的实现方法就是我们上篇博客介绍的反向代理 。将客户的请求通过 nginx 分发(反向代理)到一组多台不同的服务器上

这一组服务器我们称为 服务池(upstream server),池内的每一个服务器称为一个 单元,服务池内将对每一个单元进行请求轮训,实现负载均衡。

 

 

负载均衡目的


当我们的服务是由一台服务器支撑时,就丝毫不存在负载均衡的概念。只有当服务由多台服务器(也就是服务器集群)支撑时,才会使用到负载均衡。

负载均衡顾名思义,是一种策略,用于防止一台服务器过载,而其他服务器闲置情况发生的策略。通过该策略可以使得提供相同服务的服务器负载基本相同。说得直白一点,就是当客户端发起一个请求之后,负载均衡会通过预先设定好的策略将该请求转发给上游的一台服务器进行处理。

如图所示:

负载均衡是一个很成熟的技术,其中对后端服务器进行轮询(默认);通过客户端请求IP进行hash;对后端服务器指定权重等,是较为常见的负载均衡策略。

七层负载均衡是工作在七层协议的第七层-应用层,主要工作是代理。它首先会与客户端建立一条完整的连接并将应用层的请求流量解析出来,再按照调度算法选择一个应用服务器,并与应用服务器建立另外一条连接将请求发送过去。均衡是依赖于反向代理的,反代不一定依赖于均衡,反向代理是可以独立的

 

七层负载均衡配置语法


语法:upstream name ...
默认:——
位置:http

upstream #自定义组名 {
    server x1.baidu.com;    #可以是域名
    server x2.baidu.com;
    #server x3.baidu.com
                            #down         不参与负载均衡
                            #weight=5;    权重,越高分配越多
                            #backup;      预留的备份服务器
                            #max_fails    允许失败的次数
                            #fail_timeout 超过失败次数后,服务暂停时间
                            #max_coons    限制最大的接受的连接数
                            #根据服务器性能不同,配置适合的参数

    #server 106.xx.xx.xxx;        可以是ip
    #server 106.xx.xx.xxx:8080;   可以带端口号
    #server unix:/tmp/xxx;        支出socket方式
}

配置七层均衡:upstream只能配置在http指令块里面

前端服务器:192.168.179.99

后端服务器1:192.168.179.100

后端服务器2:192.168.179.101

这里后端服务器也可以通过配置虚拟主机实现。

 

前端服务器主要配置upstream和proxy_pass:

upstream 主要是配置均衡池和调度方法。

proxy_pass 主要是配置代理服务器ip或服务器组的名字。

proxy_set_header 主要是配置转发给后端服务器的Host和前端客户端真实ip。

 

均衡方式


  • 轮训:按时间顺序逐一分配到不同的后端服务器

  • 加权轮训:weight值越大,分配到的机率越高

  • ip_hash:每个请求按访问IP的hash结果分配,这样来自同一个IP固定访问一个后端服务器

  • least_conn:最少链接数,哪个机器连接数少就分发给谁

  • url_hash:按照访问的URL的hash结果来分配请求,每一个URL定向到同一个后端服务器

  • hash关键数值:hash自定义key


(1)轮询 

代理服务器和后端服务器配置 

前端服务器:192.168.179.99配置
server {
        listen       80;
        server_name  localhost;
        charset utf-8;
        root /data/www/test;
        location / {
        proxy_pass http://web;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_next_upstream error http_404 http_502;
      }
    }

proxy_next_upstream error http_404 http_502:通过这个指令,可以处理当后端服务返回404等报错时,直接将请求转发给其他服务器,而不是把报错信息返回客户端。

proxy_set_header Host $host:通过这个指令,把客户端请求的host,转发给后端。

proxy_set_header X-Real-IP $remote_addr:通过这个指令,把客户端的IP转发给后端服务器,在后端服务器的日志格式中,添加$http_x_real_ip即可获取原始客户端的IP了


后端服务器
192.168.179.100
[root@www ~]# echo "proxy this is 192.168.179.100 page" >  /usr/local/nginx/html/index.html

192.168.179.101 
[root@www ~]# echo "proxy this is 192.168.179.101 page" >  /usr/local/nginx/html/index.html 

客户端去访问

客户端去访问代理服务器192.168.179.99,可以看到都可以访问到后端服务器上面资源
这里是使用轮询的方式访问,即192.168.179.100访问一次然后192.168.179.100访问一次,以此类推方式进行后端服务器上资源访问(可以看到后端服务器,非常平均的处理请求)

[root@localhost ~]# curl 192.168.179.99
proxy this is 192.168.179.100 page
[root@localhost ~]# curl 192.168.179.99
proxy this is 192.168.179.101 page
[root@localhost ~]# curl 192.168.179.99
proxy this is 192.168.179.100 page
[root@localhost ~]# curl 192.168.179.99
proxy this is 192.168.179.101 page

(2)轮询加权重

如果192.168.179.100服务器的比192.168.179.101的性能好上很多,那么就可以使用轮询加重的方式

前端服务器:192.168.179.99配置,这里和上面一样只不过修改了权重

 来四个请求,192.168.179.100处理其中三个,剩下的一个交个192.168.179.101
upstream web{ 
server 192.168.179.100 weight=3;
server 192.168.179.101 weight=1;
}

[root@localhost ~]# while true;do curl 192.168.179.99;sleep 1;done  -- --客户端每隔两秒去代理服务器上拿后端资源
proxy this is 192.168.179.101 page
proxy this is 192.168.179.100 page
proxy this is 192.168.179.100 page
proxy this is 192.168.179.100 page
proxy this is 192.168.179.101 page
proxy this is 192.168.179.100 page

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章