记录一次nginx+keepalived实现双机热备的过程

本文详细记录了使用nginx和keepalived在两台物理机上实现双机热备的过程,包括nginx的安装配置,解决依赖问题,如pcre和zlib,以及keepalived的安装与配置,同时提到了防火墙设置、错误排查等关键步骤。

离线安装痛苦啊~~~~

1.两台物理机服务器分别开两台windows和1台linux虚拟机

windows作为应用服务器,linux作为转发服务器装配nginx和keepalived

2.nginx安装

因为我这需要负载的主要是tcp请求,所以nginx版本选择1.20.2(1.9版本以上都自带stream,随意选择)
切机开linux虚拟机的时候要选择装载ssh!!!否则没有ssh链接真的难受,鄙人最终选择重装系统。

2.1下载nginx

下载地址
tar文件上传到linux服务器上

2.2安装

解压,记得进入到上传目录

tar -zkvf nginx-1.20.2

切换nginx目录

cd nginx-1.20.2

因为要用tcp,需要下载一个tcp的文件
最好上传解压后的文件夹
添加tcp模块

 patch -p1 < ../nginx_tcp_proxy_module-master/tcp.patch

检查环境,创建安装文件

./configure --with-stream --add-module=../nginx_tcp_proxy_module-master/

安装,最好管理员安装

sudo make && sudo make install

正常情况下这个时候你的/usr/local文件夹下有一个nginx目录了
安装失败的话可能是缺少环境,大概率是openssl、zlib、pcre这三个,具体看报错信息下载安装就好了

2.3nginx配置

在/usr/local/nginx/conf下编辑nginx.config文件,建议送过ssh工具通过文本打开修改,直接修改太坑了。
命令行修改
直接通过命令行修改

vim nginx.config

完成后通过:wq保存退出即可。
配置如下


#user  nobody;
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;
}
#添加的tcp负载配置
stream {
	upstream pf1{
		server 192.168.40.149:8096 weight=1 max_fails=3 fail_timeout=30s;
		server 192.168.40.150:8096 weight=1 max_fails=3 fail_timeout=30s;
	}
	server {
		listen 8096;
		proxy_pass pf1;  #要和上面保持一直
	}
}

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       80;
        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;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }


    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}


    # HTTPS server
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;

    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;

    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}

}

保存退出。
修改失败的话退回到local目录下给文件夹增加读写权限

sudo chmod -R 777 nginx

nginx配置完成

访问地址应该是nginx服务器地址,端口是配置文件设置的监听端口
无法访问web情况下可能是防火墙没有禁用
查看防火墙状态

systemctl status firewalld

禁用防火墙

systemctl stop firewalld

2.4错误信息

(1)缺少pcre
./configure: error: the HTTP rewrite module requires the PCRE library.
You can either disable the module by using --without-http_rewrite_module
option, or install the PCRE library into the system, or build the PCRE library
statically from the source with nginx by using --with-pcre=<path> option.

下载一个安装就行,重复步骤不在赘述,我用的8.40版本

(2)缺少zlib
./configure: error: the HTTP gzip module requires the zlib library.
You can either disable the module by using --without-http_gzip_module
option, or install the zlib library into the system, or build the zlib library
statically from the source with nginx by using --with-zlib=<path> option.

同样安装即可。我用的是1.2.11

3.keepalived安装

3.1安装

下载keepalived上传至linux服务器
解压

 tar -zxvf keepalived-2.0.20.tar.gz 

切换至keepalived目录下执行
指定目录

./configure --prefix=/usr/local/keepalived/

报错

 !!! OpenSSL is not properly installed on your system. !!!
  !!! Can not include OpenSSL headers files.            !!!

没有openssl或者版本过低吧 具体原因资料太多了,不过我解决问题就是没啥装啥 太费劲就研究新方案
下载一个openssl安装包,我这是1.1.1版本
同样解压、编译、安装不废话了
安装完成后查看版本

openssl version

如果版本没有切换,执行

mv /usr/bin/openssl /usr/bin/openssl.bak

将原始文件备份掉
执行

 sudo ln -fs /usr/local/openssl/lib/libssl.so.1.1 /usr/lib64/libssl.so.1.1
 sudo ln -fs /usr/local/openssl/lib/libcrypto.so.1.1 /usr/lib64/libcrypto.so.1.1

这两条应该是添加新版本路径
再次查看版本(可能会提示不存在,没关系,退掉ssh连接重登等一下就好了,我估计可能是查询路径问题)
切换成功

回到keepalived目录下继续编译安装

./configure --prefix=/usr/local/keepalived/
sudo make
sudo make install

安装完成后切换到usr/local/keepalived/etc/keepalived下修改配置文件keepalived.conf

# 修改 Keepalived 配置文件,将原本的 keepalived.conf 文件备份,新建 keepalived.conf 文件加入如下内容
# 注意:这个是 master(主机) 的配置文件
! Configuration File for keepalived		# 这一行为注释
global_defs { 
	router_id nginx01	# router_id 机器标识,通常使用 hostname,相对具有唯一性,和备机区分开,不能使用同一个标识
	script_user root
	enable_script_security
}


vrrp_script chk_nginx {		# 定义一个检测脚本,在global_defs之外配置
  script "/etc/keepalived/check_nginx.sh"	# 自己写的监测脚本
  interval 2	# 每2s监测一次
  weight 10		# 该参数用于指定当监测失效时,该设备的优先级会减少的值,该值为负表示减少
  fall 2        # 尝试两次都成功才成功
  rise 2        # 尝试两次都失败才失败
}


vrrp_instance VI_1 {		# 定义一个vrrp_install实例,名称为VI_1
	state MASTER			# 表示该实例的角色状态,有MASTER和BACKUP两种主备状态
	interface eno8			# 对外提供服务的网络接口,注意修改为自己的网卡名称,如 ens33,eth0,eth1
	virtual_router_id 68	# 虚拟路由ID标识,主备服务器配置中相同实例的ID必须一致
	priority 150			# priority表示实例优先级,数字越大,优先级越高。master 的优先级必须大于 backup
	advert_int 1			# 设定 master 与 backup 负载均衡器之间同步检查的时间间隔,默认是秒
	
	authentication {		# 权限认证配置
		auth_type PASS		# 主要有 PASS 和 AH 两种
		auth_pass 1111		# 验证密码,同一个 vrrp_instance 下 MASTER 和 BACKUP 密码必须相同
	}
	
	virtual_ipaddress {
		192.168.93.200		# 虚拟IP地址;可以配置多个IP,每个IP占一行。注意,这里的IP就是在工作中访问 zabbix server 需要和域名绑定的ip
	}
	
	
	track_script {		# 调用自定义的脚本
        chk_nginx
    }
	
	notify_master /etc/keepalived/to_master.sh		# 指定当切换到 master 时,执行的脚本,即切换到 master 时要将 backup 的 server 关掉
	
	
}

to_master配置

# 指定当切换到 master 时,执行的脚本,即切换到 master 时要将 backup 的 server 关掉
#!/bin/bash

sshpass -p 0 ssh -o StrictHostKeyChecking=no root@192.168.40.151 "nginx -s stop"

nginx

check_nginx配置

#! /bin/bash
# 当 nginx 服务 down 掉之后,通过 keepalived 检查,确认没有服务重新启动 nginx
nginx_server=`ps -C nginx --no-header | wc -l`

if [ $nginx_server -gt 0 ];then
    exit 1
else
	nginx
fi

将keepalived添加到环境变量

cp /usr/local/keepalived/sbin/keepalived /usr/sbin/keepalived

启动&&查看状态

systemctl start keepalived.service
systemctl status keepalived.service

启动成功
在这里插入图片描述
ping 虚拟地址
成功
通过虚拟地址访问nginx
虚拟地址访问成功
直接访问成功
测试nginx负载的服务
在这里插入图片描述
在这里插入图片描述
成功接收数据

后面吧备用服务器相同方式布置一遍,搞定

keepalived备用配置

! Configuration File for keepalived		# 这一行为注释
global_defs { 
	router_id nginx02	# router_id 机器标识,通常使用 hostname,相对具有唯一性,和主机区分开,不能使用同一个标识
}

vrrp_script chk_nginx {		# 定义一个检测脚本,在global_defs之外配置
  script "/etc/keepalived/check_nginx.sh"	# 自己写的监测脚本
  interval 2	# 每2s监测一次
  weight 10		# 该参数用于指定当监测失效时,该设备的优先级会减少的值,该值为负表示减少
  fall 2        # 尝试两次都成功才成功
  rise 2        # 尝试两次都失败才失败
}

vrrp_instance VI_1 {		# 定义一个vrrp_install实例,名称为VI_1
	state BACKUP			# 表示该实例的角色状态,有MASTER和BACKUP两种主备状态
	interface ens192			# 对外提供服务的网络接口,注意修改为自己的网卡名称,如 ens33,eth0,eth1
	virtual_router_id 51	# 虚拟路由ID标识,主备服务器配置中相同实例的ID必须一致
	priority 149			# priority表示实例优先级,数字越大,优先级越高。master 的优先级必须大于 backup
	advert_int 1			# 设定 master 与 backup 负载均衡器之间同步检查的时间间隔,默认是秒
	
	authentication {		# 权限认证配置
		auth_type PASS		# 主要有 PASS 和 AH 两种
		auth_pass 1111		# 验证密码,同一个 vrrp_instance 下 MASTER 和 BACKUP 密码必须相同
	}
	
	virtual_ipaddress {
		192.168.169.200		# 虚拟IP地址;可以配置多个IP,每个IP占一行。注意,这里的IP就是在工作中访问 zabbix server 需要和域名绑定的ip
	}
	
	track_script {		# 调用自定义的脚本
        chk_nginx
    }
	
	notify_master /etc/keepalived/to_backup.sh		# 指定当切换到 backup 时,执行的脚本,切换到 backup 时将 master 的 server 关掉
}

说两个遇到的坑吧

1.防火墙记得关闭
2.负载、和虚拟地址要在同一个网段,不然会以为明明好好的为啥就是不通
3.nginx不知名异常可以到log文件下查看error.log
4.keepalived没有日志,可以查看系统日志

tail -100f /var/log/messages
其他暂时想不起来了,也是一点点搜的资料做个记录,侵权的话联系我删除 谢谢大佬们~
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值