Nginx 七层负载均衡

# 负载均衡
# 方式一:
# 同样资源放置多个链接让用户自己点其中一个链接去访问。如:我们下载资源的时候,经常会出现“广东电信”、“湖北电信”……
# 方式二:
# 通过域名去做负载均衡,因为一个域名我们可以配置多个ip地址,
# 当一个域名配置了多个IP地址后,浏览器通过域名访问的时候,域名解析会轮询返回域名所绑定的IP地址
# 但问题来了,浏览器通过域名解析得到与域名匹配的IP地址后,就会将域名与域名的IP存放在本地的缓存中了,
# 所以下次再访问的时候优先从本地缓存中获取IP,而不是从DNS域名解析那里获取。所以这种程度的负载均衡并没有达到最大化
# 方式三:四/七层负载均衡。
# 网络通信的七层模型分别是:1.物理层、2.数据链路层、3.网络层、4.传输层、5.会话层、6.表示层、7.应用层
# 这里的四/七层负载均衡。对应的就是4.传输层、7.应用层
# 越靠近物理层进行负载均衡的效率越高
# Nginx可是实现四/七层的负载均衡。

# 所谓的四层负载均衡指的是OSI七层模型中的传输层,主要是基于IP+PORT的负载均衡
# 实现四层负载均衡的方式:
# 硬件: F5 BIG-IP\Radware等  //硬件有一个不好的地方时,硬件在出场后就已经固定了,我们不好去拓展
# 软件:LVS、Nginx、Hayproxe等
# 所谓七层负载均衡职到是在应用层,主要是基于虚拟的URL或主机IP的负载均衡
# 实现七层负载均衡的方式:
# 软件:Nginx、Hayproxy等
# 四层和七层负载均衡的区别
# 1.四层负载均衡数据包时在底层就进行了分发,而七层负载均衡数据包则时在顶端进行分发,所以四层负载均衡的效率比七层负载均衡的效率要高。
# 2.四层负载均衡不识别域名,而七层负载均衡识别域名。


# Nginx七层负载均衡的指令
# upstream指令:该指令是用来定义一组服务器,他们可以是监听不同端口的服务器,并且也可以是同时监听TCP和Unix socket的服务器。服务器可以指定不同的权重,默认为1.
# 语法:upstream name {...}
# 默认值:无
# 位置:http

# server指令:该指令用来指定后端服务器的名称和一些参数,可以使用域名、IP、断后或者unix socket
# 语法:server name [paramerters]
# 默认值:无
# 位置:upstream
# 例子:
upstream backend {
  server 192.169.1.101; 
  server 192.169.1.102;
  server 192.169.1.103;
}
server {
  listen 8082;
  server_name localhost;
  location / {
    proxy_pass http://backend;  //这里backend就是用upstream申明的服务器组
  }
}
# 配置完成后,192.169.1.101、192.169.1.102、192.169.1.103三台服务器循环处理用户的访问请求。

# 负载均很的状态:代理服务器在负责均衡调度中的状态有以下几个:
# down:当前的server暂时不参与负载均衡
upstream backend {
  server 192.169.1.101 down; 
  server 192.169.1.102;
  server 192.169.1.103;
}
# backup:预留的备份服务器,当103当机了才会启用102参与负载均衡
upstream backend {
  server 192.169.1.101 down; 
  server 192.169.1.102 backup;
  server 192.169.1.103;
}
# max_fails:允许请求失败的次数
# fail_timeout:经过max_fails失败后,服务暂停时间,默认是10s;
upstream backend {
  server 192.169.1.101 down; 
  server 192.169.1.102 backup;
  server 192.169.1.103 max_fails=3 fail_timeout=15;# 当服务器请求失败次数连续达到3次的时候,这时候103服务器就会暂停15秒不接收任何请求,这15秒会启用102备用服务器接收处理客户端访问请求,15秒后103会再次处理请求,如果没有失败103就算恢复正常,如果再次失败3次就继续暂停15秒。
}
# max_conns:限制最大的接受链接数,默认0,不做限制。防止服务器接收访问的请求过多而导致服务器当机。

# 方便测试当即状态,你可以在防火墙中设定端口是否放行
# 查询防火墙中指定的端口是否开放
firewall-cmd --qurey-port=9001/tcp
# 如何开放一个指定的端口
firewall-cmd --permanent --add-port=9002/tcp
# 批量添加开放端口
firewall-cmd --permanent --add-port=9001-9003/tcp
# 如何移除一个指定的端口
firewall-cmd --permanent --remove-port=9002/tcp
# 重新加载
firewall -cmd --reload

# 负载均衡策略
# Nginx默认策略是,接收客户端访问的请求后轮询分发到服务器。
# 除了轮询,Nginx还提供了其他几种分配算法
# 轮询:默认方式。weight=1.
# weight:权重方式。也就是按比例分配。轮询和weight一起的。
upstream backend {
  server 192.169.1.101 weight=10; 
  server 192.169.1.102 weight=5;
  server 192.169.1.103 weight=5;
}
# ip_hash:依据ip分配方式,也就是访问服务器的浏览器客户端所在电脑的ip。当客户访问你的网站的时候需要登录,问题来了,当你第一次访问的时候是101服务器处理登录的并且在101服务器上保存的session,而第二次访问的时候是102,这个时候102是没有session的,所以又得登录生成session依次类推,下次访问服务器地址又变成103的话是不是又得登录。而这个ip_hash就是根据这个ip来分配的,当你第一次连接的是101那么往后的请求也都是在101完成的。这种方案不好的地方在于,你设置的权重或者其它算法将不起作用。要解决这个问题,你可以在三台服务器上搭建一个共同保存session的地方,比如:redis。
upstream backend {
  ip_hash;
  server 192.169.1.101; 
  server 192.169.1.102;
  server 192.169.1.103;
}
# least_conn:依据最少连接方式。当前服务器正在连接的数量最少的优先分配。这种负载均衡策略主要是解决处理请求耗时较长的访问。
upstream backend {
  least_conn;
  server 192.169.1.101; 
  server 192.169.1.102;
  server 192.169.1.103;
}
# url_hash:依据URL分配方式。应用场景:客户端访问服务器的某个资源文件的时候,服务器不是从本地拿取文件,而是从文件系统服务器拿文件,拿到的文件如果是客户端访问频繁的资源的话,服务器会将资源文件缓存到本地,下次客户端再次访问的时候就不需要重新去文件系统中拿取了。这样就出现了ip_hash一样的问题。url_hash就是解决该问题的。
upstream backend {
  hash $request_uri;
  server 192.169.1.101; 
  server 192.169.1.102;
  server 192.169.1.103;
}
# fair:依据相应时间的方式。服务器响应越快的优先分配。
# fair算法是属于第三方的负载均衡算法,所以你需要添加nginx-upstream-fair。
# 1.下载nginx-upstream-fair模块
# 下载地址:https://github.com/gnosek/nginx-upstream-fair
# 2.解压缩:unzip nginx-upstream-fair.zip
# 3.重命名:mv nginx-upstream-fair fair
# 4.使用./configure命令将资源添加到Nginx模块中
# ./configure -add-module=/root/fair
# 5.编译:make,这时候会报一个default_port错误。
# 如何解决:在Nginx的源码中src/http/ngx_http_upstream.h中找到"ngx_http_upstream_srv_conf_s",在结构体中添加"in_port_t   default_port",注意是添加不是替换。
# 6.平滑升级。
# 7.配置fair指令
upstream backend {
  fair;
  server 192.169.1.101; 
  server 192.169.1.102;
  server 192.169.1.103;
}

# 案例一:对所有请求实现一般轮询规则的负载均衡
upstream backend {
  server 192.168.200.146:9001;
  server 192.168.200.146:9002;
  server 192.168.200.146:9003;
}
server {
  listen 8083;
  server_name localhost;
  location / {
    proxy_pass http://backend;
  }
}

# 案例二:对所有请求实现权重轮询规则负载均衡
upstream backend {
  server 192.168.200.146:9001 wight=7;
  server 192.168.200.146:9002 wight=7;
  server 192.168.200.146:9003 wight=7;
}
server {
  listen 8083;
  server_name localhost;
  location / {
    proxy_pass http://backend;
  }
}

# 方案三:对特定资源实现负载均衡
upstream videobackend {
  server 192.168.200.146:9001;
  server 192.168.200.146:9002;
  server 192.168.200.146:9003;
}

upstream filebackend {
  server 192.168.200.146:9011;
  server 192.168.200.146:9012;
  server 192.168.200.146:9013;
}
server {
  listen 8083;
  server_name localhost;
  location /video/ {
    proxy_pass http://videobackend;
  }
  location /file/ {
    proxy_pass http://filebackend;
  }
}

# 方案四:对不同域名实现负载均衡
upstream itcastbackend {
  server 192.168.200.146:9001;
  server 192.168.200.146:9002;
  server 192.168.200.146:9003;
}

upstream itheimabackend {
  server 192.168.200.146:9011;
  server 192.168.200.146:9012;
  server 192.168.200.146:9013;
}
server {
  listen 8085;
  server_name www.itcast.cn;
  location / {
    proxy_pass http://itcastbackend;
  }
}
server {
  listen 8086;
  server_name www.itheima.cn;
  location / {
    proxy_pass http://itheimabackend;
  }
}

# 案例五:实现带有URL重写的负载均衡
upstream backend {
  server 192.168.200.146:9001;
  server 192.168.200.146:9002;
  server 192.168.200.146:9003;
}
server {
  listen 8087;
  server_name localhost;
  location /file/ {
    rewrite ^(/file/.*) server/$1 last;
  }
  location /server {
    proxy_pass http://backend;
  }
}

 

posted @ 2021-11-02 10:20  看一百次夜空里的深蓝  阅读(411)  评论(0编辑  收藏  举报