Nginx 配置高可用(主从)
# 41.Nginx 配置高可用(主从)
本文我们开始搭建 Nginx 集群。步骤如下:
- 修改 /etc/keepalived/keepalivec.conf 配置文件
- 在 /usr/local/src 添加检测脚本
- 把两台服务器上 Nginx 和 Keepalived 启动
- 测试
# 修改主服务器 Keepalived 配置文件
注意:修改前,最好备份下原始的配置文件。
我们实现集群的方式,主要是通过修改 Keepalived 的配置,这里先附上完整的修改后的配置文件,然后讲解:
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.2.242
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_script chk_http_port {
script "/opt/nginx/nginx_check.sh"
interval 2 #检测脚本执行的间隔
weight 2
}
vrrp_instance VI_1 {
state MASTER # 备份服务器上将 MASTER 改为 BACKUP
interface enp0s8 # 网卡
virtual_router_id 51 # 主、备机的 virtual_router_id 必须相同
priority 100 # 主、备机取不同的优先级,主机值较大,备份机值较小
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.2.66 # 虚拟IP地址
}
}
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
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
可以看到配置主要分为 3 个部分,首先 global_defs 表明是全局定义,关键是第 11 行定义了一个 router_id:
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.17.129
smtp_connect_timeout 30
router_id LVS_DEVEL
}
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
- notification_email:设置报警邮件地址即报警邮件接收者,可设置多个,每行一个;如果要开启邮件报警功能,需要开启本机的 postfix 或者 sendmail 服务;
- notification_email_from:用于设置邮件的发送地址,即报警邮件发送者;
- smtp_server:用于设置邮件的 SMTP Server 地址,这里设为本机
- smtp_connect_timeout:设置连接 SMTP Server 的超时时间;
- router_id:表示运行 keepalived 服务器的一个标识,是发邮件时显示在邮件主题中的信息;
然后以下配置是检测脚本的位置,检测脚本的作用是定期检测 Nginx 是否宕机了:
vrrp_script chk_http_port {
script "/usr/local/src/nginx_check.sh"
interval 2 #检测脚本执行的间隔
weight 2
}
1
2
3
4
5
2
3
4
5
说明如下:
- script 是检测脚本
- interval 是检测的间隔,也就是多久执行一次检测脚本,秒为单位
- weight 是权重,也就是会根据脚本的返回值来决定本机的优先级。
然后这是虚拟 IP 的配置:
vrrp_instance VI_1 {
state MASTER # 备份服务器上将 MASTER 改为 BACKUP
interface enp0s8 # 网卡
virtual_router_id 51 # 主、备机的 virtual_router_id 必须相同
priority 100 # 主、备机取不同的优先级,主机值较大,备份机值较小
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.2.66 // VRRP H 虚拟地址
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
- 第 2 行的 state 表明目前的服务器是主服务器还是备份服务器
- 第 3 行是网卡名字,可以通过 ifconfig 查看网卡的名字
- 第 5 行是优先级,节点优先级,数字越大表示节点的优先级越高,在一个 VRRP 实例下,MASTER 的优先级必须要比 BACKUP 高,不然就会切换角色。之前的定期检测就是会修改这个优先级。
- advert_int ,用于设定 MASTER 与 BACKUP 之间同步检查的时间间隔,单位为秒
- authentication 是权限校验的方式,使用的是密码校验(PASS),密码是 1111
- 第 12 ~ 14 行定义了虚拟 IP 的地址,注意这个虚拟 IP 要和集群的两个虚拟机在同一个网段,即前 3 个字段要一样(192.168.2.xx)。
# 修改从服务器 Keepalived 配置文件
和主服务器的配置文件相比,主要全局定义里的 IP:
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.2.138
smtp_connect_timeout 30
router_id LVS_DEVEL
}
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
然后修改了虚拟 IP 设置的 state、网卡名字和优先级:
vrrp_instance VI_1 {
state BACKUP # 备份服务器上将 MASTER 改为 BACKUP
interface enp0s8 # 网卡
virtual_router_id 51 # 主、备机的 virtual_router_id 必须相同
priority 90 # 主、备机取不同的优先级,主机值较大,备份机值较小
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.66.66 # 虚拟IP地址
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
完整配置如下:
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.2.138
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_script chk_http_port {
script "/opt/nginx/nginx_check.sh"
interval 2 #检测脚本执行的间隔
weight 2
}
vrrp_instance VI_1 {
state BACKUP # 备份服务器上将 MASTER 改为 BACKUP
interface enp0s8 # 网卡
virtual_router_id 51 # 主、备机的 virtual_router_id 必须相同
priority 90 # 主、备机取不同的优先级,主机值较大,备份机值较小
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.66.66 # 虚拟IP地址
}
}
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
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
# nginx_check.sh
Keepalived 需要判断 Nginx 是否宕机,因此我们写一个 shell 脚本来判断,内容如下:
#!/bin/bash
A=`ps -C nginx –no-header |wc -l`
if [ $A -eq 0 ];then
/usr/local/nginx/sbin/nginx
sleep 2
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
killall keepalived
fi
fi
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
就是判断 Nginx 进程是否存在,如果不存在(为 0),则尝试再次启动 Nginx,然后 sleep 等 Nginx 启动,如果还是没有 Nginx 的进程,说明启动失败,则 kill 掉 Keepalived 进程。将这个脚本文件放到两台服务器上对应路径
# 启动 Nginx 和 Keepalived
启动 Nginx:
./nginx
1
启动 Keepalived:
systemctl start keepalived.service
1
检测是否启动:
systemctl status keepalived.service
● keepalived.service - LVS and VRRP High Availability Monitor
Loaded: loaded (/usr/lib/systemd/system/keepalived.service; disabled; vendor preset: disabled)
Active: active (running) since 三 2023-03-29 08:09:18 CST; 9h ago
Process: 15538 ExecStart=/usr/sbin/keepalived $KEEPALIVED_OPTIONS (code=exited, status=0/SUCCESS)
Main PID: 15540 (keepalived)
Tasks: 3
CGroup: /system.slice/keepalived.service
├─15540 /usr/sbin/keepalived -D
├─15541 /usr/sbin/keepalived -D
└─15542 /usr/sbin/keepalived -D
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
# 测试
在浏览器地址栏输入 虚拟 ip 地址,测试能否正常访问:
把主服务器(192.168.17.129)nginx 和 keepalived 停止 看看能否访问:
systemctl stop keepalived.service
cd /opt/nginx/sbin
./nginx -s quit
1
2
3
2
3
可以看到还是能正常访问,并且访问的是第二个 Nginx:
然后我们将第一台 Nginx 启动,并且启动 Keepalived,再次访问虚拟 IP 地址,可以看到访问的是第一个 Nginx 了,这是因为第一台优先级高。
上次更新: 2024/9/4 21:34:04