Nginx服务端集群搭建08

Nginx服务端集群搭建

准备环境搭建

构建可访问路径:

192.168.253.135/cluster/getAddress

image-20220606205305319

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

image-20220606205335429

实现动静分离, 搭建服务集群

Nginx实现动静分离

动静分离

动态资源指的是后台应用程序的业务处理结果,

静态资源则是html,js,css,image等资源

分离处理可以降低动静资源的耦合度, 提高可用性, 同时, 静态资源也可以部署CDN

实现方式

1.将静态资源移动到代理服务器本地硬盘

image-20220606205415848

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;
}
}
}

效果

此时, 当动态资源服务宕机时, 静态资源还可以正常显示

image-20220606205700820

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;
}
}
}

image-20220606214400402

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	# 查看进程是否启动

image-20220607021413268

1
$ tail -f /var/log/syslog	# 查看日志

image-20220607021630578

1
$ ip addr 	# 查看VIP是否注册到网卡

image-20220607021814980

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

image-20220607021926118

当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
验证脚本

image-20220607031746823