Linux基础——Web(三)Nginx反向代理1

反向代理

负载均衡器

Web节点前边的设备为负载均衡器

作为负载均衡器的开源产品常见的有三类:LVSNginxHaproxy

LVS四层负载均衡,Nginx七层负载均衡,Haproxy四七都有

四层七层遵顼的就是OSI网络模型

LVS

工作在传输层,拆掉MACIP头部,读取TPC头部信息。

通过修改MACIP头部来达到负载均衡的目的。

 

由于本身只有四层功能,所以无法查看或修改原始数据,因此,LVS的负载均衡功能无法对数据包本身的原始数据做任何修改,只是纯最意义上的数据包转发功能。所以,LVS是通过转发数据包来实现的负载均衡的功能。

思考:修改MAC头部和修改IP头部的目标IP有什么区别?

修改MAC实现转发,意味着后方的Web节点必须和LVS服务器处于同一网段;修改IP实现转发,意味着后方的Web节点可以和LVS不在同一网段。

建立连接需要经过三次握手,那么LVS转发甚至连三次握手都可以转发,因此用户虽然目标IPLVS,但是真正和用户握手的目标是后方的某个Web节点。建立了数据连接的Web节点会直接处理用户的数据请求,不会再经过LVS负载均衡器。

转发

原理

 

因此,每次数据包只经过一次LVS,由于LVS是纯粹的转发数据包 ,不对数据包做任何改变,进入到四层就出来了,因此VLS的转发效率极高,对服务器的资源占用很小,并且数据包只经过一次LVS,对LVS服务器造成的压力就很小,因此LVS可以支持很大的并发空间,一般可以支持三十万左右并发。

总结:LVS四层结构的负载均衡器,是通过转发来实现的负载均衡功能,不会对数据包做任何修改。

Nginx

七层反向代理

为何叫反向代理而不是负载均衡?

Nginx是通过反向代理实现了负载均衡的功能。所谓七层,意味着nginx可以修改用户数据包的原始数据。

所谓代理,代替用户===>发起请求。

 

nginx出来后,所有源变成nginx自己,代替用户发起请求。

用户发给代理,代理转给WebWeb回给代理,代理回给用户。

所以nginx本质是通过代理实现的负载均衡功能,代替用户发起请求完成用户的访问。

由于Nginx是七层结构,数据包要经过七层代理出去,因此对服务器的资源占用较大,并且一个请求的数据包要两次经过Nginx,因此更会拖累Nginx的处理效率。一般Nginx最大可以支持三万的并发。效率远低于LVS

LVSnginx

LVS四层功能单一,只能转发,然而Nginx七层意味着还可以进行用户的URL过滤。例如:location

反向代理实现负载均衡:

http{

  upstream www_pool {      //负载均衡池名字

    server IPA:端口 参数(weight=1);  //权重值,是指我们的负载均衡池是权重轮询。轮询就是1:1的关系,用rr表示,每个节点负载一次;权重轮询,根据权重值按比例分配,用wrr表示,如果上面是1,下面是2,那么就是上面执行一次,下面执行两次。默认11

    server IPB:端口 weight=1 nax_fails=1 fail_timeout=10;

}

server{

  listen 80;

  location / {

      proxy_pass http://www_pool    //根据需求推送负载均衡池名字

}

}

}

//反向代理推送的是请求,所以要加http

用户的请求发送到server,然后server将其推送到负载均衡池,由负载均衡池进行选择要发送到的IP、端口。

nax_fails:默认值,针对后方检测,如果后方节点坏了,可以被检测出来,出现错误后,不会再将错误结果带给后方节点。

负载据均衡搭建

1.

部署两台服务器,用来当Web节点,每台服务器上都需安装nginx;再部署一台ngxin服务器用来做nginx代理。(可以正常访问网页即可)

记得部署完nginx后,再每台服务器的/etc/hosts添加自己的ip和域名,用于访问,否则自己不能使用crul命令进行解析。

 

 

两台Web节点都能访问网页,拥有自己的IP

 

负载均衡器IP200.4,映射的/etc/hosts为自己即可。

2.

[root@Nginx ~]# cd /usr/local/nginx/conf/

//进入nginx配置目录

[root@Nginx conf]# vim nginx.conf

//修改主配置文件

 

用户访问域名进入负载均衡器,先进入server模块,然后再进入location,被推送到了xiaofa负载均衡池,由负载均衡池进行访问Web服务器的推送分发

 

由于是rr,也就是11轮询关系,所以每个节点推送一次。

 

修改后重启服务:nginx  -s  reload

 

由于是wrr,权重轮询按比例分配,先执行一边最后的,然后再按比例进行轮询。

3.

[root@Nginx conf]# vim nginx.conf

//修改主配置文件

 

 

用户访问网页,通过负载均衡器中的server模块交给location模块进行匹配,匹配到合适的内容后,按照其对应的负载均衡池中的ip进行Web节点的推送

添加一个负载均衡池,并添加新的location模块,指定匹配字符upload

[root@Web2 ~]# cd /usr/local/nginx/html/www/

//进入Web2服务器的www目录

[root@Web2 www]# mkdir upload

//创建一个upload目录

[root@Web2 www]# cd upload/

//进入upload目录

[root@Web2 upload]# echo "I am upload" > index.html

//创建一个网页

[root@Nginx conf]# curl www.xiaofa.com/upload/index.html

//Nginx负载均衡器上测试

根据不同的location情况,我们可以将其推送到不同的负载均衡池。

 

但是我们访问的www.xiaofa.com,再访问其他域名,回馈的依旧是www,这是为什么?

 

如果我们将IP写成域名,那么本机就需要做映射,但是映射是一对一的关系,没办法实现多对一(即一个IP多个域名访问)。所以在负载均衡池只能写IP

用户将请求给反向代理后,用户的报文中有一个变量hosts,里面保存的是域名,但是通过代理发出后的包里域名变成了IP。那么我们只要将用户报文中的域名取出,覆盖到Nginx报文中,用域名覆盖IP

在配置文件添加:proxy_set_header host $host;

                proxy_set_header X-Forwarded-For $remote_addr;

第一个host是代理发起请求的hose,第二个host是用户发来的请求报文里的host,取用户发起报文里的host赋给代理将要发起报文host里的值,进行域名传递。

1.

[root@Nginx conf]# vim nginx.conf

//修改主配置文件

 

[root@Nginx conf]# nginx -s reload

//重启服务

 

域名传递成功

[root@Web1 logs]# cat access.log

//查看Web1节点访问日志

 

Web的访问日志中,记录的访问域名的设备的IP地址。但是,用户是通过代理进行转发访问的,所以记录的都是LB的地址,但是我们分析是需要分析用户的IP地址。

在主配置文件中添加:

log_format main ‘$remote-addr-$remote-user[$time_local]“$request”’

‘$status $body_bytes_sent “$http_referfer”’

‘“$http_user_agent”“$http_x_forwarded_for”’;

RSreal server是真实的服务器,也就是后方节点

1.

[root@Web1 conf]# vim nginx.conf

//修改主配置文件,编写日志格式化

 

[root@Web1 conf]# vim conf.d/www.cnf

//进入www配置文件进行修改

 

[root@Web1 conf]# nginx -s reload

//重启服务

[root@Web1 nginx]# cd logs/

//进入logs日志目录

 

在负载均衡器上进行访问测试

 

[root@Web1 logs]# cat access_www.log

//Web节点上查看访问日志

 

最后的“-”为空,在用户发来的报文里,有个字段叫做remote_addr,这

个字段记录了用户的来源IP,我们将其赋值给这个空字段,让该字段有值,就可以达到记录用户IP的操作。

[root@Nginx conf]# vim nginx.conf

//进入负载均衡器配置文件进行修改

 

添加一个改内容,其含义为:用户请求报文里的remote_addr将值赋给X-Forwarded-For这个变量。从而将用户IP赋到了新字段里

[root@Nginx conf]# nginx -s reload

//重启服务

[root@Web1 logs]# tail -f access_www.log

//动态追踪access_www.log日志中的内容

//Ngxin代理进行访问测试

//获得IP

//C盘的Windows\System32\drivers\etc路径下的hosts文件中,添加映射

映射的IP为负载均衡器nginx的地址

//浏览器访问

 

//获得用户的IP网关地址,也可以在配置文件,将获得IP这条命令往前移,使看的更加清晰。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值