Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >实战 | Nginx+keepalived 实现高可用集群

实战 | Nginx+keepalived 实现高可用集群

原创
作者头像
开源Linux
修改于 2020-05-11 06:19:01
修改于 2020-05-11 06:19:01
1.5K0
举报
文章被收录于专栏:开源Linux开源Linux

前言

今天通过两个实战案例,带大家理解Nginx+keepalived 如何实现高可用集群,在学习新知识之前您可以选择性复习之前的知识点:

给小白的 Nginx 10分钟入门指南

Nginx编译安装及常用命令

Nginx 配置文件详解

一文带你读懂Nginx反向代理

一文彻底读懂nginx中的location指令

Nginx负载均衡原理及配置实例

Nginx为什么快到根本停不下来?

Keepalived入门学习

Keepalived高可用服务配置实例

Nginx+Keepalived 高可用集群(主从模式)

集群架构图

注意:Keepalived服务器同样是nginx负载均衡器

1、准备四台机器

本实验系统均使用Centos 7.5,在所有节点进行以下操作:

代码语言:txt
AI代码解释
复制
// 查看操作系统
[root@LB-01 ~]# cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)

//关闭并禁用防火墙
[root@LB-01 ~]# systemctl stop firewalld
[root@LB-01 ~]# systemctl disable firewalld

//关闭selinux
[root@LB-01 ~]# sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/sysconfig/selinux
[root@LB-01 ~]# setenforce 0

//安装nginx
yum -y install nginx
  若提示,无安装包,则需要安装epel扩展源:
   yum -y install epel-release 

2、配置后端web服务器

2.1)修改web01节点网站根目录默认文件

代码语言:txt
AI代码解释
复制
[root@web01 ~]# echo "<h1>web01 192.168.1.34</h1>" > /usr/share/nginx/html/index.html

2.2)修改web02节点网站根目录默认文件

代码语言:txt
AI代码解释
复制
[root@web01 ~]# echo "<h1>web01 192.168.1.34</h1>" > /usr/share/nginx/html/index.html

通过nginx主配置文件,可以看出nginx网站根目录文件默认是:/usr/share/nginx,如下:

2.3)启动nginx服务

代码语言:txt
AI代码解释
复制
//web01
[root@web01 ~]# systemctl start nginx

//web02
[root@web02 ~]# systemctl start nginx

2.4)验证

主机web01和web02已配置成web服务器

3、配置LB服务器

LB服务器需同时部署nginx和Keepalived服务,以下操作均在两台LB节点执行:

3.1)配置nginx反向代理服务

代码语言:txt
AI代码解释
复制
  编辑nginx主配置文件:`/etc/nginx/nginx.conf`

启动nginx服务;验证效果:

访问LB01:

访问LB02:

如图所示,LB01和LB02均可轮询访问后端web节点,即表示nginx LB集群搭建成功。

3.2)配置Keepalived服务

(1)安装Keepalived

代码语言:txt
AI代码解释
复制
yum -y install keepalived

(2)配置Keepalived服务

这里直接提供LB01与LB02两者配置文件差异对比,方便读者阅读:

代码语言:txt
AI代码解释
复制
vim /etc/keepalived/keepalived.con
左:LB01 右:LB02
左:LB01 右:LB02

(3)谁是主Keepalived?

通过上图得知,LB01优先级高于LB02,因此VIP绑定在LB01上:

代码语言:txt
AI代码解释
复制
[root@LB-01 ~]# ip a | grep 192.168.1.110
    inet 192.168.1.110/24 scope global secondary eth0:1
4、域名解析

由于不是真实环境,域名使用www.test.com用作测试,所以www.test.com的解析只能在客户机hosts文件设置。具体步骤如下:

打开:

C:\Windows\System32\drivers\etc\hosts

在末尾添加:

192.168.1.110 www.test.com

注意:这里的IP指定的是浮动IP,即通过客户端通过VIP访问web业务

5、测试验证


关闭LB01节点的keepalived服务。再次访问:

发现已然可以通过域名进行访问,只是此时VIP已绑定在LB02上,如下所示:

代码语言:txt
AI代码解释
复制
[root@LB-02 ~]# ip a | grep 192.168.1.110
    inet 192.168.1.110/24 scope global secondary eth0:1
[root@LB-02 ~]#

到此,Nginx+Keepalived 高可用集群(主从)就搭建完成了。

Nginx+Keepalived 高可用集群(双主模式)

将keepalived做成双主模式,其实很简单,就是再配置一段新的vrrp_instance(实例)规则。

集群架构图:

说明:还按照上面的环境继续做实验,只是修改LB节点上面的keepalived服务的配置文件即可。

此时LB-01节点既为Keepalived的主节点也为备节点,LB-02节点同样既为Keepalived的主节点也为备节点。

LB-01节点默认的主节点VIP(192.168.1.110),LB-02节点默认的主节点VIP(192.168.1.210)

1、配置 LB-01 节点

代码语言:txt
AI代码解释
复制
增加一段vrrp_instance VI_2实例规则:

vim /etc/keepalived/keepalived.conf

2、配置 LB02 节点

vim /etc/keepalived/keepalived.conf

3、重启Keepalived服务

代码语言:txt
AI代码解释
复制
//LB-01
[root@LB-01 ~]# systemctl restart keepalived

//LB-02
[root@LB-02 ~]# systemctl restart keepalived

4、查看VIP绑定情况

代码语言:txt
AI代码解释
复制
//LB-01
[root@LB-01 ~]# ip a
...
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq 
    inet 192.168.1.31/24 brd 10.43.1.255 scope global eth0
    inet 192.168.1.110/24 scope global secondary eth0:1

//LB-02
[root@LB-02 ~]# ip a
...
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq 
    inet 192.168.1.32/24 brd 10.43.1.255 scope global eth0
    inet 192.168.1.210/24 scope global secondary eth0:2

5、高可靠验证

代码语言:txt
AI代码解释
复制
 停止LB-01节点的keepalived再次测试
代码语言:txt
AI代码解释
复制
此时VIP都绑定在LB-02上
代码语言:txt
AI代码解释
复制
[root@LB-02 ~]# ip a
...
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq 
    inet 192.168.1.32/24 brd 10.43.1.255 scope global eth0
    inet 192.168.1.110/24 scope global secondary eth0:1
    inet 192.168.1.210/24 scope global secondary eth0:2

测试可以发现我们访问keepalived中配置的两个VIP都可以正常调度,当我们停止任意一台keepalived节点,同样还是正常访问;到此,nginx+keepalived+高可用集群(双主模式)就搭建完成了。

编写Nginx Web服务的守护脚本

以上实验测试有一个问题就是,我们是用Nginx做负载均衡分发请求的数据包的。如果主节点的Keepalived服务正常运行,而Nginx运行异常,那么将会出现Nginx负载均衡服务失灵,无法切换到Nginx负载均衡器02上,后端的Web服务器无法收到请求。所以,我们应该要检测Nginx的服务是否正常运行,如果不是正常运行,应该停掉Keepalived的服务,这样才能自动切换到备节点上。

我们可以通过检测80端口是否开启来判定Nginx的运行情况,2秒钟检测一次,脚本如下:

代码语言:txt
AI代码解释
复制
#!/bin/bash
while true
do
if [ $(netstat -tlnp|grep nginx|wc -l) -ne 1 ]
then
    /etc/init.d/keepalived stop
fi
sleep 2
done

结语

欢迎关注微信公众号『开源Linux』,专注于分享Linux/Unix相关内容,包括Linux运维、Linux系统开发、网络编程、以及虚拟化云计算等技术干货。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
使用ICMP传递shellcode
原文:https://blog.romanrii.com/using-icmp-to-deliver-shellcode
黑白天安全
2021/02/26
5580
使用ICMP传递shellcode
干货 | Shellcode免杀总结<一>
自己还是想把一些shellcode免杀的技巧通过白话文、傻瓜式的文章把技巧讲清楚。希望更多和我一样web狗也能动手做到免杀的实现。
HACK学习
2020/02/17
1.6K0
干货 | Shellcode免杀总结<一>
Ladon MS17010 Exploit for PowerShell
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/131843.html原文链接:https://javaforall.cn
全栈程序员站长
2022/08/12
6590
Ladon MS17010 Exploit for PowerShell
内网渗透测试基础
内网,也指局域网(Local Area Network,LAN),是指在某一区域内由多台计算机互联成的计算机组,内网是封闭的。
中龙技术
2022/09/29
1.4K0
内网渗透测试基础
钉钉RCE漏洞复现
利用了Chromium v8引擎整数溢出漏洞(是V8优化编译器Turbofan在SimplifiedLowering阶段产生的一个整数溢出漏洞),V8是Chromium内核中的JavaScript引擎,负责对JavaScript代码进行解释优化与执行。
故里[TRUE]
2023/04/19
6900
钉钉RCE漏洞复现
学员投稿 | go语言免杀360
先从exe出发 先写一个 正常的输出hello,world exe 用工具 CheckGoBuild.exe -f main.go 批量编译一下
Ms08067安全实验室
2024/12/20
2460
学员投稿 | go语言免杀360
Payload 实现分离免杀
众所周知,目前的杀毒软件的杀毒原理主要有三种方式,一种基于特征,一种基于行为,一种基于云查杀,其中云查杀的一些特点基本上也可以概括为特征码查杀,不管是哪一种杀毒软件,都会检查PE文件头,尤其是当后门程序越大时,越容易被查杀。
王 瑞
2022/12/28
6140
Payload 实现分离免杀
单片机DA转换实现正弦波
使用的是查表法: 1.c文件: #include "reg52.h" #include <intrins.h> #include <i2c.h> #define PCF8591 0x90 #define uint unsigned int #define uchar unsigned char #define arr_length 720 //正弦波数组长度 code unsigned char sin1[720]={0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x
用户1749219
2018/05/16
1.3K0
C语言编程: 在BMP图片上添加图片水印
gcc 版本 4.4.6 20120305 (Red Hat 4.4.6-4) (GCC)
DS小龙哥
2022/01/07
5.1K0
C语言编程: 在BMP图片上添加图片水印
REVERSE|西湖论剑·2022中国杭州网络安全技能大赛初赛官方Write Up
3、字符串列表能发现字符串“Input:”,通过交叉引用定位到是在sub_401170中被调用的
安恒网络空间安全讲武堂
2023/03/21
4250
REVERSE|西湖论剑·2022中国杭州网络安全技能大赛初赛官方Write Up
计算机控制技术实验说明
AD转换是所有嵌入式系统或机器人获取外部信息的一种重要方式,将温度、角度和位置等转换为对应的数字量,供处理器处理。
zhangrelay
2019/01/23
5810
爬取巴比特快讯遇到状态码“521”
最近在爬区块链相关的快讯,上周巴比特改版后重写了爬虫,跑了一天就挂了。原来是网站使用了加速乐的服务,爬虫每次都返回521的状态码。
bosh123
2021/01/29
1.3K0
Cobalt Strike 利用 Chrome 0day 上线
取出 shellcode 部分 全局替换 \ 为 ,0 然后取出来shellcode 放入 chrome 0day 中
公众号爱国小白帽
2021/04/22
5680
AES加解密原理详解与算法实现
​要编写AES算法,首先了解AES算法原理,AES算法是一个对称分组密码算法。数据分组长度必须是 128 bits,使用的密钥长度为 128,192 或 256 bits。对于三种不同密钥长度的 AES 算法,分别称为“AES-128”、“AES-192”、“AES-256”。AES加密算法涉及4种操作:字节替代(SubBytes)、行移位(ShiftRows)、列混(MixColumns)和轮密钥加(AddRoundKey)。
timerring
2022/07/20
4K0
AES加解密原理详解与算法实现
sm2国密算法的纯c语言版本,使用于单片机平台(静态内存分配)
之前的动态内存分配,在上面总是莫名其妙的崩。不知道堆和栈空间该改多大合适。且总共64K的内存,太受限了。
杨永贞
2020/08/04
3.4K1
免杀tips2
继上一个之后,第二个tips: 常见的Csharp的shellcode如下: byte[] X_Final = new byte[] { 0xfc ,0x48 ,0x83 ,0xe4 ,0xf0 ,0xe8 ,0xcc ,0x00 ,0x00 ,0x00 ,0x41 ,0x51 ,0x41 , 0x50 ,0x52 ,0x51 ,0x56 ,0x48 ,0x31 ,0xd2 ,0x65 ,0x48 ,0x8b ,0x52 ,0x60 ,0x48 ,0x8b ,0x52 ,0x18 ,0x48 ,0x8b
鸿鹄实验室
2021/04/15
5000
干货 | Shellcode免杀总结<二>
xor异或加密shellcode后,申请内存执行,和文开头执行shell从的方式无区别
HACK学习
2020/02/17
1.8K0
干货 | Shellcode免杀总结<二>
CS系列-使用C#的免杀
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Runtime.InteropServices;
字节脉搏实验室
2020/03/08
1.9K0
CS系列-使用C#的免杀
Python爬虫—破解JS加密的Cookie
目录[-] 前言 在GitHub上维护了一个代理池的项目,代理来源是抓取一些免费的代理发布网站。上午有个小哥告诉我说有个代理抓取接口不能用了,返回状态521。抱着帮人解决问题的心态去跑了一遍代码。发现果真是这样。 通过Fiddler抓包比较,基本可以确定是JavaScript生成加密Cookie导致原来的请求返回521。 发现问题 打开Fiddler软件,用浏览器打开目标站点(http://www.kuaidaili.com/proxylist/2/) 。可以发现浏览器对这个页面加载了两次,第一次返回5
jhao104
2018/03/20
6.2K0
Python爬虫—破解JS加密的Cookie
[文末抽奖] 免杀:GO实现shellcode加载器过360
现在很多内网环境中都安了各种各样的杀软,在做内网渗透时难免会四处碰壁。想到Go是一门较新的语言,免杀效果应该比较好,再加上现在网上主流的免杀都是c、c++、python一类的,涉及go的免杀较少,所以就想来做一个Go语言的免杀。
乌鸦安全
2021/09/03
4.2K0
[文末抽奖] 免杀:GO实现shellcode加载器过360
相关推荐
使用ICMP传递shellcode
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档