从 01 开始 从 01 开始
首页
  • 📚 计算机基础

    • 计算机简史
    • 数字电路
    • 计算机组成原理
    • 操作系统
    • Linux
    • 计算机网络
    • 数据库
    • 编程工具
    • 装机
  • 🎨 前端

    • Node
  • JavaSE
  • Java 高级
  • JavaEE

    • 构建、依赖管理
    • Ant
    • Maven
    • 日志框架
    • Junit
    • JDBC
    • XML-JSON
  • JavaWeb

    • 服务器软件
    • 环境管理和配置管理-科普篇
    • Servlet
  • Spring

    • Spring基础
  • 主流框架

    • Redis
    • Mybatis
    • Lucene
    • Elasticsearch
    • RabbitMQ
    • MyCat
    • Lombok
  • SpringMVC

    • SpringMVC 基础
  • SpringBoot

    • SpringBoot 基础
  • Windows 使用技巧
  • 手机
  • 最全面的输入法教程
  • 最全面的浏览器教程
  • Office
  • 图片类工具
  • 效率类工具
  • RSS
  • 码字工具
  • 各大平台
  • 校招
  • 五险一金等
  • 职场规划
  • 关于离职
  • 杂谈
  • 📖 读书

    • 读书工具
    • 读书笔记
  • 🌍 英语

    • 从零开始学英语
    • 英语兔的相关视频
    • Larry 想做技术大佬的相关视频
  • 🏛️ 政治

    • 反腐
    • GFW
    • 404 内容
    • 审查与自我审查
    • 互联网
    • 战争
  • 💰 经济

    • 关于税
    • 理财
  • 💪 健身

    • 睡眠
    • 皮肤
    • 口腔健康
    • 学会呼吸
    • 健身日志
  • 🏠 其他

    • 驾驶技能
    • 租房与买房
    • 厨艺
  • 电影

    • 电影推荐
  • 电视剧
  • 漫画

    • 漫画软件
    • 漫画推荐
  • 游戏

    • Steam
    • 三国杀
    • 求生之路
  • 小说
  • 关于本站
  • 关于博主
  • 打赏
  • 网站动态
  • 友人帐
  • 从零开始搭建博客
  • 搭建邮件服务器
  • 本站分享
  • 🌈 生活

    • 2022
    • 2023
    • 2024
    • 2025
  • 📇 文章索引

    • 文章分类
    • 文章归档

晓林

程序猿,自由职业者,博主,英语爱好者,健身达人
首页
  • 📚 计算机基础

    • 计算机简史
    • 数字电路
    • 计算机组成原理
    • 操作系统
    • Linux
    • 计算机网络
    • 数据库
    • 编程工具
    • 装机
  • 🎨 前端

    • Node
  • JavaSE
  • Java 高级
  • JavaEE

    • 构建、依赖管理
    • Ant
    • Maven
    • 日志框架
    • Junit
    • JDBC
    • XML-JSON
  • JavaWeb

    • 服务器软件
    • 环境管理和配置管理-科普篇
    • Servlet
  • Spring

    • Spring基础
  • 主流框架

    • Redis
    • Mybatis
    • Lucene
    • Elasticsearch
    • RabbitMQ
    • MyCat
    • Lombok
  • SpringMVC

    • SpringMVC 基础
  • SpringBoot

    • SpringBoot 基础
  • Windows 使用技巧
  • 手机
  • 最全面的输入法教程
  • 最全面的浏览器教程
  • Office
  • 图片类工具
  • 效率类工具
  • RSS
  • 码字工具
  • 各大平台
  • 校招
  • 五险一金等
  • 职场规划
  • 关于离职
  • 杂谈
  • 📖 读书

    • 读书工具
    • 读书笔记
  • 🌍 英语

    • 从零开始学英语
    • 英语兔的相关视频
    • Larry 想做技术大佬的相关视频
  • 🏛️ 政治

    • 反腐
    • GFW
    • 404 内容
    • 审查与自我审查
    • 互联网
    • 战争
  • 💰 经济

    • 关于税
    • 理财
  • 💪 健身

    • 睡眠
    • 皮肤
    • 口腔健康
    • 学会呼吸
    • 健身日志
  • 🏠 其他

    • 驾驶技能
    • 租房与买房
    • 厨艺
  • 电影

    • 电影推荐
  • 电视剧
  • 漫画

    • 漫画软件
    • 漫画推荐
  • 游戏

    • Steam
    • 三国杀
    • 求生之路
  • 小说
  • 关于本站
  • 关于博主
  • 打赏
  • 网站动态
  • 友人帐
  • 从零开始搭建博客
  • 搭建邮件服务器
  • 本站分享
  • 🌈 生活

    • 2022
    • 2023
    • 2024
    • 2025
  • 📇 文章索引

    • 文章分类
    • 文章归档
  • 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入门

  • Spring

  • 主流框架

  • SpringMVC

  • SpringBoot

  • 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 了,这是因为第一台优先级高。

上次更新: 2025/5/5 17:15:09
Nginx 集群概念
Nginx 原理

← Nginx 集群概念 Nginx 原理→

最近更新
01
吐槽一下《僵尸校园》
05-15
02
2025 年 4 月记
04-30
03
山西大同 “订婚强奸案” 将会给整个社会带来的影响有多严重? - 知乎 转载
04-26
更多文章>
Theme by Vdoing | Copyright © 2022-2025 | 粤 ICP 备 2022067627 号 -1 | 粤公网安备 44011302003646 号 | 点击查看十年之约
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式