Nginx保姆级教程-就怕你还学不会-Nginx之负载均衡限流熔断限流熔断动静分离

Posted ~玄霄-

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nginx保姆级教程-就怕你还学不会-Nginx之负载均衡限流熔断限流熔断动静分离相关的知识,希望对你有一定的参考价值。

Nginx负载均衡介绍

  • 负载均衡的意思是在服务器集群中,需要有一台服务器作为调度者,客户端所有的请求都由调度者接收,调度者再根据每台服务器的负载情况,将请求分配给对应的服务器去处理;
  • 在这个过程中,调度者如何合理分配任务,保证所有服务器将性能充分发挥,从而保持服务器集群的整
    体性能最优,这就是负载均衡的问题了。

nginx负载均衡的方式

轮询

  • 轮询方式是Nginx默认的方式、所有请求按照时间分配到不同的服务上,如果服务挂了,可以自动提出。如果没挂,按照服务器配置的顺序,轮流将请求发送到这些服务器上。
upstream  dalaoyang-server {
       server    localhost:10001;
       server    localhost:10002;
}

权重

  • 制定每个服务的权重比例,weight和访问量成正比。
  • 通常用于后端服务器性能不统一,将性能好的服务器的权重设置高一点,来发挥服务器的最大性能。
  • 如下配置后,10002服务的访问比率是10001服务的两倍
upstream  dalaoyang-server {
       server    localhost:10001 weight=1;
       server    localhost:10002 weight=2;
}

iphash

  • 每个请求按照ip的hash结果分配,经过处理,每个请求固定访问一个后端服务,如下配置(ip_hash可以与weight一起使用)
upstream  dalaoyang-server {
       ip_hash; 
       server    localhost:10001 weight=1;
       server    localhost:10002 weight=2;
}

最少连接

  • 将请求分配到连接数最少的服务上。
upstream  dalaoyang-server {
       least_conn;
       server    localhost:10001 ;
       server    localhost:10002 ;
}

fair

  • 后端服务器的响应时间来分配请求,响应时间短的优先分配。 需要插件来帮我们实现
upstream  dalaoyang-server {
       server    localhost:10001 weight=1;
       server    localhost:10002 weight=2;
       fair;  
}

Nginx配置

以轮询为例,如下是nginx.conf完整代码。

worker_processes  1;

events {
    worker_connections  1024;
}


http {
   upstream  dalaoyang-server {
       server    localhost:10001;
       server    localhost:10002;
   }

   server {
       listen       10000;
       server_name  localhost;

       location / {
        proxy_pass http://dalaoyang-server;
        proxy_redirect default;
      }
    }
}

Nginx限流熔断

  • 作为优秀的负载均衡模块,目前是我工作中用到最多的。
  • 其实,该模块是提供了我们需要的后端限流功能的。通过官方文档介绍

令牌桶算法


算法思想:

  • 令牌以固定速率产生,并缓存到令牌桶中
  • 令牌桶放满时、多余的令牌被丢弃
  • 请求要消耗等比例的令牌才能被处理
  • 令牌不够时,请求被缓存(队列);

漏桶算法


算法思想是:

  • 请求从上方倒入水桶,从水桶下方流出
  • 来不及流出的请求存在水桶中,以固定速率流出
  • 水桶满后,请求溢出(丢弃)
  • 缓存请求、匀速处理、多余的请求直接丢弃。
    相比漏桶算法,令牌桶算法不同之处在于它不但有一只“桶”,还有个队列,这个桶是用来存放令牌的,队列才是用来存放请求的

Nginx按请求速率限速模块使用的是漏桶算法,即能够强行保证请求的实时处理速度不会超过设置的阈值。

案例

  • Nginx中文网案例:https://www.nginx.cn/doc/standard/httplimitrequest.html
    https://www.nginx.cn/doc/standard/httplimitzone.html

通过查看Nginx官方文档:
1、limit_conn_zone
2、limit_req_zone
3、ngx_http_upstream_module
前两种只能对客户端(即单一ip限流),并且文档也很全。

limit_conn_zone

可以针对条件,进行会话的并发连接数控制。(例如:限制每个IP的并发连接数。)
nginx配置

http{
limit_conn_zone $binary_remote_addr zone=one:10m; 
	server { 
		......
		 limit_conn one 10; 
	 	......
  		}
 }
  • 其中“limit_conn one 10”既可以放在server层对整个server有效,也可以放在location中只对单独的
    location有效。
  • 该配置表明:客户端的并发连接数只能是10个

limit_req_zone

  • 指令
limit_req_zone $session_variable zone=name_of_zone:size rate=rate

示例1 :

limit_req_zone  $binary_remote_addr  zone=one:10m   rate=1r/s;

示例2:

limit_req_zone $binary_remote_addr zone=req_one:10m rate=1r/s;

配置文件:

limit_req_zone  $binary_remote_addr  zone=one:10m   rate=1r/s;

 
    server {
        location /search/ {
            limit_req   zone=one  burst=120;
        }
  • 其中“limit_req zone=req_one burst=120”既可以放在server层对整个server有效,也可以放在location中只对单独的location有效。
  • rate=1r/s的意思是每个地址每秒只能请求一次,也就是说令牌桶burst=120一共有120块令牌,并且每秒钟只新增1块令牌,

ngx_http_upstream_module

作为优秀的负载均衡模块,目前是我们工作中用到最多的。其实,该模块是提供了我们需要的后端限流 功能的。通过官方文档介绍,该模块有一个参数:max_conns可以对服务端进行限流

配置

upstream xxxx{ 
 	server 127.0.0.1:8080 max_conns=10;
 	server 127.0.0.1:8081 max_conns=10; 
 }

表示最大连接数是10个;

动静分离

  • Nginx的静态处理能力很强,但是动态处理能力不足,因此,在企业中常用动静分离技术。
  • 动静分离技术其实是采用代理的方式,在server{}段中加入带正则匹配的location来指定匹配项针对服务的动静分离:
  • 静态页面交给Nginx处理
  • 动态页面交给服务器或Apache处理。
  • 在Nginx的配置中,是通过location配置段配合正则匹配实现静态与动态页面的不同处理方式。
  • 实现整个网站的动静分离,实现如下要求:
    1 前端Nginx收到静态请求,直接从NFS中返回给客户端。
    2 前端Nginx收到动态请求转交给通过FastCGI交给服务器处理。
    ----如果得到静态结果直接从NFS取出结果交给Nginx然后返回给客户端。
    ----如果需要数据处理服务器连接数据库后将结果返回给Nginx
    3 .前端Nginx收到图片请求以.jpg、.png、.gif等请求交给后端Images服务器处理
  location ~* \\.(jpg|gif)$ {             # location匹配将图片交给Image处理
​     proxy_pass http://10.10.0.23:80;      # Image服务器要开启web服务}

以上是关于Nginx保姆级教程-就怕你还学不会-Nginx之负载均衡限流熔断限流熔断动静分离的主要内容,如果未能解决你的问题,请参考以下文章

分布式框架Zookeeper保姆级教程--就怕你还看不懂-Zookeeper的安装特性结点数据类型内存数据持久化

图解+源码+思维导图,Nginx,我真不相信你还学不会(建议收藏)

Nginx保姆级教程-手把手教你安装Nginx

Windows安装Nginx服务-保姆级教程

代码阅读,就怕你知道却不会用

1000行 MySQL 学习笔记,不怕你不会,就怕你不学!