14.LVS入门及nginx实现反向代理

1、LVS实现nat,dr

  1. LVS:Linux Virtual Server (Linux虚拟服务器),也是四层服务器,四层交换机,根据请求报文的目标IP和目标协议及端口将其调度转发至某RealServer,根据调度算法来挑选真实服务器;
  2. LVS调度类型
    1.lvs-nat:本质是多目标IP的DNAT,通过将请求报文中的目标地址和目标端口修改为某挑 出的RS的RIP和PORT实现转发
    (1)RIP和DIP应在同一个IP网络,且应使用私网地址;RS的网关要指向DIP
    (2)请求报文和响应报文都必须经由Director转发,Director易于成为系统瓶颈
    (3)支持端口映射,可修改请求报文的目标PORT
    (4)VS必须是Linux系统,RS可以是任意OS系统
    14.LVS入门及nginx实现反向代理_第1张图片
    2.lvs-dr:Direct Routing,直接路由,LVS默认模式,应用最广泛,通过为请求报 文重新封装一个MAC首部进行转发,源MAC是DIP所在的接口的MAC,目标 MAC是某挑选出的RS的RIP所在接口的MAC地址;源IP/PORT,以及目标 IP/PORT均保持不变
    (1) Director和各RS都配置有VIP
    (2) 确保前端路由器将目标IP为VIP的请求报文发往Director 在前端网关做静态绑定VIP和Director的MAC地址
    在RS上使用arptables工具
    arptables -A IN -d $VIP -j DROP
    arptables -A OUT -s $VIP -j mangle --mangle-ip-s $RIP
    在RS上修改内核参数以限制arp通告及应答级别
    /proc/sys/net/ipv4/conf/all/arp_ignore
    /proc/sys/net/ipv4/conf/all/arp_announce
    (3)RS的RIP可以使用私网地址,也可以是公网地址;RIP与DIP在同一IP网络; RIP的网关不能指向DIP,以确保响应报文不会经由Director
    ( 4)RS和Director要在同一个物理网络
    (5)请求报文要经由Director,但响应报文不经由Director,而由RS直接发往 Client (6)不支持端口映射(端口不能修败)
    14.LVS入门及nginx实现反向代理_第2张图片
    3.lvs-tun:在原请求IP报文之外新加一个IP首部;
    转发方式:不修改请求报文的IP首部(源IP为CIP,目标IP为VIP),而在原IP报文 之外再封装一个IP首部(源IP是DIP,目标IP是RIP),将报文发往挑选出的目标 RS;RS直接响应给客户端(源IP是VIP,目标IP是CIP)
    (1) DIP, VIP, RIP都应该是公网地址
    (2) RS的网关一般不能指向DIP
    (3) 请求报文要经由Director,但响应不经由Director
    (4) 不支持端口映射 (5) RS的OS须支持隧道功能
    14.LVS入门及nginx实现反向代理_第3张图片
    4.lvs-fullnat:修改请求报文的源和目标IP;
    CIP --> DIP
    VIP --> RIP
    (1) VIP是公网地址,RIP和DIP是私网地址,且通常不在同一IP网络;因此, RIP的网关一般不会指向DIP
    (2) RS收到的请求报文源地址是DIP,因此,只需响应给DIP;但Director还 要将其发往Client
    (3) 请求和响应报文都经由Director
    (4) 支持端口映射
  3. 各个方式之间的区别:
  4. lvs-nat与lvs-fullnat:请求和响应报文都经由Director
    lvs-nat:RIP的网关要指向DIP
    lvs-fullnat:RIP和DIP未必在同一IP网络,但要能通信
  5. lvs-dr与lvs-tun:请求报文要经由Director,但响应报文由RS直接发往Client
    lvs-dr:通过封装新的MAC首部实现,通过MAC网络转发
    lvs-tun:通过在原IP报文外封装新IP头实现转发,支持远距离通信

-ipvs scheduler (调度方案):分为静态与动态方法
静态:仅根据算法本身进行调度

方案 意义
RR 轮询
WRR 加权轮询,
SH 源地址哈希
DH 目标地址哈希

当我们在进行灰度发布或者服务器维修时,可以将服务器的权重设置为0,这样调度器会慢慢地将该服务器上的流量转移至其他主机上
动态:根据每RS当前的负载状态及调度算法进行调度

方案 意义
LC 根据最少连接数来分配
WLC 加权的最少连接数
SED 最少延迟时间
NQ 不用排队原则
LBLC 动态的DH算法
LBLCR 带复制功能的LBLC
  1. ipvsadm:集群服务管理:增删改查(参数大写)
    集群服务的RS管理:增删改查(参数小写)

语法:ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] [-M netmask] [–pe persistence_engine] [-b sched-flags]

  1. 示例:NAT调度,服务器(192.168.164.138,192.168.164.148),调度器(vip192.164.1.19,dip192.168.164.150),客户端(192.168.164.152)
1.	服务器配置
安装httpd,配置好主页

2.	调度器安装好ipvsadm
[root@localhost centos]# ipvsadm -A -t 192.168.1.19:80 -s rr
[root@localhost centos]# ipvsadm -a -t 192.168.1.19:80 -r 192.168.164.138 -m
[root@localhost centos]# ipvsadm -a -t 192.168.1.19:80 -r 192.168.164.148 -m 
[root@localhost centos]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.1.19:80 rr
  -> 192.168.164.138:80           Masq    1      0          0         
  -> 192.168.164.148:80           Masq    1      0          0         

3.测试
[root@localhost centos]# for i in {1..10}; do curl 192.168.1.19 ;done   
it is 192.168.164.138
it is 192.168.164.148
it is 192.168.164.138
it is 192.168.164.148
it is 192.168.164.138
it is 192.168.164.148
it is 192.168.164.138
it is 192.168.164.148
it is 192.168.164.138
it is 192.168.164.148

3.	权重测试
[root@localhost html]# ipvsadm -e -t 192.168.1.19:80 -r 192.168.164.138 -m -w 2
[root@localhost html]# ipvsadm -E -t 192.168.1.19:80 -s wrr                    
[root@localhost html]# ipvsadm -e -t 192.168.1.19:80 -r 192.168.164.148 -m -w 3
[root@localhost html]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.1.19:80 wrr
  -> 192.168.164.138:80           Masq    2      0          0         
  -> 192.168.164.148:80           Masq    3      0          0         

4.测试
[root@localhost centos]# for i in {1..10}; do curl 192.168.1.19 ;done
it is 192.168.164.148
it is 192.168.164.138
it is 192.168.164.148
it is 192.168.164.138
it is 192.168.164.148
it is 192.168.164.148
it is 192.168.164.138
it is 192.168.164.148
it is 192.168.164.138
it is 192.168.164.148

  1. 示例:DR调度:添加VIP地址为192.168.164.199,其他架构和上述nat一致
1.	服务器配置,添加VIP地址,全部服务器都要
[root@localhost centos]#ifconfig lo:0 192.168.164.199 netmask 255.255.255.255 broadcast 192.168.164.199 up
[root@localhost centos]#route add -host 192.168.164.199 dev lo:0

2.	调度器配置,加上vip地址
[root@localhost html]# ifconfig ens33:0 192.168.164.199 netmask 255.255.255.255 broadcast 192.168.164.199 up

[root@localhost html]# ipvsadm -A -t 192.168.164.199:80 -s rr	//添加调度规则
[root@localhost html]# ipvsadm -a -t 192.168.164.199:80 -r 192.168.164.138 -g
[root@localhost html]# ipvsadm -a -t 192.168.164.199:80 -r 192.168.164.148 -g  
[root@localhost html]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.164.199:80 rr
  -> 192.168.164.138:80           Route   1      0          0         
  -> 192.168.164.148:80           Route   1      0          0    

3.测试,all和lo中的arp_ignore,arp_announce都要修改
[root@localhost all]# echo 1 > arp_ignore  
[root@localhost all]# echo 2 > arp_announce
[root@localhost lo]# echo 1 > arp_ignore                      
[root@localhost lo]# echo 2 > arp_announce

3.	测试
[root@localhost centos]# curl 192.168.164.199
it is 192.168.164.138

2、nginx反向代理,虚拟主机

  1. nginx是一款十分优秀的web服务器,反向代理服务器,亦可实现负载均衡的功能,相关配置文件在之前的博客中以描述,这里不做过多论述,直接操作

  2. 示例:反向代理

1.修改配置文件,在/etc/nginx/conf.d/目录下新建一个.conf配置模块即可
server{
        listen 80;
        server_name 192.168.164.148;	//原服务器IP地址

        location / {
                proxy_pass http://192.168.164.153:80;	//反代的服务器地址
        }
}

2.测试访问
[root@localhost etc]# curl 192.168.164.148	//访问148这个主机,显示确实153
it is 192.168.164.153

除此之外,我们还可以通过反向代理实现资源访问的动静分离

server{
        listen 80;
        server_name 192.168.164.148;	//原服务器IP地址

        location / {
                proxy_pass http://192.168.164.153:80;	//反代的服务器地址
        }
        location ~* \.(jeg|jpeg|png)${			//这里我们实现将访问图片等资源的请求统一调度到另外的服务器上去
				proxy_pass http://192.168.164.138:80;
		}
}

2.实现虚拟主机
和http一样,nginx同样支持虚拟主机,在生产中比较多使用的是基于端口和域名的虚拟主机,IP地址资源有限,所以较少使用
基于端口的虚拟主机

1.同样的我们新建一个配置文件模块,指定为81,82两个端口,IP地址是一样的
[root@www conf.d]# vi fandai.conf 
server{
        listen 81;
        server_name 192.168.164.148;

        location / {
                root /usr/share/nginx/html/html-81;	//注意root是站点下的目录路径,实际访问的主页上/usr/share/nginx/html/html-81/index.html;
        }
}
server{
        listen 82;
        server_name 192.168.164.148;

        location / {
                root /usr/share/nginx/html/html-82;


        }
}

2.测试访问
[root@localhost etc]# curl http://192.168.164.148:81
<h1>test page html-81</h1>
[root@localhost etc]# curl http://192.168.164.148:82
<h2>test page html-82</h1>

示例:基于域名的虚拟主机,ip地址与端口一致

server{
        listen 80;
        server_name www.linux1.com;

        location / {
                root /usr/share/nginx/html/html-81;	//注意root是站点下的目录路径,实际访问的主页上/usr/share/nginx/html/html-81/index.html;
        }
}
server{
        listen 80;
        server_name www.linux2.com;

        location / {
                root /usr/share/nginx/html/html-82;
        }
}

2.测试访问
在本地文件hosts文件上添加域名解析才行
[root@localhost etc]# curl www.linux1.com
<h1>test page html-81</h1>
[root@localhost etc]# curl www.linux2.com
<h2>test page html-82</h1>

你可能感兴趣的:(14.LVS入门及nginx实现反向代理)