从01开始 从01开始
首页
  • 计算机科学导论
  • 数字电路
  • 计算机组成原理

    • 计算机组成原理-北大网课
  • 操作系统
  • Linux
  • Docker
  • 计算机网络
  • 计算机常识
  • Git
  • JavaSE
  • Java高级
  • JavaEE

    • Ant
    • Maven
    • Log4j
    • Junit
    • JDBC
    • XML-JSON
  • JavaWeb

    • 服务器软件
    • Servlet
  • Spring
  • 主流框架

    • Redis
    • Mybatis
    • Lucene
    • Elasticsearch
    • RabbitMQ
    • MyCat
    • Lombok
  • SpringMVC
  • SpringBoot
  • 学习网课的心得
  • 输入法
  • 节假日TodoList
  • 其他
  • 关于本站
  • 网站日记
  • 友人帐
  • 如何搭建一个博客
GitHub (opens new window)

peterjxl

人生如逆旅,我亦是行人
首页
  • 计算机科学导论
  • 数字电路
  • 计算机组成原理

    • 计算机组成原理-北大网课
  • 操作系统
  • Linux
  • Docker
  • 计算机网络
  • 计算机常识
  • Git
  • JavaSE
  • Java高级
  • JavaEE

    • Ant
    • Maven
    • Log4j
    • Junit
    • JDBC
    • XML-JSON
  • JavaWeb

    • 服务器软件
    • Servlet
  • Spring
  • 主流框架

    • Redis
    • Mybatis
    • Lucene
    • Elasticsearch
    • RabbitMQ
    • MyCat
    • Lombok
  • SpringMVC
  • SpringBoot
  • 学习网课的心得
  • 输入法
  • 节假日TodoList
  • 其他
  • 关于本站
  • 网站日记
  • 友人帐
  • 如何搭建一个博客
GitHub (opens new window)
  • JavaSE

  • JavaSenior

  • JavaEE

  • JavaWeb

    • 服务器软件

      • 什么是服务器软件
      • Nginx介绍
      • Nginx的安装和启停
      • Nginx配置
      • Nginx配置反向代理
      • Nginx配置多个反向代理
      • Nginx配置负载均衡
      • Nginx配置动静分离
      • Nginx集群概念
      • Nginx配置高可用(主从)
        • 修改主服务器Keepalived配置文件
        • 修改从服务器Keepalived配置文件
        • nginx_check.sh
        • 启动Nginx和Keepalived
        • 测试
      • Nginx原理
      • Nginx日志管理
      • Nginx手册
      • Nginx系列完结
      • Tomcat介绍
      • Tomcat安装和启停
      • Tomcat配置
      • Tomcat部署项目
      • IDEA新建JavaWeb项目
      • Tomcat集群
      • 服务器软件
    • 环境管理和配置管理-科普篇
    • Servlet入门

    • JavaWeb
  • Spring

  • 主流框架

  • SpringMVC

  • SpringBoot

  • Java并发

  • Java源码

  • JVM

  • 韩顺平

  • Java
  • Java
  • JavaWeb
  • 服务器软件
2023-04-17
目录

Nginx配置高可用(主从)

# 41.Nginx配置高可用(主从)

本文我们开始搭建Nginx集群。

步骤如下:

  1. 修改/etc/keepalived/keepalivec.conf 配置文件
  2. 在/usr/local/src 添加检测脚本
  3. 把两台服务器上 nginx 和 keepalived 启动
  4. 测试

‍

# 修改主服务器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

‍

‍

可以看到配置主要分为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
  • 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

说明如下:

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行的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

‍

然后修改了虚拟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

‍

‍

完整配置如下:

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

‍

# 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

就是判断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

‍

‍

# 测试

‍

在浏览器地址栏输入 虚拟 ip 地址,测试能否正常访问:

​​

‍

‍

把主服务器(192.168.17.129)nginx 和 keepalived 停止 看看能否访问:

systemctl stop keepalived.service
cd /opt/nginx/sbin
./nginx -s quit
1
2
3

‍

可以看到还是能正常访问,并且访问的是第二个Nginx。

​​

‍

‍

‍

然后我们将第一台Nginx启动,并且启动Keepalived,再次访问虚拟IP地址,可以看到访问的是第一个Nginx了,这是因为第一台优先级高。

‍

‍

在GitHub上编辑此页 (opens new window)
上次更新: 2023/4/20 09:11:31
Nginx集群概念
Nginx原理

← Nginx集群概念 Nginx原理→

Theme by Vdoing | Copyright © 2022-2023 粤ICP备2022067627号-1 粤公网安备 44011302003646号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式