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)$ {
? proxy_pass http://10.10.0.23:80;
? }
|