Nginx反向代理和负载均衡(后端复习)
一,Nginx基础
1.Nginx简介
nginx是一个开源高性能,可靠的http中间件,代理服务。它是一个web服务器,可以用作反向代理,负载均衡器和http缓存
2.Nginx由来
早期
一个网站的初期,访问的流量比较小,选用的架构可能就是用户通过域名,经过域名解析,拿到后端服务器的IP地址,直接访问这个ip对应的Tomcat服务器。
发展
随着用户流量的增大,一台Tomcat服务器无法满足用户的请求,人们会想到两个办法:
- 垂直扩展:升级服务器硬件(成本高)
- 水平扩展:增加新的服务器来分担流量(DNS服务器难以管理这么多的ip)
- 后端的某台机器宕机后,DNS 服务器不知道该机器宕机,仍然解析到了这个 IP,如果用户访问到了这个宕机的 IP,那么系统无法为用户提供服务;
- DNS 服务器配置新的 IP 后,它不会立即生效,那么在它生效的这个时间段,新加的服务器不会为用户提供服务。
反向代理和负载均衡
现在,用户通过域名访问,DNS服务器返回反向代理服务器的IP,反向代理服务器根据被代理服务器的IP配置和负载均衡策略,转发用户的请求到不同的后端服务器处理,后端服务器将处理结果响应给反向代理服务器,在通过反向代理服务器反映给用户。这就是nginx所要做的.
集群
随着流量的继续增大,单台反向代理服务器成为了瓶颈,我们就会对其做集群,解决高性能的问题,对其做主备解决高可用的问题。
二,Nginx反向代理实现
1.正向代理和反向代理
正向代理
- 正向代理隐藏了真实的客户端,服务端不知道是哪个客户端请求服务端,虽然客户端是通过代理服务器请求的服务端,但是因为服务端只知道是代理服务器的请求,所以,正向代理可以将真实客户端和代理服务器整个看成一个客户端
反向代理
- 反向代理则和正向代理相反,在反向代理中,客户端不知道请求的服务端是谁,只知道是代理服务器带来的响应,所以在反向代理中,可以将服务端和代理服务器整体看成是服务端。
2.反向代理实例
启动Tomcat8080端口
将本机ip加监听端口的请求转发到8080端口
server {
listen 8082; #监听端口
#server_name localhost;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
index index.html index.htm index.jsp;
}
三,Nginx负载均衡实现
1.什么是负载均衡?
负载均衡就是用户通过(IP)访问入口访问nginx服务器,nginx服务器通过负载均衡策略将请求分发到某一个后端Tomcat服务器
2. 负载均衡如何选择要转发的后端服务器
-
第一个就是确保所选择的后端服务器是正常工作的,能给对用户的请求做出响应
-
第二个就是根据负载均衡算法从健康服务器池中进行选择。
3.负载均衡算法
在具体谈负载均衡算法时,我们先了解下nginx中的upstream模块中的参数
upstream test.net{
#ip_hash;
server 127.0.0.1:8082;
server 127.0.0.1:8080;
#server 127.0.0.1:8080 down;
#server 127.0.0.1:8080 backup;
}
在upstream模块中配置的是server即后端服务器列表,上边我配置了两个,是同一ip下的(条件不允许我,也没去弄虚拟机,愿体谅)
- down:配上down的server不参与负载均衡
- weight:权重,weight越大的,权重越大
- backup:其他全部的非backup机器忙或者down的时候,才请求backup机器,backup 不能和ip_hash一起使用
- ip_hash:使用ip哈希负载均衡算法,weight\backup 不能和 ip_hash 关键字一起使用。
- least_conn 最少连接数
- 轮询:
为第一个请求选择健康池中的第一个后端服务器,然后按顺序往后依次选择,直到最后一个,然后循环。 不必关心服务器实际的连接数和当前的系统负载
正常情况下没配置,默认是轮询算法
upstream test.net{
server 127.0.0.1:8082;
server 127.0.0.1:8080;
}
- ip_hash:
根据请求源的 IP 的散列(hash)来选择要转发的服务器。这种方式可以一定程度上保证特定用户能连接到相同的服务器。如果你的应用需要处理状态而要求用户能连接到和之前相同的服务器,可以考虑采取这种方式。(同一ip地址的客户端,当后端服务器列表不变时,他每次都会映射到同一台后端服务器进行访问)
upstream test.net{
ip_hash;
server 127.0.0.1:8082;
server 127.0.0.1:8080;
}
- 最小连接优先:
优先选择连接数最少,也就是压力最小的后端服务器,在会话较长的情况下可以考虑采取这种方式。
upstream test.net{
least_conn;
server 127.0.0.1:8082;
server 127.0.0.1:8080;
}
-
随机分配:
通过系统的随机算法,随机从后端服务器列表选取一台服务器进行访问
-
加权轮询:
根据给后端服务器分配的比重不同,nginx在分配请求时会根据权重不同,把配置高,负载低的机器配置更高的权重,让这些机器处理更多的请求,让配置低,负载高的机器分配的权重低,处理的请求少。 将请求顺序且按照权重分配到后端。
upstream test.net{ server 127.0.0.1:8082 weight=3; server 127.0.0.1:8080 weight=1; }
-
加权随机:
与加权轮询法一样,加权随机法也根据后端机器的配置,系统的负载分配不同的权重。不同的是,它是按照权重随机请求后端服务器,而非顺序。
4.实例
upstream www.kevin.com {
server 127.0.0.1:8082 weight=3;
server 127.0.0.1:8080 weight=1;
}
server {
listen 80; #监听端口
#server_name localhost;
location / {
proxy_pass http://www.kevin.com;
proxy_set_header Host $host;
index index.html index.htm index.jsp;
}
启动一个springboot项目,内置Tomcat是8082端口,因为这是个原先的项目,我直接用来nginx测试,待会如果看到报错500是因为请求需要token,但是看到这个之后,证明分到了这个端口
在开启8080的tomacat
在浏览器使用本机ip加监听端口访问,nginx会根据权重轮询,分发请求
第一次请求:
第二次请求:
第三次请求: