一、反向代理🍉
(1)什么是正向代理🥝
概念
正向代理是一个位于客户端和目标服务器之间的代理服务器(中间服务器)。为了从目标服务器取得内容,客户端向代理服务器发送一个请求,并且指定目标服务器,之后代理向目标服务器转发请求,将获得的内容返回给客户端。正向代理的情况下,客户端必须要进行一些特殊的设置才能使用。
正向代理: 代理的客户端,对于服务器来说不知道真实的客户。
当出现多个请求客户端时,是这样的:
总结一下,用最简单粗暴的说法:「正向代理」指一对一或多对一,Server 不知道请求的 Client 都是哪些人。
(2)什么是反向代理 🥝
反向代理恰好跟正向代理相反。同时反向代理一般是负载均衡的一个原理。按照上面所说,正向代理是一对一或多对一,那么反向代理就是一对多,画图说明:
什么场景会用到呢?拿打客服电话举个例子:有天不小心 QQ 被盗,你气急败坏的打电话给客户热线,你打的这个电话是总线,最终会分配给具体某位客服 MM 来处理。这个时候总线就是我们的「反向代理」,它的作用体现在当有 100 个人同时打进总线的时候,能够合理的分配空闲的客服 MM 来对接,这也是负载均衡的概念。大部分访问量大的网站,如百度,都会做负载均衡,其中反向代理服务器起着至关重要的角色。所以你也可以猜测反向服务器对应高并发的能力也必须很强(这就是为什么 Node 会作为一个反向代理服务器的后台语言之一)。
反向代理隐藏了真实的服务端,当我们请求 http://www.baidu.com 的时候,就像拨打 QQ 客服热线一样,背后可能有成千上万台服务器为我们服务,但具体是哪一台,你不知道,也不需要知道,你只需要知道反向代理服务器是谁就好了,http://www.baidu.com 就是我们的反向代理服务器,反向代理服务器会帮我们把请求转发到真实的服务器那里去。
当然,除了一对多,还有多对多(很多用户同时访问同一个网站):
最后总结
两者的区别在于代理的对象不一样:正向代理代理的对象是客户端,反向代理代理的对象是服务端。
(3) 在Nginx上实现反向代理🥝
1.准备:🍓
搞一台真实服务器----tomcat项目。----搞一个springboot项目并放入linux服务器系统
2.运行springboot项目🍓
//java -jar 项目名
java -jar qy165-demo01.jar
3.在另一个窗口配置nginx来代理上面springboot真实项目服务。🍓
server{
listen 82;
server_name localhost;
location /{
# http://被代理的服务器IP和Port 端口号
proxy_pass http://192.168.179.129:8080;
}
}
4.重新加载nginx配置文件🍓
先启动nginx
//进到nginx脚本命令目录下
cd /usr/soft/nginx/sbin
//执行nginx
./nginx
关闭防火墙
//关闭防火墙
systemctl stop firewalld
//查询防火墙状态
systemctl status firewalld
//查询tomcat状态 防止端口冲突
ps -ef |grep tomcat
刷新Nginx配置文件
//刷新Nginx 配置文件
./nginx -s reload
5.浏览器访问nginx🍓
二、负载均衡🍉
(1)什么是负载均衡🥝
负载均衡建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。
负载均衡(Load Balance)其意思就是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。
(2)在Nginx上实现负载均衡🥝
1.准备🍓
启动两台虚拟机确保虚拟机ip不一样
2.启动两个springboot项目🍓
//java -jar 项目名
java -jar qy165-demo01.jar
java -jar qy165-demo02.jar
3.在另一个窗口配置nginx负载均衡🍓
#upstream表示为真实集群服务器
upstream qu165{
server 192.168.223.147:8080;
server 192.168.223.167:8080;
}
server {
listen 82;
server_name localhost;
location /{
# http://被代理的服务器IP和Port端口号
proxy_pass http://qy165;
}
4. nginx重新加载配置文件🍓
//在sbin目录下刷新Nginx 配置文件
./nginx -s reload
5.浏览器访问nginx🍓
(3) 负载均衡策略🥝
- 四层负载均衡四层负载均衡工作在OSI模型的传输层,由于在传输层,只有TCP/UDP协议,这两种协议中除了包含源IP、目标IP以外,还包含源端口号及目的端口号。四层负载均衡服务器在接受到客户端请求后,以后通过修改数据包的地址信息(IP+端口号)将流量转发到应用服务器。
- 七层负载均衡七层负载均衡工作在OSI模型的应用层,应用层协议较多,常用http、radius、dns等。七层负载就可以基于这些协议来负载。这些应用层协议中会包含很多有意义的内容。比如同一个Web服务器的负载均衡,除了根据IP加端口进行负载外,还可根据七层的URL、浏览器类别、语言来决定是否要进行负载均衡。
常见负载均衡算法
轮询(Round Robin)
请求到达后,将客户端发送到负载均衡器的请求依次轮流地转发给服务集群的某个节点。
优点:实现简单,每个集群节点平均分担所有的请求。
缺点:当集群中服务器硬件配置不同、性能差别大时,无法区别对待。引出下面的算法。
随机(Random)
随机选取集群中的某个节点来处理该请求,由概率论的知识可知,随着请求量的变大,随机算法会逐渐演变为轮询算法,即集群各个节点会处理差不多数量的请求。
优点:简单使用,不需要额外的配置和算法。
缺点:随机数的特点是在数据量大到一定量时才能保证均衡,所以如果请求量有限的话,可能会达不到均衡负载的要求。
加权
加权算法主要是根据集群的节点对应机器的性能的差异,给每个节点设置一个权重值,其中性能好的机器节点设置一个较大的权重值,而性能差的机器节点则设置一个较小的权重值。权重大的节点能够被更多的选中。它是和随机、轮训一起使用的。
优点:可以根据机器的具体情况,分配不同的负载,达到能者多劳。
缺点:需要额外管理加权系数。
最小连接数
主要是根据集群的每个节点的当前连接数来决定将请求转发给哪个节点,即每次都将请求转发给当前存在最少并发连接的节点。
优点:可以根据集群节点的负载情况来进行请求的动态分发,即机器性能好,处理请求快,积压请求少的节点分配更多的请求。避免某个节点因为处理超过自身所能承受的请求量而导致宕机或者响应过慢。
hash
将对请求的IP地址或者URL计算一个哈希值,然后与集群节点的数量进行取模来决定将请求分发给哪个集群节点。它不是真正意义上的负载均衡,在某些意义上也是一个单点服务。
优点:实现简单
缺点:如果某个节点挂了,会使得一部分流量不可用。
负载均衡分类
-
硬件负载均衡
常见的硬件有比较昂贵的F5和Array等商用的负载均衡器,它的优点简单,有专业的人负责;缺点就是 贵 如果你是土豪,可以考虑,但是对于规模较小的网络服务来说暂时还没有需要使用。 -
软件负载均衡
目前使用最广泛的三种负载均衡软件Nginx/LVS/HAProxy,他们都是开源免费的负载均衡软件,这些都是通过软件级别来实现,所以费用较低。足以见得,搞软件的是多么不值钱! -
成熟的架构
负载均衡业界早已有成熟的架构,比较常用的有LVS+Keepalived、Nginx+Keepalived、HAProxy+Keepalived。
Nginx的负载均衡支持:
- rr:轮叫,轮流分配到后端服务器;
- wrr:权重轮叫,根据后端服务器负载情况来分配;
- lc:最小连接,分配已建立连接最少的服务器上;
- wlc:权重最小连接,根据后端服务器处理能力来分配。
Nginx优点:
1.简单:安装和配置比较简单、测试也简单
2.稳定:单机一般能支撑几万次的并发量
3.轻量:能ping通就就能进行负载功能
4.易用:明确的错误码、超时提醒
5.强大:负载均衡、反向代理、WEB容器等功能
Nginx缺点:
1.仅能支持http、https和Email协议
2.对后端服务器的健康检查, 只支持通过端口来检测,不支持通过url来检测
roundrobin:轮询,轮流分配到后端服务器;
static-rr:根据后端服务器性能分配;
leastconn:最小连接者优先处理;
source:根据请求源IP,与Nginx的IP_Hash类似。
默认使用轮询策略
权重策略:----合适服务器的配置不同,被访问的频率不同。
ip_hash: ----根据客户端的ip分配相应真实服务器。
三、动静分离🍉
(1) 什么是动静分离🥝
在Web开发中,通常来说,动态资源其实就是指那些后台资源,而静态资源就是指HTML,JavaScript,CSS,img等文件。
动静分离,说白了,就是将网站静态资源(HTML,JavaScript,CSS,img等文件)与后台应用分开部署,提高用户访问静态代码的速度,降低对后台应用服务器的请求。后台应用服务器只负责动态数据请求。
优势:分担负载,减轻web服务器的压力,适用于大负载。静态资源放置cdn,同时还可以通过配置缓存到客户浏览器中,这样极大减轻web服务器的压力。
劣势:网络环境不佳时,ajax回应很慢,导致页面出现空白,出错处理会不好看。不利于网站SEO(搜索引擎优化),增加了开发复杂度。
把静态资源【css,js,img】交于nginx来处理,而动态资源[接口,jsp]还是有真实服务器处理
好处: 当修改静态资源时,无需对每个真实服务器的静态资源做修改,只需要修改nginx一处的静态资源。
(2) 在Nginx上实现动静分离🥝
1.准备🍓
准备一个springboot项目
项目启动效果
2.nginx 配置静态文件路径🍓
server{
listen 82;
server_name localhost;
location /{
# http://被代理的服务器IP和Port 端口号
proxy_pass http://192.168.179.129:8080;
}
#配置静态资源如果你访问的资源以.jpg .css等结尾的 则找static目录下的资源
location ~\.jpg|.css|.js|.png|.jpeg|.gif$ {
root static;
}
}
3. nginx重新加载配置文件🍓
//在sbin目录下刷新Nginx 配置文件
./nginx -s reload
4.将需要用的静态文件拉到nginx中🍓
需要先在nginx目录中创建static目录
5.运行springboot项目🍓
将jar包拉到Linux中
启动项目
//启动静态分离springboot项目
java -jar Nginx-0.0.1-SNAPSHOT.jar