13. nginx,lvs之一
摘要:
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
客户端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>
上一篇: JQuery Ajax动态加载Table数据的实例讲解
下一篇: 购物车业务逻辑(vuex)
推荐阅读
-
linux服务器之LVS、Nginx和HAProxy负载均衡器对比总结
-
lvs、haproxy、nginx 负载均衡的比较分析
-
lvs、haproxy、nginx 负载均衡的比较分析
-
LVS+Nginx负载均衡、LVS高可用环境搭建、安装Keepalived
-
nginx和lvs各自的优劣以及适合的使用环境
-
13. nginx,lvs之一
-
Nginx服务500:Internal Server Error原因之一
-
荐 搭建Keepalived+Lvs+Nginx高可用集群负载均衡
-
【Nginx-Series】lvs+keepalived+Nginx搭建高可用nginx集群
-
使用Lvs+Nginx集群搭建高并发架构的实现示例