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