写点什么

生产环境部署 Nginx 服务器双机热备部署 -keepalived(多种模式教程)

  • 2024-07-01
    福建
  • 本文字数:5186 字

    阅读完需:约 17 分钟

前言:今天演示下生产环境 keepalived 的部署方式,安装模式有很多,比如说主备模型和双主模型,主备分:抢占模式 和 非抢占模式。这里我会一一展开说具体怎么配置一、双节点均部署 Nginx:


第一步:上传安装包到/usr/local/


第二步:安装编译依赖(使用普通用户需要家 sudo)

yum install gcc gcc-c++yum install zlib zlib-develyum install pcre pcre-develyum install openssl libssl-dev
复制代码


第三步:解压,编译安装:

解压命令: sudo tar -zxvf nginx-1.24.0.tar.gz 进入nginx路径:cd nginx-1.24.0	编译安装:命令:sudo ./configure --prefix=/etc/nginx --sbin-path=/usr/bin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --with-http_ssl_module# --with-http_ssl_module这个参数为了启用 SSL 支持。命令:sudo make install
复制代码


第四步:启动 nginx 命令:sudo nginx



第五步:停止 nginx命令:sudo nginx -s stop


第六步:配置 nginx 开机启动

sudo vim /etc/rc.d/rc.local添加执行语句/usr/bin/nginx退出保存开机启动文件授权sudo chmod +x /etc/rc.d/rc.local
复制代码


第六步:重载 nginx

nginx -s reload

Nginx 安全加固配置:在 nginx.conf 配置文件里加上 TLSv1.2 TLSv1.3; 和隐藏版本号的部分。

# 在server { }块里配置启用TLSv1.2和TLSv1.3的参数     ssl_protocols TLSv1.2 TLSv1.3;  # 在http { }块里配置隐藏Nginx服务器版本信息的参数    server_tokens off; 
复制代码


二、双节点部署 keepalived 主备模式


第一步:上传安装包到/mpjava/


第二步:安装 gcc 等编译需要的软件库。(要求网络能连接外网进行更新,如果已安装,可跳过此步骤)

命令:yum -y install libnl libnl-devel 命令:yum -y install gcc gcc-c++命令:yum -y install  openssl 命令:yum -y install openssl-devel命令:yum -y install libnl3-devel
复制代码


第三步:解压,并编译安装

命令:tar -zxf keepalived-2.2.4.tar.gz命令:cd keepalived-2.2.4命令:./configure --prefix=/usr/local/keepalived命令:make && make install
复制代码



第四步:复制配置文件

命令:mkdir  -p  /etc/keepalived命令:cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/ #主配置文件命令:cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/命令:ln -s /usr/local/keepalived/sbin/keepalived /sbin/
复制代码


第五步:设置开机启动命令:chkconfig keepalived on


第六步:启动 keepalived

命令:systemctl start keepalived命令:ps -ef | grep keepalived
复制代码



问题:发现未能正常启动

查看日志命令:systemctl status keepalived.service -l:查看 keepalived 服务的状态及相关日志信息journalctl -u keepalived.service -f:实时查看 keepalived 服务的日志输出tail -22f /var/log/messages | grep Keepalived:通过查看系统日志/var/log/messages中与 Keepalived 相关的内容来获取日志信息
复制代码


原因:通过查询系统日志发现 keepalived 配置文件默认网卡名和当前服务器网卡名不一致。


解决:需要修改/etc/keepalived/keepalived.conf 的网卡名,与服务器同步即可。重启keepalived:systemctl start keepalived



第七步:新建 nginx 检测脚本 nginxcheck.sh,并存放在指定目录,本例使用:/mpjava/nginxcheck.sh

命令:vim /mpjava/nginxcheck.sh添加以下内容:#/bin/sh
nginxPidNum=`ps -C nginx --no-header |wc -l`if [[ $nginxPidNum -eq 0 ]];then killall keepalivedfi注:需要设置nginxcheck.sh有执行权限,chmod 777 /mpjava/nginxcheck.sh
复制代码


第八步:按下例分别修改主、备服务器/etc/keepalived/keepalived.conf


声明:这里的 ip 为虚假 ip,只是举例说明


主节点:

! Configuration File for keepalived
global_defs { notification_email { acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 10.0.0.1 #配置当前网关 smtp_connect_timeout 30 router_id LVS_DEVEL vrrp_skip_check_adv_addr vrrp_strict vrrp_garp_interval 0 vrrp_gna_interval 0}
vrrp_script chk_nginx { script "/mpjava/nginxcheck.sh" #脚本位置 interval 2 #检测时间间隔 weight 2 #权重2}
vrrp_instance VI_1 { state BACKUP #主节点如果写BACKUP,和配置下面的nopreempt参数就为 非抢占模式;如果写MASTER,删除nopreempt参数,则为 抢占模式 nopreempt #非抢占模式参数 interface enp4s3 virtual_router_id 69 #不能使用同网段已使用的ip地址;同一个VRRP实例中每个节点的虚拟路由ID必须相同 priority 100 #不管是否开启抢占模式,主节点的优先级必须高于 从节点 advert_int 1 authentication { auth_type PASS auth_pass 1111 }
track_script { #以脚本为监控chk_http_port是前面填写的 chk_nginx }
virtual_ipaddress { 10.0.0.10 #vip }}
复制代码


从节点:

! Configuration File for keepalived
global_defs { notification_email { acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 10.0.0.1 #配置当前网关 smtp_connect_timeout 30 router_id LVS_DEVEL vrrp_skip_check_adv_addr vrrp_strict vrrp_garp_interval 0 vrrp_gna_interval 0}
vrrp_script chk_nginx { script "/mpjava/nginxcheck.sh" #脚本位置 interval 2 #检测时间间隔 weight 2 #权重2}
vrrp_instance VI_1 { state BACKUP #不管是抢占模式否,从节点设置为backup nopreempt #非抢占模式参数,如果不开启该模式,需要删除 interface eth0 virtual_router_id 69 #不能使用同网段已使用的ip地址;同一个VRRP实例中每个节点的虚拟路由ID必须相同 priority 99 advert_int 1 authentication { auth_type PASS auth_pass 1111 }
track_script { #以脚本为监控chk_http_port是前面填写的 chk_nginx }
virtual_ipaddress { 10.0.0.10 #VIP }}`
复制代码


第九步:验证


由于涉及公司内网 ip,验证结果不方便展示,我这里口述方法:

抢占模式:启动两个节点的nginx和keepalived,当主节点的keepalived关了后,VIP会漂移到从节点上,当主节点启动后,此时VIP会漂移回主节点;
非抢占模式:启动两个节点的nginx和keepalived,当主节点的keepalived关了后,VIP会漂移到从节点上,此时再将主节点启动后,VIP不会漂移回主节点;(以上验证方法用命令ip a实时查看网卡的VIP地址的漂移节奏)
复制代码


高可用集群中的不抢占功能。在一个 HA 集群中,如果主节点死机了,备用节点会进行接管,主节点再次正常启动后一般会自动接管服务。对于实时性和稳定性要求不高的业务系统来说,这种来回切换的操作还是可以接受的。而对于稳定性和实时性要求很高的业务系统来说,不建议来回切换,毕竟服务的切换存在一定的风险和不稳定性


三、Keepalived 主主模式


第一步:按下例分别修改主、主服务器/etc/keepalived/keepalived.conf


声明:这里的 ip 为虚假 ip,只是举例说明


主节点 1:

! Configuration File for keepalived
global_defs { notification_email { acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 10.0.0.1 #配置当前网关 smtp_connect_timeout 30 router_id LVS_DEVEL vrrp_skip_check_adv_addr vrrp_strict vrrp_garp_interval 0 vrrp_gna_interval 0}
vrrp_script chk_nginx { script "/mpjava/nginxcheck.sh" #脚本位置 interval 2 #检测时间间隔 weight 2 #权重2}
vrrp_instance VI_1 { state MASTER #主节点为MASTER interface enp4s3 virtual_router_id 69 #不能使用同网段已使用的ip地址;同一个VRRP实例中每个节点的虚拟路由ID必须相同 priority 100 #MASTER节点必须高于BACKUP节点 advert_int 1 authentication { auth_type PASS auth_pass 1111 }
track_script { #以脚本为监控chk_http_port是前面填写的 chk_nginx }
virtual_ipaddress { 10.0.0.8 #vip1 }}
vrrp_instance VI_2 { state BACKUP #该节点设置为backup interface eth0 virtual_router_id 70 # 同一个VRRP实例中每个节点的虚拟路由ID必须相同 priority 90 # MASTER节点必须高于BACKUP节点 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 10.0.0.9 #vip2 }}
复制代码


主节点 2:

! Configuration File for keepalived
global_defs { notification_email { acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 10.0.0.1 #配置当前网关 smtp_connect_timeout 30 router_id LVS_DEVEL vrrp_skip_check_adv_addr vrrp_strict vrrp_garp_interval 0 vrrp_gna_interval 0}
vrrp_script chk_nginx { script "/mpjava/nginxcheck.sh" #脚本位置 interval 2 #检测时间间隔 weight 2 #权重2}
vrrp_instance VI_1 { state BACKUP #不管是抢占模式否,从节点设置为backup nopreempt #非抢占模式参数,如果不开启该模式,需要删除 interface eth0 virtual_router_id 69 #不能使用同网段已使用的ip地址;同一个VRRP实例中每个节点的虚拟路由ID必须相同 priority 99 #MASTER节点必须高于BACKUP节点 advert_int 1 authentication { auth_type PASS auth_pass 1111 }
track_script { #以脚本为监控chk_http_port是前面填写的 chk_nginx }
virtual_ipaddress { 10.0.0.8 #vip1 }}`
vrrp_instance VI_2 { state MASTER #该节点设置为MASTER interface eth0 virtual_router_id 70 #同一个VRRP实例中每个节点的虚拟路由ID必须相同 priority 100 #MASTER节点的优先级必须高于BACKUP节点 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 10.0.0.9 #vip2

}}
复制代码


第二步:验证


由于涉及公司内网 ip,验证结果不方便展示,我这里口述方法:

启动两个主节点的nginx和keepalived,将nginx中配置的域名解析到这两个VIP地址上,浏览器访问正常。此时关闭其中一个主节点的keepalived,VIP会漂移到另外一台主节点服务器上。(以上验证方法用命令ip a实时查看网卡的VIP地址的漂移节奏)
复制代码


在 keepalived 的主备模式中,当主节点正常的时候,备节点永远处于闲置状态,不会接受 web 请求,这样就会浪费一半的资源。根据自身业务和资源等综合来选择模式。


文章转载自:Linux运维技术栈

原文链接:https://www.cnblogs.com/zhoutuo/p/18276183

体验地址:http://www.jnpfsoft.com/?from=infoq

用户头像

还未添加个人签名 2023-06-19 加入

还未添加个人简介

评论

发布
暂无评论
生产环境部署Nginx服务器双机热备部署-keepalived(多种模式教程)_nginx_不在线第一只蜗牛_InfoQ写作社区