首页 > 技术文章 > nginx+keepalived

feixiong1 2020-12-03 21:55 原文

Nginx反向代理、负载均衡、动态分离和高可用

1、正向代理和反向代理

正向代理:如果客户端向访问谷歌网站,直接访问不同,会找一个代理服务器,通过代理服务器发送请求到谷歌网站,再返回到客户服务器。(通俗讲法:a向c借钱,c不借,找b去问c借钱,b借到钱后再给c)

反向代理:与正向代理相反,客户端先访问反向代理服务器地址,再向服务器发送请求并返回数据。(通俗讲:a想借钱,但不知道找谁借,找了个网贷平台,由网贷平台去找金主把钱借给你)

区别:1、正向代理隐藏了客户端,例子中c并不知道是谁真正借了钱,他以为是b。反向代理则隐藏了真正的服务器,图中只暴露了反向服务器地址www.goole.com,例子中a并不知道是谁借钱给他,只知道是网贷,并且对a而言,网贷和金主是一起的,即反向代理服务器和服务器是一体的。

D7OKW6.jpg

​ 这张图可同时作为正向代理反向代理的说明

2、负载均衡

如图,传统的单对单的服务模式在遇到高并发的情况时,有可能发生崩溃现象,仅仅依靠提升性能并不能解决根本问题,所以产生了负载均衡的办法,通过一些工具的帮忙,如Nginx,将多个请求分发到不同服务器中,避免发生都分发到同一台服务器当中。方式有平均分发、权重分发、haship等。。。

D7XSne.png

分布式Session的问题

产生原因:因为session是存储在服务器端的,当服务集群部署的话默认是被轮询访问的,这时候一台服务器存储的有session,另外一台服务器没有存储session就会产生分布式session的问题。

解决方案:

1、使用Spring-session 框架

2、使用 token 代替 session ,token 存储在redis中。

D7Ov6O.png

3、动静分离

动静分离:动态资源(jsp、ftl、thymeleaf)与静态资源(js、css、img)分开部署。

前后分离:接口与视图分开部署,专业的人做专业的事情。例如:前端使用vue.js ,后端只需要提供接口即可。前端项目与后端项目都是独立部署的。

如果我们静态资源与动态资源存放在同一台服务器上面,当静态资源不断增多的时候,我们的服务器访问是扛不住,因为静态资源消耗过多的带宽,导致静态资源无法访问或者访问非常的慢。在一个网站中,静态资源(js、css、img)是比较占宽带资源的,动态资源占带宽很小。1M带宽=128k/s

所以网站中的静态资源一般都存放在第三方存储平台上,例如:七牛云、阿里云、腾讯云等。这些第三方存储平台内置CDN,进行内容分发,采用就近访问原则。

动静分离架构模式的缺点:

举栗子:我们服务访问呢地址:http://www.test.coim,静态资源存放地址:http://static.test.com

这样的话就会产生跨域的问题,因为域名地址不同。所以这个时候我们可以使用Nginx来解决跨越问题。

解决跨域问题:

当访问 www.test.com/static的时候 使用 nginx 拦截 转发到 static.test.com

当访问 static.test.com 的时候转发到真实的ip地址。

D7Ov6O.png

4、高可用性

高可用:两台业务系统启动着相同的服务,如果有一台故障,另一台自动接管,我们将将这个称之为高可用;

如果Nginx服务器只有一台,出现宕机的话所有的事情都会做不了,单纯的增加复数Nginx服务器,当一台机宕掉,再手工切换也会浪费时间。

我们可以通过keekpalived+Nginx处理,设置主从关系,设置一个虚拟ip地址给客户端访问,然后将虚拟ip与复数Nginx服务器绑定,设置主从关系,keekpalived会不断访问服务器状态是否存活。当主服务器宕掉了,会自动切换成备份的服务器。

推荐阅读