一、nginx的反向代理和负载均衡

1.七层代理

nginx反向代理分七层代理和四层代理。七层代理是在应用层实现,面向基于http协议的服务,后端服务一般是nginx,tomcat。七层应用层的代理在http模块内实现。

1)单纯的反向代理

3a26a1a4ca164ee1afa31fbdd498f9a2.png

2)七层反向代理并且负载均衡

Module ngx_http_upstream_module

6a258aa0cad24d2297900de538474424.png

upstream模块是nginx在编译的时候自带的(我这个nginx是自己编译安装的)

ae73a76c3eb1475c827e0275c460beb1.png

最基本的反向代理及负载均衡的实现

vim /apps/nginx/conf/nginx.conf

2292cad402ca475c8aa3a70cd58f4ea7.png

实现对多个服务的反向代理和负载均衡

vim  /apps/nginx/conf/nginx.conf

c2cbb22dcaff497c93636ee94a7c5dfe.png

vim /apps/nginx/conf/conf.d/upstream.conf

8d458739b561486eabc0e1e1c27dc7b7.png

反向代理缓存功能:

在http模块中配置,在server或者localtion中调用

3f21962935a14410890ddd87d315b866.png

ff57a38d427e44dc8cd3ae39533c61ef.png

 

nginx自带健康性检查:

检就是查后端服务器有没有出现问题,如果这个服务器出现问题,就自动只把客户的请求转到其他可用的服务器上

 

 

2.四层代理

nginx的四层代理(运输层),基于tcp,udp协议,如果后端服务器是mysql,redis服务器,就可以基于tcp协议进行反向代理,如果后端涉及到dns解析就可以使用upd协议。

nginx的四层代理的模块要写在stream模块内。与http模块同一级别。

19a5d12d71ee40a79b1d89109f86bb7e.png

配置如下

vim /apps/nginx/conf/nginx.conf

d18e36646f994084a09b173bebd1691e.png

3.负载均衡算法

轮询调度

负载均衡默认的是普通的轮询调度算法,单个权重是1,总权重是2,各占50%概率

9475b1c33f1d4da7bdd72821fd986e38.png

hash算法

对cookie做hash运算得到一串字符,然后与权重进行模运算得到一个固定值,第一次随机调度到一个后端服务器,但是第一次确定之后,后面都会调度到这个机器。即相同的cookie会调度到通一个后端服务器上。(同理,也可对源ip等做hash运算进行调度)

f3879343b3114798b9f02b95815e2a43.png

cookie和session的作用

当一个服务需要用户发送姓名和密码验证身份的时候,用户先发送用户姓名和密码到服务器,然后服务器进行验证发现正确,与用户端建立一个会话session,然后会将验证身份成功的sessionid放到cookie里(一般是一串字符)返回给用户,下次用户再来携带这个cookie的时候服务器就知道是已经验证过身份的用户,无需再去认证。这个会话的持续时长由服务端去规定。用户的cookie过期后就需要重新登陆。

一致性hash算法

一致性hash,是让已经生成的hash字符串对2的32次进行取模,然后得到得范围十分的大,就近似为一个圆。

首先是让后端服务器的ip进行hash,然后对2的32次方取模。后端服务器都会在这个圆中有一个位置。然后调度服务器上假设是对客户端ip进行hash,客户端ip进行hash之后也与2的32次方进行取模。然后每一个客户端也会在圆上有一个位置,这个客户端离哪个服务端的位置近就,这个客户端的请求就会被调度到哪个服务端。

 

470fb61059f4436580c5c88a14c9ace5.png

fb026059f2154c8ba39870d5bef8f993.png

但是如果服务器最后hash后落的地址太近了就会导致分布不均匀,然后有些服务器上的客户多,有些服务器很闲。

19a0631680194aa295149ea437109f69.png

解决方法:

可以让服务器,比如后端一个服务器192.168.75.133,让它绑定多个虚拟ip,然后让这些ip也hash然后取模落在圆上,然后如果客户端离哪个虚拟ip更近,就调度到哪个虚拟ip绑定的真实服务器上。

二、IP透传

IP透传只在haproxy和nginx反向代理的时候才有。lvs只能实现四层(传输层)的反向代理,在服务端可以直接看见客户端的IP,可以把lvs看作一个路由器。但是nginx和haproxy在七层(应用层),nginx会分别在客户端和服务器端建立tcp三次握手连接,在服务端如果不进行配置的话是只能看见代理器的IP。

代理服务器设置

410753082a6c4db89818e094018720c2.png

服务器上设置

47d7579687484a3ab638fefa55ceccf8.png

然后在服务器日志就能看见客户端ip

9302f5083e134caf99a1637ba897457e.png

 

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐