Nginx服务端集群搭建
准备环境搭建
构建可访问路径:
192.168.253.135/cluster/getAddress

192.168.253.135/cluster/index.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>后端服务器</title> <script type="text/javascript" src="js/jquery.min.js"></script> </head> <body> <img src="./img/ni9ne.png"> <h1>后端服务器: <span id="msg"></span></h1> </body> <script> $(function(){ $.get('cluster/getAddress', function(data){ $('#msg').html(data); }); }); </script> </html>
|
由134服务器代理路径, 访问192.168.253.135/demo/index.html转发到135

实现动静分离, 搭建服务集群
Nginx实现动静分离
动静分离
动态资源指的是后台应用程序的业务处理结果,
静态资源则是html,js,css,image等资源
分离处理可以降低动静资源的耦合度, 提高可用性, 同时, 静态资源也可以部署CDN
实现方式
1.将静态资源移动到代理服务器本地硬盘

2.修改代理服务器nginx配置文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| http { upstream webservice{ server 192.168.253.135; } server { location /cluster { proxy_pass http://webservice; } location ~/.*\.(png|jpg|gif|js){ root /var/www/static; } } }
|
效果
此时, 当动态资源服务宕机时, 静态资源还可以正常显示

Nginx实现集群搭建
配置代理服务器134
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| http { upstream webservice{ server 192.168.253.135; server 192.168.253.136; server 192.168.253.137; } server { location /cluster { proxy_pass http://webservice; } location ~/.*\.(png|jpg|gif|js){ root /var/www/static; } } }
|

Nginx高可用解决方案
动态资源集群中, 当某一服务器服务中断时, 可以切换到其余服务器获取动态数据, 当如果代理服务器宕机, 则需要通过其他手段解决问题
Keepalived
使用Keepalived解决可用性问题, Keepalived使用C语言编写, 通过虚拟路由冗余协议VRRP(Virtual Route Redundancy Protocol)实现功能
VRRP协议简介
类似于Redis中的哨兵机制, 对外提供一个接口提供服务, 内部由多台设备动态选举一个master, 其余为backup, 当master心跳中断时, 其余backup竞争提升为master, 对外提供服务.
其中主要包含选择协议(竞争master)与路由容错协议(master心跳监测_backup竞争)
环境搭建
| VIP |
IP |
主机名 |
主/从 |
|
192.168.253.134 |
keepalived1 |
master |
| 192.168.253.200 |
|
|
|
|
192.168.253.138 |
keepalived2 |
backup |
安装Keepalived
1 2 3 4 5 6 7 8 9 10
| #安装keepalived $ sudo apt install keepalived $ sudo cp /usr/share/doc/keepalived/samples/keepalived.conf.sample /etc/keepalived/keepalived.conf
# 或手动官网下载 # https://keepalived.org/download.html $ tar -zxvf keepalived-2.0.20.tar.gz -C keepalived/ $ cd keepalived/keepalived-x.x.xx $ ./configure --sysconf=/etc --prefix=/usr/local $ make && make install
|
Keepalived配置文件介绍
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| # global全局部分 global_defs { # 邮件通知目标, 当keepalived切换时发送email给具体的邮箱地址 notification_email { ni9ne@outlook.com } # 设置发件人信息 notification_email_from Alexandre.Cassen@firewall.loc # 指定SMTP服务地址 smtp_server 192.168.200.1 # 指定SMTP服务连接超时时间 smtp_connect_timeout 30 # 指定运行keepalived服务器的标识, 可用作邮件主题信息 router_id keepalived1 # 如果通告与接收的上一个通告来自相同master, 则不执行检查. 默认不跳过检查 vrrp_skip_check_adv_addr # 严格遵守VRRP协议 vrrp_strict # 配置免费ARP的时间间隔, 默认为0(以秒为单位,支持微秒) vrrp_garp_interval 0 # 设置主动请求NA之间的默认间隔(以秒为单位,支持微秒) vrrp_gna_interval 0 } # VRRP部分 vrrp_instance VI_1 { # 设置默认身份: MASTER/BACKUP state MASTER # 指定网卡名称 interface eth33 # 虚拟路由ID, 用于区分运行在同一网络接口和地址上的多个VRRPD实例,0-255 virtual_router_id 50 # 优先级高的VRRP备份组上线时,通常会抢占优先级低的VRRP备份组。nopreempt将停止高优先级计算机接管master,并允许低优先级计算机继续担任master # nopreempt # 选出MASTER,优先级最高的获胜。 priority的取值范围为[1-255] priority 100 # VRRP的通告时间间隔 advert_int 1 # 虚拟服务IP地址 virtual_ipaddress { 192.168.253.200 } } virtual_server 10.10.10.2 1358 { # LVS设备相关 ... }
|
配置Keepalived
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| # 134 | 138 global_defs { notification_email { acassen } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 192.168.200.1 smtp_connect_timeout 30 router_id keepalived1 # 路径ID唯一,134-1 138-2 } vrrp_instance VI_1 { state master interface ens33 # ip a 查询本机网卡名称 virtual_router_id 50 nopreempt priority 100 # 设置优先级 advert_int 1 virtual_ipaddress { 192.168.253.200 # 指定VIP } } virtual_server 10.10.10.2 1358 { ... }
|
启动Keepalived服务
1
| $ sudo systemctl start keepalived
|
查看启动结果
1
| $ ps -ef | grep keepalived
|

1
| $ tail -f /var/log/syslog
|


1
| http://192.168.253.200/cluster/index.html # 访问VIP
|

当keepalived进程关闭时, 备用节点自动上线, 替代原节点成为master, 若未配置nopreempt, 当原节点上线后, 由于优先级较高, master身份自动漂移到原节点.
但仅通过keepalived进程存活与否来进行身份漂移无法满足需求, 还需要实时监听Nginx或其他服务是否存活, 来决定是否进行选举, 就需要使用vrrp_script实现
vrrp_script监控Nginx服务
修改keepalived配置文件
1
| $ sudo vi /etc/keepalived/keepalived.conf
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| global_defs{ ... } vrrp_script ck_nginx { # 注意空格 script "/etc/keepalived/script/ck_nginx.sh" interval 3 weight -20 # 执行脚本后,减权重,避免重复竞争 user ni9ne } vrrp_instance VI_1 { ... track_script { # 注意空格 ck_nginx } }
|
编写ck_nginx.sh脚本
1 2
| $ vim /etc/keepalived/script/ck_nginx.sh $ sudo chmod 777 /etc/keepalived/script/ck_nginx.sh
|
1 2 3 4 5 6 7 8 9
| #! /bin/bash num=`ps -C nginx --no-header | wc -l` if [ $num -eq 0 ];then #sudo systemctl restart nginx #sleep 2 #if [ `ps -C nginx --no-header | wc -l` -eq 0 ];then sudo killall keepalived #fi fi
|
重启keepalived服务
1
| $ sudo systemctl restart keepalived
|
验证脚本
