请叫我阿武_Richer

不积跬步,无以至千里;不积小流,无以成江海。骐骥一跃,不能十步;驽马十驾,功在不舍。锲而舍之,朽木不折;锲而不舍,金石可镂; ---共同学习; 积累学习!
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Nginx 负载均衡简单简单案例

Posted on 2019-06-04 14:14  请叫我阿武_Richer  阅读(208)  评论(0)    收藏  举报

 1. 负载均衡说明:

   负载均衡其实就相当于路由器的作用;完成流量的转发;从而减轻服务器压力;负载均衡有两种: 一种是GLVS; 另一种是LVS;

   其实现的功能只是对请求数据包的转发(也可能会改写数据包)、传递,其中DR模式明显的特征是从负载均衡下面的节点服务器来看,

   接收到的请求还是来自访问负载均衡的客户端的真实用户。

  Nginx是一个轻量级的、高性能的WebServer,他主要可以干下面两件事:

    作为http服务器(和apache的效果一样)
    作为反向代理服务器实现负载均衡

        现在Nginx到处都可以见到,经常会看到宕机后的网页会显示nginx的字样,这也说明Nginx由于高性能、使用配置简、开源单这些特点被越来越多的用户所接受,所使用。

    其中第一种作为http服务器,结合php-fpm进程,对发来的请求进行处理,nginx本身并不会解析php,他只是作为一个服务器,接受客户端发来 的请求,如果是php请求,

    则交给php进程处理,并将php处理完成之后的结果发送给客户端。这个很简单,安装好nginx+php-fpm之后配置好 各自的配置文件,启动就可以实现。

 

 

2 简单负载均衡配置案例:

 2.1  准备测试文件

   分别 在/home/tmp 文件夹下建文件夹

   /home/tmp/code1 文件夹下文件名index.html

<html>
  <body bgcolor="red">
    <h1 color="red">
      server1
    </h1>
   </body>
</hmtl>

 /home/tmp/code2 文件夹下文件名index.html

<html>
  <body bgcolor="blue">
    <h1 color="blue">
      server2
    </h1>
  </body>
</hmtl>

home/tmp/code3 文件夹下文件名index.html

<html>
  <body bgcolor="yellow">
    <h1 color="yellow">
      server3
    </h1>
  </body>
</hmtl>

    

在conf.d文件夹下建立配置项:

  server1.conf

  

  server2.conf

  

  server3.conf

  

     新建配置文件火灾nginx.conf文件的http下添加如下代码

  

  此时访问127.0.0.1就可以访问到第一个文件和第二个文件

  其他参数讲解:

    在负载均衡每个server 后面的参数;每个参数是通过空格隔开

    案例:

upstream www_server_pool {
    server 10.0.0.5;   #<==这一行标签和下一行是等价的
    server 10.0.0.6:80 weight=1 max_fails=1 fails_timeout=10s; #<==此行标签为默认配置
    server 10.0.0.7:80 weight=1 max_fails=2  fails_timeout=10s backup;
    server 10.0.0.8:80 weight=1 max_fails=3 fails_timeout=20s backup;
}

 

参数详细代表

              

   upstream模块调度算法

    调度算法一般分为两类,

     第一类为静态调度算法,即负载均衡器根据自身设定的规则进行分配,不需要考虑后端节点服务器的情况,例如:rr、wrr、ip_hash等都属于静态调度算法。

       第二类为动态调度算法,即负载均衡器会根据后端节点的当前状态来决定是否分发请求,例如:连接数少的优先获得请求,响应时间短的优先获得请求。

     例如:least_conn、fair等都属于动态调度算法。

     q  rr轮询(默认调度算法,静态调度算法)

      按客户请求顺序把客户端的请求逐一分配到不同的后端节点服务器,这相当于LVS中的rr算法,如果后端节点服务器宕机(默认情况下nginx只检测80端口),

      宕机的服务器会被自动从节点服务器池中剔除,以使客户端的用户访问不受影响。新的请求会分配给正常的服务器。

     q  wrr(权重轮询,静态调度算法)

      在rr轮询算法的基础上加上权重,即为权重轮询算法。使用该算法时,权重和用户访问成正比,权重值越大,被转发的请求也就越多。可以根据服务器的配置和性能指定权重值大小,

      有效解决新旧服务器性能不均带来的请求分配问题。

       q  ip_hash(静态调度算法)

     每个请求按客户端IP的hash结果分配,当新的请求到达时,先将其客户端IP通过哈希算法哈希出一个值,在随后的客户端请求中,客户IP的哈希值只要相同,

       就会被分配至同一台服务器。该调度算法可以解决动态网页的session共享问题,但有时会导致请求分配不均,即无法保证1:1的负载均衡,因为在国内大多数公司都是NAT上网模式,

     多个客户端会对应一个外部IP, 所以,这些客户端都会被分配到同一节点服务器,从而导致请求分配不均。LVS负载均衡的-p参数、Keepalived配置里的persistence_timeout 50参数

     都是类似这个Nginx里的ip_hash参数解决动态网页的session共享问题。

      注:当负载调度算法为ip_hash时,后端服务器在负载均衡调度中的状态不能有weight和backup,即使有也不会生效。

     q  fair(动态调度算法)

      此算法会根据后端节点服务器的响应时间来分配请求,这是更加智能的调度算法。此种算法可以依据页面大小和加载时间长短智能地进行负载均衡,

         也就是根据后端服务器的响应时间来分配请求,响应时间短的会优先分配。Nginx本身是不支持fair调度算法的,如果需要这种算法,必须下载相关模块upstream_fair。

      q  least_conn(动态调度算法)

      least_conn算法会根据后端节点的连接数来决定分配情况,哪个机器连接数少就分发。

      q  url_hash

      和ip_hash类似,这里是根据访问的URL的hash结果来分配请求的,让每个URL定向到同一个后端服务器,可以进一步提高后端缓存服务器的效率命中率,后端服务器为缓存服务器时效果显著。

      在upstream中加入hash语句,server语句中不能写入weight等其他参数,hash_method使用的是hash算法。Nginx本身是不支持url_hash的,如果需要使用这种调度算法,

      必须安装Nginx的hash模块软件包。

      url_hash和ip_hash类似,示例配置如下: 

upstream test_server {
  server squid1:3128;
  server squid2:3181;
  hash $request_uri;
  hash_method crc32;
}

  注:如果使用url_hash,那么在节点宕机或者新加节点的时候,会产生缓存丢失无效的情况。

     q  一致性hash

      一致性hash算法一般用于代理后端业务缓存服务(squid,memcache)的场景,通过将用户请求的URI或者指定字符串进行计算,然后调度到后端的服务器上。

      此后任何用户查找同一个URI或者指定字符串都会被调度到这一台服务器上,因此后端的每个节点缓存的内容都是不同的。一致性hash算法可以解决后端某个或几个节点宕机后,

      缓存的数据动荡最小。

      配置示例:  

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;
    }
}        

 

 

注:Nginx本身不支持一致性HASH算法,需要插件,但Nginx分支tengine支持。

一致性HASH算法实践:http://lx.wxqrcode.com/index.php/post/92.html