使用Nginx + Keepalived 实现高可用 Web 负载均衡笔记(虚拟机)

 更新时间:2023年08月08日 00:22:03   作者:CodingPioneer  
这篇文章主要介绍了使用Nginx + Keepalived 实现高可用 Web 负载均衡笔记,需要的朋友可以参考下

环境介绍

物理操作系统:Windows10

虚拟机软件:VMWare Workstation 16 Pro

虚拟操作系统统:CentOS7 Nginx:1.24.0Keepalived:2.2.8

资源规划

在VMWare Worksattion中安装了2台CentOS7的虚拟机,桥接方式下IP地址分别为:192.168.0.35、192.168.0.36

VIPIP主机名Nginx端口默认主从
192.168.0.100192.168.0.35wongoing0188MASTER
192.168.0.100192.168.0.36wongoing0288BACKUP

一、Nginx安装

在2台虚拟机中安装Nginx,过程如下:

1.1、安装编译 Nginx 所需的依赖包

# yum install gcc gcc-c++ make automake autoconf libtool pcre pcre-devel zlib zlib-devel openssl openssl-devel ca-certificates

安装过程中有提示的时直接输入y继续就可以了。

1.2、下载Nginx

# cd /usr/local/src/# wget http://nginx.org/download/nginx-1.24.0.tar.gz

1.3、编译安装 Nginx

# cd /usr/local/src/# tar -zxvf nginx-1.24.0.tar.gz# cd nginx-1.24.0# ./configure --prefix=/usr/local/nginx# make && make install

1.4 配置 Nginx

# vi /usr/local/nginx/conf/nginx.conf

1、把第一行的#user nobody;前面的的#去掉,把nobody改为root2、把侦听的端口号由默认80改为88修改后内容如下:

user root;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
server {
listen 88;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}

1.5 修改 Nginx 欢迎首页内容(用于后面测试, 用于区分两个节点的 Nginx)

# vi /usr/local/nginx/html/index.html

修改的内容为在标题内容中增加当前节点的IP地址192.168.0.35这台服务器的nginx欢迎页内容如下:

<h1>Welcome to nginx! 192.168.0.35</h1>

192.168.0.36这台服务器的nginx欢迎页内容如下:

<h1>Welcome to nginx! 192.168.0.36</h1>

1.6 系统防火墙打开对应的端口 88

命令如下:

# firewall-cmd --zone=public --add-port=88/tcp --permanent#permanent永久生效,没有此参数防火墙重启便失效

相关命令1、查看防火墙状态

systemctl status firewalld //或者 firewall-cmd --state

2、启动防火墙

# systemctl start firewalld.service

3、重启防火墙

firewall-cmd --reload  或者  service firewalld restart

4、防火墙开放3306端口

firewall-cmd --zone=public --add-port=3306/tcp --permanent  //--permanent永久生效,没有此参数防火墙重启便失效

5、防火墙关闭3306端口

firewall-cmd --zone=public --remove-port=3306/tcp --permanent

6、禁用防火墙

systemctl stop firewalld

7、设置开机启动防火墙

systemctl enable firewalld

8、停止并禁用开机启动防火墙

systemctl disable firewalld

9、查看端口列表

firewall-cmd --permanent --list-port

1.7 测试 Nginx 是否安装成功

# /usr/local/nginx/sbin/nginx -t

出现以下结果表示成功

nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is oknginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

1.8 启动 Nginx

# /usr/local/nginx/sbin/nginx

重启 Nginx

# /usr/local/nginx/sbin/nginx -s reload

1.9 设置 Nginx 开机启动

1、在系统服务目录下创建nginx.service文件

# vi /lib/systemd/system/nginx.service

内容如下:

[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s quit
PrivateTmp=true
[Install]
WantedBy=multi-user.target

参数解释:Description:描述服务After:描述服务类别[Service]服务运行参数的设置Type=forking是后台运行的形式ExecStart为服务的具体运行命令ExecReload为重启命令ExecStop为停止命令PrivateTmp=True表示给服务分配独立的临时空间注意:[Service]的启动、重启、停止命令全部要求使用绝对路径[Install]运行级别下服务安装的相关设置,可设置为多用户,即系统运行级别为32、设置开机自启动

systemctl enable nginx.service

3、重新载入systemd,扫描新的或有变动的单元

systemctl daemon-reload

4、查看服务状态

systemctl status nginx.service

如下图:在这里插入图片描述

1.10 分别访问2个节点的Nginx

在浏览器上分别访问2个节点的Nginx如下图:在这里插入图片描述

在这里插入图片描述

二、Keepalived安装

2.1 下载Keepalived

Keepalived的官网地址为:https://www.keepalived.org/

可以看到最新的稳定版本如下图:

在这里插入图片描述

如下可以在服务器上直接下载最新版本

# cd /usr/local/src/# wget https://www.keepalived.org/software/keepalived-2.2.8.tar.gz

2.2 解压与安装Keepalived

tar -xzvf keepalived-2.2.8.tar.gzcd keepalived-2.2.8/./configure --prefix=/usr/local/keepalived --sysconf=/etcmake && make install

安装完成后有3部分内容1、/usr/local/keepalived目录内容

在这里插入图片描述2、/etc/keepalived目录内容在这里插入图片描述3、/etc/sysconfig目录下有keepalived在这里插入图片描述

2.3 修改keepalived配置

1、把2个节点服务器上的/etc/keepalived/keepalived.conf.sample复制(或者直接重命名)一份命名为keepalived.conf

cd /etc/keepalivedcp keepalived.conf.sample keepalived.conf

如下图:

在这里插入图片描述

2、编辑/etc/keepalived/keepalived.conf(1)MASTER节点(192.168.0.35)的内容如下(可以把原来的内容全部删除):

! Configuration File for keepalived
global_defs {
## keepalived 自带的邮件提醒需要开启 sendmail 服务。 建议用独立的监控或第三方 SMTP
router_id wongoing01    ## 标识本节点的字条串,通常为 hostname
}
## keepalived 会定时执行脚本并对脚本执行的结果进行分析,动态调整 vrrp_instance 的优先级。如果脚本执行结果为 0,并且 weight 配置的值大于 0,则优先级相应的增加。如果脚本执行结果非 0,并且 weight配置的值小于 0,则优先级相应的减少。其他情况,维持原本配置的优先级,即配置文件中 priority 对应的值。
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh"     ## 检测 nginx 状态的脚本路径
interval 2     ## 检测时间间隔
weight -20   ## 如果条件成立,权重-20
}
## 定义虚拟路由, VI_1 为虚拟路由的标示符,自己定义名称
vrrp_instance VI_1 {
state MASTER      ## 主节点为 MASTER, 对应的备份节点为 BACKUP
interface ens33     ## 绑定虚拟 IP 的网络接口,与本机 IP 地址所在的网络接口相同, 虚拟机里面一般是ens33,物理主机通常是eth0
virtual_router_id 51    ## 虚拟路由的 ID 号, 两个节点设置必须一样, 可选 IP 最后一段使用, 相同的 VRID 为一个组,他将决定多播的 MAC 地址
priority 100            ## 节点优先级, 值范围 0-254, MASTER 要比 BACKUP 高
nopreempt            ## 优先级高的设置 nopreempt 解决异常恢复后再次抢占的问题
advert_int 1          ## 组播信息发送间隔,两个节点设置必须一样, 默认 1s
## 设置验证信息,两个节点必须一致
authentication {
auth_type PASS
auth_pass 1111      ## 真实生产,按需求对应该过来
}
## 将 track_script 块加入 instance 配置块
track_script {
chk_nginx        ## 执行 Nginx 监控的服务
}
## 虚拟 IP 池, 两个节点设置必须一样
virtual_ipaddress {
192.168.0.100      ## 虚拟 ip,可以定义多个
}
}

(2)BACKUP节点(192.168.0.36)的内容如下(可以把原来的内容全部删除):

! Configuration File for keepalived
global_defs {
router_id wongoing02
}
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh"
interval 2
weight -20
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111!i!
}
track_script {
chk_nginx
}
virtual_ipaddress {
192.168.0.100
}
}

2.4 编写 Nginx 状态检测脚本

编写 Nginx 状态检测脚本 /etc/keepalived/nginx_check.sh (已在 keepalived.conf 中配置)脚本要求:如果 nginx 停止运行,尝试启动,如果无法启动则杀死本机的 keepalived 进程, keepalied将虚拟 ip 绑定到 BACKUP 机器上。

# vi /etc/keepalived/nginx_check.sh

内容如下:

#!/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

保存后,给脚本赋执行权限:

# chmod +x /etc/keepalived/nginx_check.sh

##2.5 启动 Keepalived

# systemctl start keepalived.service

查看keepalived服务状态

# systemctl status keepalived.service

如下图:

在这里插入图片描述

2.6 设置Keepalived开启自启动

systemctl enable keepalived.service

2.7 Keepalived+Nginx 的高可用测试

同时启动192.168.0.35和192.168.36上的Nginx和Keepalived,我们通过VIP(192.168.0.100)来访问Nginx如下:

在这里插入图片描述

我们关闭192.168.0.35上的Keepalived和Nginx

systemctl stop keepalived.servicesystemctl stop nginx.service

此时,再通过VIP(192.168.0.100)来访问Nginx,如下

在这里插入图片描述

我们再开启192.168.0.35上的Keepalived和Nginx在192.168.0.100执行如下命令:

systemctl start nginx.servicesystemctl start keepalived.service

或者只执行

systemctl start keepalived.service

因为我们写了脚本 nginx_check.sh,这个脚本会为我们自动自动Nginx。此时,我们再通过VIP(192.168.50.130)来访问Nginx,如下

在这里插入图片描述

至此,Keepalived + Nginx 实现高可用 Web 负载均衡搭建完毕!

相关文章

  • 详解Nginx的配置函数对于请求体的读取

    详解Nginx的配置函数对于请求体的读取

    这篇文章主要介绍了Nginx的配置函数对于请求体的读取,深入Nginx的内核配置中进行讲解,需要的朋友可以参考下
    2015-12-12
  • Nginx捕获并自定义proxy_pass返回的错误问题

    Nginx捕获并自定义proxy_pass返回的错误问题

    这篇文章主要介绍了Nginx捕获并自定义proxy_pass返回的错误问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06
  • nginx 平滑重启的实现方法

    nginx 平滑重启的实现方法

    这篇文章主要介绍了nginx 平滑重启的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-05-05
  • Nginx部署https网站并配置地址重写的步骤详解

    Nginx部署https网站并配置地址重写的步骤详解

    今天小编就为大家分享一篇关于Nginx部署https网站并配置地址重写的步骤详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • nginx配置负载均衡的服务宕机了怎么处理

    nginx配置负载均衡的服务宕机了怎么处理

    这篇文章主要为大家介绍了nginx配置负载均衡的服务宕机的处理方法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-06-06
  • nginx部署vue项目的详细图文教程

    nginx部署vue项目的详细图文教程

    很多小伙伴在做完Vue项目之后,想要部署到服务器上自己运行试试,下面这篇文章主要给大家介绍了关于nginx部署vue项目的详细图文教程,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2022-09-09
  • 解决httpd占用80端口导致Nginx启动失败报错的解决办法

    解决httpd占用80端口导致Nginx启动失败报错的解决办法

    今天在建自己小网站时启动Nginx时,发现其报下列错误,意思是因为80端口被占用导致Nginx启动失败,所以本文小编给大家介绍介绍如何解决解决httpd占用80端口导致Nginx启动不成功报nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
    2023-11-11
  • nginx: [warn]

    nginx: [warn] "log_format" directive used only on "http" lev

    这篇文章主要介绍了nginx: [warn] "log_format" directive used only on "http" level 解决方法,需要的朋友可以参考下
    2014-08-08
  • 由于Nginx配置文件问题导致打不开网站unknown directive的解决

    由于Nginx配置文件问题导致打不开网站unknown directive的解决

    这篇文章主要介绍了由于Nginx配置文件问题导致打不开网站unknown directive,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-06-06
  • Nginx 禁止IP访问 只允许域名访问

    Nginx 禁止IP访问 只允许域名访问

    今天要在Nginx上设置禁止通过IP访问服务器,只能通过域名访问,这样做是为了避免别人把未备案的域名解析到自己的服务器IP而导致服务器被断网,从网络上搜到以下解决方案
    2016-09-09

最新评论