X-Forwarded-For和有效负载均衡

X-Forwarded-For和有效负载均衡,第1张

nginx 反向代理是什么?

为了提高吞吐量,有些服务器是专门跑程序用的,有些服务器是跑静态资源的。

你可能访问一个网页,里面有,而这个并不是你访问的这个网页的服务器,也叫前端服务器,而是你的请求被 Nginx 转发到了一台后端服务器,由后端服务器提供给前端服务器再返回到客户端的。

我这台 nginx 的配置非常细致,有 nginxconf ,在这个配置中包含了两个文件夹,一个是 sites-available ,一个是 sites-enabled , nginxcof 一般用来做整个 nginx 的配置。

域名配置段在 sites-avaliable 下,然后建立一个软连接到 sites-enabled 下去。

反向代理就写在域名配置段里,客户端通过访问服务器,服务器将请求分配按照 server 段里的则正匹配,将请求按照 fastcgi 发送到 php-fpm 通过分配再到我们的程序。

反向代理一样,也需要通过正则来捕捉到用户的请求。(2018-12-9,现在流行的做法是将静态资源全部压缩打包,丢到cdn上去,服务器基本只做端口转发,>

LVS 负载均衡 设计文档 2017-03-12 By Coder Yang

技术准备:

1对OSI7层网络架构理论有基本认识 对交换机 路由器 实现交换通信原理有基本认识 2熟悉基本linux *** 作

3对vm软件及 网卡的桥接、nat模式、仅主机模式有一定了解(保证虚拟机里的linux系统可以访问外网)

软件环境:

一台win7/xp电脑 ,一个vm软件,一个linux镜像,每台虚拟机上都安装好apache,开启>

手游服务器的真实IP是指游戏服务器的真实IP地址,一般是游戏服务器的物理位置的IP地址。由于游戏服务器是由游戏公司运营的,因此手游服务器的真实IP通常是游戏公司拥有的IP地址,以便让玩家能够访问到服务器上的游戏资源。游戏服务器真实IP可以通过游戏客户端或者游戏后台来获取,这样可以确保游戏数据的安全性和稳定性。

 Ip Tunnel,又叫IP隧道,顾名思义,LVS通过在IP数据包外面再封装了一层Ip Tunnel 头部,将数据包的源地址改写为LVS自身的物理地址,目的地址改写为RS的物理地址,从而实现跨网段访问RS。整个过程看起来好像LVS和RS之间有一条隧道,数据包通过这条虚拟的隧道进行传输。

如下图所示:

 Ip Tunnel模式下,客户端的请求包到达负载均衡器的虚拟服务IP端口后,负载均衡器不会改写请求包的IP和端口,但是会在数据包IP层外面再封装一个IP层,然后将数据包转发;真实服务器收到请求后,会先将外面封装的Ip Tunnel头去掉,然后处理里面实际的请求报文;与DR模式类似,响应包也不再经过LVS,而是直接返回给客户端。所以Ip Tunnel模式的转发效率虽然弱于DR,但是强于NAT。

 既然Ip Tunnel模式的性能比不上DR,那为什么还要用它呢? 因为它可以跨网段转发!

 Ip Tunnel模式最大的优点就在于它可以跨网段转发,没有DR和NAT模式的组网限制。这在部署上带来的很大的灵活性,甚至还可以跨机房转发,不过不建议这样使用,一是会带来跨机房间的流量,提高了成本;二是跨机房转发必然会要在RS机房上绑定LVS机房的VIP,这有可能会被运营商的防火墙认为是IP伪造请求而拦截。

 注意这里只写了与DR模式配置不一样的地方,lvs上配置vip之类的就没写了。

 注意Ip Tunnel模式下需要将RS上的rp_filter参数配为0,否则无法正常工作,因为RS是在物理网卡收到请求,但是VIP是绑在虚拟网卡tunl0上的。

 Ip Tunnel模式下,LVS会在数据报文原有的IP头部上再封装一层IP头,封装层IP头的源IP是LVS节点的物理IP,目的IP是RS的物理IP,相当于原有的数据报文是在一层封装的隧道中传输。

 这样可以解决跨网段转发的问题,但是会带来一个新的问题:

 每个数据包都要封装一个新的20字节的IP头,如果LVS上收到的数据包就已经达到了Ethernet帧的最大值1514(MTU1500+帧头14),这时候封装层的IP头就无法加进去。如果数据报文IP头中设置了DF标志位(Don't Fragment),这时候LVS就无法正常转发该报文。而是会返回一个Type=3,Code=4的ICMP报文给客户端,通知客户端目的地不可达,需要分片,并且在通知报文中指定了本端的MTU为1480。如果客户端支持PMTUD协议,那么客户端会根据ICMP中通知的MTU值重新计算合适的MSS,对要发送的数据进行分片后再重传给LVS节点。

 下图是TUN模式下LVS上的抓包,可以看到一开始LVS收到的数据包的data长度为1460,加上20字节TCP头,加上20字节IP头,已经达到MTU1500了(抓包大小为1514是算上了14字节的Ethernet帧头)。

 这时候LVS无法转发,通过ICMP报文通知客户端分片后重传。

 可以通过减少RS侧的MSS值,比如调到1400。这样客户端在和RS三次握手协商MSS的时候,就会使用修改后的MSS值。这样客户端网卡在对数据包进行分片时就会减小单个请求中的data大小,确保LVS上收到的请求大小不会超过1480,从而不会触发到上述的问题。

 iptables配置方法如下,实际情况中可以根据需求指定规则所要匹配的ip地址,这样可以减小配置修改的影响范围。

 下面是修改后的客户端上的抓包结果:

 从上图可以看到客户端在三次握手过程中收到的RS沟通的MSS值为修改后的值1400。

(注意wireshark中之所以能抓到超过1514字节的包,是因为目前大部分机器上都是开启了TSO/GSO的,TCP分片的工作下放给了网卡驱动去做;而wireshark抓到的是网卡缓冲区中的数据,还没有进行分片,所以有可能会看到大于1514的包;但是在真正发送出去的时候网卡驱动会根据MSS对TCP报文进行分片;可以对比服务端收到的抓包,服务端上收到的包就不会超过1514字节了)

 下面是LVS上的抓包结果:

 下图展示的就是LVS收到No 1442的请求包,大小为1454字节;插入20字节的封装头后,数据包变为1474字节,然后转发给RS。

以上就是关于X-Forwarded-For和有效负载均衡全部的内容,包括:X-Forwarded-For和有效负载均衡、IPVS(LVS)负载均衡简介及实验测试、nginx 反向代理和后端服务器获取真实 ip等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9564134.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-29
下一篇2023-04-29

发表评论

登录后才能评论

评论列表(0条)

    保存