1、upstream 模块介绍:

   Nginx 的负载均衡功能依赖于ngx_http_upstream_modulemo模块,所支持的方式有    

   proxy_pass,fastcgi_pass,memcached_pass.

   官方地址http://nginx.org/en/docs/http/ngx_http_upstream_module.html

   upstream 模块语法:

   范例(1):

             upstream www_real_servers {
                #ip_hash;
                 server 10.0.0.22:80  weight=15;
                 server 10.0.0.23:80  weight=15;
                }

    解释:upstream是固定的;server是固定的后面可以接域名(门户会用)或ip,如果不加端口,默认是

                    80,weight是权重,值越大被分配的几率越高


               server backend2.example.com:8080 ;#域名加端口,转发到后端的端口。

               server unix:/tmp/backend3       #指定socket文件

    提示:Server如果接域名,需要内网有DNS服务器,或者在负载均衡器的hosts文件做域名解析。


               server backup1.example.com:8080 backup;

           #备份服务器,等上面指定的服务都不可以访问的时候会启用,back的用户和haproxy的用法相同。

              两台keepalive+http做高可用,那么这里使用nginx的backup参数就可以实现。

  2、upstream模块的相关说明

     官方文档:http://nginx.org/en/docs/http/ngx_http_upstream_module.html#upstream

     a、upstream模式应防御nginx.cnf配置的http{}标签内。

     b、upstream模式默认算法是wrr(权重轮询weighted round-robin)

     c、upstream模块内部部分参数说明:

        server 10.0.0.22:80

        负载均衡后面RS配置,可以是ip或域名,端口默认80.高并发场景ip要换成域名,通过dns做负载均衡。


        weight              

        权重,默认是1

        注意:当负载均衡调度算法为ip_hash时,后端服务器在负载均衡调度中的状态不可以是weight和backup

      

        max_fails=2        

        最大尝试失败的次数,默认为1,0表示禁止失败尝试,京东1次,蓝汛10次,根据业务配置;

        如果max_fails是5,它就检测5次,如果5次都是502,他就会根据fails_timeout的值等待后再次检查。

           这个参数配合proxy_next_upstream\fastcgi_next_upstream\memcached_pass 这三个参数使用,当nginx接受后端服务器返回这三个参数

           定义的状态码的时候,会将这个请求转发给正常工作的后端服务器,例如404,502,503,Max_fails默认值为1(提升用户体验)

        

        backup    

       热备配置(RS节点的高可用) ,当前面激活的RS 都失败后会自动启动热备RS


       fail_timeout=20s

       失败超时时间,默认是10s,京东3秒,蓝汛10秒,根据业务配置。常规2-3秒

      

       down

       标志服务器永远不可用,这个参数一直配合ip_hash使用。


3、特别说明:

    对于nginx代理cache服务时,可能需要使用hash算法,此时,如果宕机时,可通过设置down参数确保

    客户端使用安装当前的hash算法访问,很重要滴!!


    官网内容如下:  

    If one of the servers needs to be temporarily removed, it should be marked with the  down parameter in order to preserve the       current hashing of client IP  addresses.

Example:

upstream backend {
   ip_hash;

   server backend1.example.com;
   server backend2.example.com;
   server backend3.example.com down;
   server backend4.example.com;
}

      Until versions 1.3.1 and 1.2.2, it was not possible to specify a weight for servers using the ip_hash load balancing method.


4、upstream 算法:      

    rr 轮询:

    按客户端请求顺序把客户端的请求逐一分配到不同的服务器后端;


    weight权重:

    在轮询算法的基础上加上权重(默认是rr+weight),权重轮询和访问成正比。


    ip_hash:

    每个请求按访问ip的hash结果分配,当新的请求到达时,先将其客户端ip通过哈希算法哈希出一

    个值,在随后请求客户端,ip的哈希值只要相同,就会被分配到同一台服务器(lvs负载均衡-P参数。

    keepalive里配置的persistence_timeout 50),该调度算法有效解决动态网页session共享问题,容

    易造成请求分配不均。

    注意:当调度算法为ip_hash时,后端服务器在负载均衡中的状态不能是weight、backup。


    fair (第三方 no)

    按照后端服务器相应时间分配请求,相应时间短优先分配。

        范例:

             upstream www_real_servers {
                 server 10.0.0.22:80  weight=15;
                 server 10.0.0.23:80  weight=15;

                 fair;
                }

     #使用时下载nginx的upstream_fair模块


    url_hash(第三方 no)

    按访问url的hash结果分配请求,让每个url定向到同一个后端服务器(后端服务器为缓存服务器时效果著,cdn)。

    在upstream中加入hash语句,server语句不可以加入weight等其它参数

        范例:

             upstream www_real_servers {
                 server 10.0.0.22:80  weight=15;
                 server 10.0.0.23:80  weight=15;

                 hash $request_uri;
                }


     least_conn

      最少连接数,那个机器连接数少就分发

    

    一致性hash

    http://tengine.taobao.org/document_cn/http_upstream_consistent_hash_cn.html

    #缓存负载均衡最好的算法

      

http {
   upstream test {
       consistent_hash $request_uri;
       server 127.0.0.1:9001 id=1001 weight=3;
       server 127.0.0.1:9002 id=1002 weight=10;
       server 127.0.0.1:9003 id=1003 weight=20;
   }