欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

13. nginx,lvs之一

程序员文章站 2022-03-17 09:36:55
1、详细描述常见nginx常用模块和模块的使用示例 2、简述Linux集群类型、系统扩展方式及调度方法 3、简述lvs四种集群特点及使用场景 4、描述LVS-NAT、LVS-DR的工作原理并实现配置 ......

摘要:

1、详细描述常见nginx常用模块和模块的使用示例 
2、简述linux集群类型、系统扩展方式及调度方法 
3、简述lvs四种集群有点及使用场景 
4、描述lvs-nat、lvs-dr的工作原理并实现配置

 

1、详细描述常见nginx常用模块和模块的使用示例 

 

nginx的代码由一个核心和一系列的模块组成。

核心(core functionality)主要用于提供全局应用的基本功能,创建必要的运行时环境及确保不同模块之间平滑地进行交互等,对应于配置文件的main段和event段。核心涉及的指令官方文档:。

还有很多功能都通过模块实现,nginx是高度模块化程序。如web相关的功能模块有"ngx_http_*_module",和mail相关的功能模块有"ngx_mail_*_module",和tcp代理、负载均衡相关的功能模块有"ngx_stream_*_module",这些类别的模块中又分为很多类别的模块,如http类别的模块中有基本核心模块、事件类模块、缓存类模块、ssl相关模块、负载均衡类模块upstream等等。

以下是http功能模块类中常见的模块。

http类模块名 模块功能说明
ngx_http_core_module http核心模块,对应配置文件中的http段,包含很多指令,如location指令
ngx_http_access_module 访问控制模块,控制网站用户对nginx的访问,对应于配置文件中的allow和deny等指令
ngx_http_auth_basic_module 通过用户名和密码认证的访问控制,如访问站点时需要数据用户名和密码,指令包括auth_basic和auth_basic_user_file
ngx_http_charset_module 设置网页显示字符集。指令之一为charset,如charset utf-8
ngx_http_fastcgi_module fastcgi模块,和动态应用相关。该模块下有非常多的子模块。
ngx_http_flv_module 支持flv视频流的模块,如边下边播
ngx_http_mp4_module 同flv模块
ngx_http_gzip_module 压缩模块,用来压缩nginx返回的响应报文。一般只压缩纯文本内容,因为压缩比例非常大,而图片等不会去压缩
ngx_http_image_filter_module 和图片裁剪、缩略图相关模块,需要安装gd-devel才能编译该模块
ngx_http_index_module 定义将要被作为默认主页的文件,对应指令为index。"index index.html,index.php"
ngx_http_autoindex_module 当index指令指定的主页文件不存在时,交给autoindex指令,将自动列出目录中的文件autoindex {on/off}  
ngx_http_log_module 和访问日志相关的模块,指令包括log_format和access_log
ngx_http_memcached_module 和memcached相关的模块,用于从memcached服务器中获取相应响应数据
ngx_http_proxy_module 和代理相关,允许传送请求到其它服务器
ngx_http_realip_module 当nginx在反向代理的后端提供服务时,获取到真正的客户端地址,否则获取的是反向代理的ip地址
ngx_http_referer_module 实现防盗链功能的模块
ngx_http_rewrite_module 和url地址重写相关的模块,需要安装pcre-devel才能编译安装该模块
ngx_http_scgi_module simple cgi,是cgi的替代品,和fastcgi类似,但更简单
ngx_http_ssl_module 提供ssl功能的模块,即实现https
ngx_http_stub_status_module 获取nginx运行状态信息
ngx_http_upstream 和负载均衡相关模块

下面只介绍三个模块:

ngx_http_access module          实现基于ip地址的访问控制

ngx_http_auth_basic_module   实现基于用户的访问控制,使用basic认证机制认证

ngx_http_stub_status_module   用于输出nginx的基本状态信息

 

1.1  在服务器上配置/etc/nginx/conf.d/vhost.conf文件

[root@bogon conf.d]# cat vhost.conf
server {
listen 80;
server_name www.danlee.io;
root /data/nginx/vhost;

location / {
deny 192.168.1.11;
allow all;
}

location ~* ^/(admin|login) {
auth_basic "admin area or login url";
auth_basic_user_file /etc/nginx/.ngxpasswd;
}

location /ngxstatus {
stub_status;
}
}

[root@bogon conf.d]# tree /data
/data
└── nginx
└── vhost
├── admin
│   └── index.html
└── index.html

3 directories, 2 files
[root@bogon conf.d]# cat /data/nginx/vhost/index.html
<h1>www.danlee.io, mainpage</h1>
[root@bogon conf.d]# cat /data/nginx/vhost/admin/index.html
<h1>admin area</h1>

[root@bogon conf.d]#htpasswd -c -m /etc/nginx/.ngxpasswd tom

[root@bogon conf.d]#htpasswd -m /etc/nginx/.ngxpasswd jerry

[root@bogon conf.d]# cat /etc/nginx/.ngxpasswd
tom:$apr1$nyfn6i3f$nmknqgewltoysxknljc9p1
jerry:$apr1$2sa3n.kg$ju1tj8icmx4lmgs8qzoko.

 

[root@bogon conf.d]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@bogon conf.d]# nginx -s reload

 

 1.2 在两个客户端验证

首先在两个客户端上都编辑/etc/hosts文件添加服务器ip and server name.

192.168.1.21   www.danlee.io

客户端192.168.1.22上 验证:

 1 [root@bogon ~]# curl http://www.danlee.io/ngxstatus
 2 active connections: 1 
 3 server accepts handled requests
 4  7 7 11 
 5 reading: 0 writing: 1 waiting: 0 
 6 [root@bogon ~]# curl http://www.danlee.io
 7 <h1>www.danlee.io, mainpage</h1>
 8 [root@bogon ~]# curl http://www.danlee.io/index.html
 9 <h1>www.danlee.io, mainpage</h1>
10 [root@bogon ~]# cat /etc/hosts
11 127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
12 ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
13 192.168.1.21  www.danlee.io

13. nginx,lvs之一

 

 

客户端192.168.1.11上 验证:

 1 [root@localhost ~]# curl http://www.danlee.io
 2 <html>
 3 <head><title>403 forbidden</title></head>
 4 <body bgcolor="white">
 5 <center><h1>403 forbidden</h1></center>
 6 <hr><center>nginx/1.12.2</center>
 7 </body>
 8 </html>
 9 [root@localhost ~]# curl http://www.danlee.io/ngxstatus
10 active connections: 1 
11 server accepts handled requests
12  14 14 18 
13 reading: 0 writing: 1 waiting: 0 
14 [root@localhost ~]# curl http://www.danlee.io/admin
15 <html>
16 <head><title>401 authorization required</title></head>
17 <body bgcolor="white">
18 <center><h1>401 authorization required</h1></center>
19 <hr><center>nginx/1.12.2</center>
20 </body>
21 </html>
22 [root@localhost ~]# 

 

 备注: 因为没有在服务器端对ngxstatus模块配置验证,此客户端依然可以访问该页面数据。

 


2、简述linux集群类型、系统扩展方式及调度方法

linux cluster类型:
lb:load balancing,负载均衡;
ha:high availiablity,高可用;
a=mtbf/(mtbf+mttr)
(0,1):90%, 95%, 99%, 99.5%, 99.9%, 99.99%, 99.999%, 99.9999%
hp:high performance,高性能;

 

系统扩展方式:
scale up:向上扩展
scale out:向外扩展

 

ipvs scheduler:
根据其调度时是否考虑各rs当前的负载状态,可分为静态方法和动态方法两种:

静态方法:仅根据算法本身进行调度;
rr:roundrobin,轮询;
wrr:weighted rr,加权轮询;
sh:source hashing,实现session sticky,源ip地址hash;将来自于同一个ip地址的请求始终发往第一次挑中的rs,从而实现会话绑定;
dh:destination hashing;目标地址哈希,将发往同一个目标地址的请求始终转发至第一次挑中的rs,典型使用场景是正向代理缓存场景中的负载均衡;

动态方法:主要根据每rs当前的负载状态及调度算法进行调度;
overhead=负载值

lc:least connections
overhead=activeconns*256+inactiveconns
wlc:weighted lc
overhead=(activeconns*256+inactiveconns)/weight
sed:shortest expection delay
overhead=(activeconns+1)*256/weight
nq:never queue

lblc:locality-based lc,动态的dh算法;
lblcr:lblc with replication,带复制功能的lblc;


3、简述lvs四种集群特点及使用场景 

 

lvs集群的类型:
lvs-nat:修改请求报文的目标ip;多目标ip的dnat;
lvs-dr:操纵封装新的mac地址;
lvs-tun:在原请求ip报文之外新加一个ip首部;
lvs-fullnat:修改请求报文的源和目标ip;

 

lvs-nat:
多目标ip的dnat,通过将请求报文中的目标地址和目标端口修改为某挑出的rs的rip和port实现转发;

(1)rip和dip必须在同一个ip网络,且应该使用私网地址;rs的网关要指向dip; (dip是内网,vip是外网?)
(2)请求报文和响应报文都必须经由director转发;director易于成为系统瓶颈;
(3)支持端口映射,可修改请求报文的目标port;
(4)vs必须是linux系统,rs可以是任意系统;

lvs-dr:
direct routing,直接路由;
通过为请求报文重新封装一个mac首部进行转发,源mac是dip所在的接口的mac,
目标mac是某挑选出的rs的rip所在接口的mac地址;源ip/port,以及目标ip/port均保持不变;

director和各rs都得配置使用vip;
(1) 确保前端路由器将目标ip为vip的请求报文发往director:
(a) 在前端网关做静态绑定;
(b) 在rs上使用arptables;
(c) 在rs上修改内核参数以限制arp通告及应答级别;
arp_announce
arp_ignore
(2) rs的rip可以使用私网地址,也可以是公网地址;rip与dip在同一ip网络;rip的网关不能指向dip,以确保响应报文不会经由director;
(3) rs跟director要在同一个物理网络;
(4) 请求报文要经由director,但响应不能经由director,而是由rs直接发往client;
(5) 不支持端口映射;

 

 

lvs-tun:
转发方式:不修改请求报文的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得支持隧道功能;

lvs-fullnat:
通过同时修改请求报文的源ip地址和目标ip地址进行转发;
cip <--> dip
vip <--> rip

(1) vip是公网地址,rip和dip是私网地址,且通常不在同一ip网络;因此,rip的网关一般不会指向dip;
(2) rs收到的请求报文源地址是dip,因此,只能响应给dip;但director还要将其发往client;
(3) 请求和响应报文都经由director;
(4) 支持端口映射;

注意:此类型默认不支持;


总结:
lvs-nat, lvs-fullnat:请求和响应报文都经由director;
lvs-nat:rip的网关要指向dip;
lvs-fullnat:rip和dip未必在同一ip网络,但要能通信;
lvs-dr, lvs-tun:请求报文要经由director,但响应报文由rs直接发往client;
lvs-dr:通过封装新的mac首部实现,通过mac网络转发;
lvs-tun:通过在原ip报文之外封装新的ip首部实现转发,支持远距离通信;


4、描述lvs-nat、lvs-dr的工作原理并实现配置

lvs-nat:
多目标ip的dnat,通过将请求报文中的目标地址和目标端口修改为某挑出的rs的rip和port实现转发;
(1)rip和dip必须在同一个ip网络,且应该使用私网地址;rs的网关要指向dip;
(2)请求报文和响应报文都必须经由director转发;director易于成为系统瓶颈;
(3)支持端口映射,可修改请求报文的目标port;
(4)vs必须是linux系统,rs可以是任意系统;

 

1)准备:
1. 关闭selinux, 清空iptables, 同步dr, rs1, rs2上的时间
2. 在rs1, rs2上分别安装nginx, telnet-server
在dr上安装nginx, ipvsadm
3. dr调度器:
                   dip: 192.168.1.6
                   vip: 127.16.1.7
rs1服务器1 rip1:127.16.1.8
rs2服务器2 rip2: 127.16.1.9
如果是dr, rs在同一台电脑上的虚拟机上,dip, rip都需要改为仅主机模式vmnet1。调整网络前先安装必要的软件包。
vip, rip需要使用私网地址。
director要打开核心转发功能sysctl -w net.ipv4.ip_forward=1
如何在虚拟机中添加一个新的网卡,可以参考(实际步骤会不相同)https://blog.csdn.net/qq_21383435/article/details/51126577

2)配置:

在rs1上:

# vim /usr/share/nginx/html/test1.html        添加内容<h1>rs1, ####172.16.1.8</h1>
# systemctl start nginx.service

# ss -tnl                       检查80端口是否打开

在rs2上:

# vim /usr/share/nginx/html/test1.html        添加内容<h1>rs2, ####172.16.1.9</h1>

# systemctl start nginx.service

# ss -tnl                       检查80端口是否打开

在dr上:

[root@bogon ~]# ifconfig
ens33: flags=4163<up,broadcast,running,multicast> mtu 1500
inet 192.168.1.6 netmask 255.255.255.0 broadcast 192.168.1.255
inet6 fe80::fb51:8e3:4aa5:5358 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:37:ff:fd txqueuelen 1000 (ethernet)
rx packets 7072 bytes 5524007 (5.2 mib)
rx errors 0 dropped 0 overruns 0 frame 0
tx packets 3960 bytes 354712 (346.3 kib)
tx errors 0 dropped 0 overruns 0 carrier 0 collisions 0

ens37: flags=4163<up,broadcast,running,multicast> mtu 1500
inet 172.16.1.7 netmask 255.255.0.0 broadcast 172.16.255.255
inet6 fe80::20c:29ff:fe37:ff07 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:37:ff:07 txqueuelen 1000 (ethernet)
rx packets 717 bytes 85009 (83.0 kib)
rx errors 0 dropped 0 overruns 0 frame 0
tx packets 133 bytes 15590 (15.2 kib)
tx errors 0 dropped 0 overruns 0 carrier 0 collisions 0

lo: flags=73<up,loopback,running> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (local loopback)
rx packets 0 bytes 0 (0.0 b)
rx errors 0 dropped 0 overruns 0 frame 0
tx packets 0 bytes 0 (0.0 b)
tx errors 0 dropped 0 overruns 0 carrier 0 collisions 0

 

[root@bogon ~]# ipvsadm -a -t 192.168.1.6:80 -s rr           #注意此处为vip

[root@bogon ~]# ipvsadm -a -t 192.168.1.6:80 -r 172.16.1.9 -m
[root@bogon ~]# ipvsadm -a -t 192.168.1.6:80 -r 172.16.1.8 -m
[root@bogon ~]# 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.6:80 rr
-> 172.16.1.8:80 masq 1 0 0
-> 172.16.1.9:80 masq 1 0 0

在客户端上:

[root@stephen ~]# curl http://192.168.1.6/test1.html
<h1>rs1, ####172.16.1.8</h1>
[root@stephen ~]# curl http://192.168.1.6/test1.html
<h1>rs2,###172.16.1.9</h1>

[root@stephen ~]# for i in {1..10}; do curl http://192.168.1.6/test1.html; done
<h1>rs1, ####172.16.1.8</h1>
<h1>rs2,###172.16.1.9</h1>
<h1>rs1, ####172.16.1.8</h1>
<h1>rs2,###172.16.1.9</h1>
<h1>rs1, ####172.16.1.8</h1>
<h1>rs2,###172.16.1.9</h1>
<h1>rs1, ####172.16.1.8</h1>
<h1>rs2,###172.16.1.9</h1>
<h1>rs1, ####172.16.1.8</h1>
<h1>rs2,###172.16.1.9</h1>

 

lvs-dr模型:

direct routing,直接路由;

通过为请求报文重新封装一个mac首部进行转发,源mac是dip所在的接口的mac,
目标mac是某挑选出的rs的rip所在接口的mac地址;源ip/port,以及目标ip/port均保持不变;

director和各rs都得配置使用vip;
(1) 确保前端路由器将目标ip为vip的请求报文发往director:
(a) 在前端网关做静态绑定;
(b) 在rs上使用arptables;
(c) 在rs上修改内核参数以限制arp通告及应答级别;
arp_announce
arp_ignore
(2) rs的rip可以使用私网地址,也可以是公网地址;rip与dip在同一ip网络;rip的网关不能指向dip,以确保响应报文不会经由director; 他们的网关相同可以吗?
(3) rs跟director要在同一个物理网络;
(4) 请求报文要经由director,但响应不能经由director,而是由rs直接发往client;
(5) 不支持端口映射;

 

1)准备:

1. 关闭selinux, 清空iptables, 同步dr, rs1, rs2上的时间

2. 在rs1, rs2上分别安装httpd 在dr上安装ipvsadm

3.dr, rs都是桥接

dr调度器: 
                   dip: 192.168.1.6 
                   vip: 192.16.1.99  在ens33:0上
rs1服务器1 rip1:192.168.1.4

                  vip: 192.168.1.99   在lo:0上
rs2服务器2 rip2: 192.168.1.5
                  vip: 192.168.1.99   在lo:0上

思考: vip要和rip在同一网段中吗? 

            当vip全部设置为vip: 172.16.0.99,结果失败,地址0改为1后就成功了。

2)配置:

在rs1上:

# vim /var/www/html/test1.html        添加内容<h1> rs1, 192.168.1.4 </h1>

[root@bogon ~]# vim setparam.sh
[root@bogon ~]# cat setparam.sh
#!/bin/bash
#
vip='192.168.1.99'
mask='255.255.255.255'
iface='lo:0'

case $1 in
start)
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce

ifconfig $iface $vip netmask $mask broadcast $vip up
route add -host $vip dev $iface
;;
stop)
ifconfig $iface down

echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce

;;
*)
echo "usage $(basename $0) start|stop"
exit 1
;;
esac

[root@bogon ~]# bash -n setparam.sh
[root@bogon ~]# bash -x setparam.sh start
+ vip=192.168.1.99
+ mask=255.255.255.255
+ iface=lo:0
+ case $1 in
+ echo 1
+ echo 1
+ echo 2
+ echo 2
+ ifconfig lo:0 192.168.1.99 netmask 255.255.255.255 broadcast 172.16.0.99 up
+ route add -host 192.168.1.99 dev lo:0

# scp setparam.sh 192.168.1.5:/root/

# systemctl start httpd.service

# ss -tnl                           检查80端口是否打开

 

在rs2上:

[root@bogon ~]# ls
anaconda-ks.cfg setparam.sh
[root@bogon ~]# bash -x setparam.sh start
+ vip=192.168.1.99
+ mask=255.255.255.255
+ iface=lo:0
+ case $1 in
+ echo 1
+ echo 1
+ echo 2
+ echo 2
+ ifconfig lo:0 192.168.1.99 netmask 255.255.255.255 broadcast 192.168.1.99 up
+ route add -host 192.168.1.99 dev lo:0
[root@bogon ~]# ifconfig
ens33: flags=4163<up,broadcast,running,multicast> mtu 1500
inet 192.168.1.5 netmask 255.255.255.0 broadcast 192.168.1.255
inet6 fe80::8b7:c57a:ebbd:80b7 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:9e:a5:df txqueuelen 1000 (ethernet)
rx packets 15795 bytes 17043985 (16.2 mib)
rx errors 0 dropped 0 overruns 0 frame 0
tx packets 8126 bytes 786863 (768.4 kib)
tx errors 0 dropped 0 overruns 0 carrier 0 collisions 0

lo: flags=73<up,loopback,running> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (local loopback)
rx packets 4 bytes 336 (336.0 b)
rx errors 0 dropped 0 overruns 0 frame 0
tx packets 4 bytes 336 (336.0 b)
tx errors 0 dropped 0 overruns 0 carrier 0 collisions 0

lo:0: flags=73<up,loopback,running> mtu 65536
inet 192.168.1.99 netmask 255.255.255.255
loop txqueuelen 1000 (local loopback)

# vim /var/www/html/test1.html        添加内容<h1> rs2, 192.168.1.5 </h1>

# systemctl start httpd.service

# ss -tnl                       检查80端口是否打开

 

在dr上:

[root@bogon network-scripts]# curl http://192.168.1.4/test1.html
<h1> rs1, 192.168.1.4 </h1>
[root@bogon network-scripts]# curl http://192.168.1.5/test1.html
<h1> rs2, 192.168.1.5 </h1>

[root@bogon network-scripts]# ifconfig
ens33: flags=4163<up,broadcast,running,multicast> mtu 1500
inet 192.168.1.6 netmask 255.255.255.0 broadcast 192.168.1.255
inet6 fe80::fb51:8e3:4aa5:5358 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:37:ff:fd txqueuelen 1000 (ethernet)
rx packets 2310 bytes 241192 (235.5 kib)
rx errors 0 dropped 0 overruns 0 frame 0
tx packets 476 bytes 42028 (41.0 kib)
tx errors 0 dropped 0 overruns 0 carrier 0 collisions 0

lo: flags=73<up,loopback,running> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (local loopback)
rx packets 0 bytes 0 (0.0 b)
rx errors 0 dropped 0 overruns 0 frame 0
tx packets 0 bytes 0 (0.0 b)
tx errors 0 dropped 0 overruns 0 carrier 0 collisions 0

[root@bogon network-scripts]# ifconfig ens33:0 192.168.1.99 netmask 255.255.255.255 broadcast 192.168.1.99 up

[root@bogon network-scripts]# ifconfig
ens33: flags=4163<up,broadcast,running,multicast> mtu 1500
inet 192.168.1.6 netmask 255.255.255.0 broadcast 192.168.1.255
inet6 fe80::fb51:8e3:4aa5:5358 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:37:ff:fd txqueuelen 1000 (ethernet)
rx packets 2513 bytes 259088 (253.0 kib)
rx errors 0 dropped 0 overruns 0 frame 0
tx packets 602 bytes 56844 (55.5 kib)
tx errors 0 dropped 0 overruns 0 carrier 0 collisions 0

ens33:0: flags=4163<up,broadcast,running,multicast> mtu 1500
inet 192.168.1.99 netmask 255.255.255.255 broadcast 172.16.0.99
ether 00:0c:29:37:ff:fd txqueuelen 1000 (ethernet)

lo: flags=73<up,loopback,running> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (local loopback)
rx packets 0 bytes 0 (0.0 b)
rx errors 0 dropped 0 overruns 0 frame 0
tx packets 0 bytes 0 (0.0 b)
tx errors 0 dropped 0 overruns 0 carrier 0 collisions 0

 

 

在客户端上:

[root@stephen ~]# curl http://192.168.1.99/test1.html
<h1> rs1, 192.168.1.4 </h1>
[root@stephen ~]# curl http://192.168.1.99/test1.html
<h1> rs2, 192.168.1.5 </h1>
[root@stephen ~]# for i in {1..15}; do curl http://192.168.1.99/test1.html; done
<h1> rs1, 192.168.1.4 </h1>
<h1> rs2, 192.168.1.5 </h1>
<h1> rs1, 192.168.1.4 </h1>
<h1> rs2, 192.168.1.5 </h1>
<h1> rs1, 192.168.1.4 </h1>
<h1> rs2, 192.168.1.5 </h1>
<h1> rs1, 192.168.1.4 </h1>
<h1> rs2, 192.168.1.5 </h1>
<h1> rs1, 192.168.1.4 </h1>
<h1> rs2, 192.168.1.5 </h1>
<h1> rs1, 192.168.1.4 </h1>
<h1> rs2, 192.168.1.5 </h1>
<h1> rs1, 192.168.1.4 </h1>
<h1> rs2, 192.168.1.5 </h1>
<h1> rs1, 192.168.1.4 </h1>