1.前期准备

OpenResty(又称:ngx_openresty) 是一个基于 NGINX 的可伸缩的 Web 平台。

Keepalived是Linux下一个轻量级别的高可用解决方案。

2.安装OpenResty(两台)

2.1 yum 依赖库安装
yum update
yum install gcc
yum install readline-devel pcre-devel openssl-devel
2.2 编译安装openresty
tar xzvf ngx_openresty-1.19.9.1.tar.gz       # 解压

cd ngx_openresty-1.19.9.1/    # 进入解压后目录

./configure      # 不安装gcc的话,这步会报错

make  # 编译

make install  # 安装
2.3 创建openresty所需目录
mkdir /home/www

cd /home/www/

mkdir logs/ conf/ html/ cert/
  • /home//www/conf 存放nginx配置文件
  • /home//www/logs 存放nginx日志
  • /home//www/html 存放前端代码
  • /home//www/cert 存放https认证证书
2.4 创建nginx.conf
cd /home/www/conf/

vim nginx.conf

输入nginx配置,具体配置视实际调整

worker_processes  1;
events {
    worker_connections 1024;
}
http {
   
   # 不加这个前端css可能不加载
   include       /usr/local/openresty/nginx/conf/mime.types;
   default_type  application/octet-stream;
   
   # 负载
   upstream  server_1{
       server 192.168.1.2:8083 weight=1;
       server 192.168.1.3:8083 weight=1;
   }
    
   server {
		listen 443 ssl;
		# 域名
		server_name lcx.nb.com;
		# https证书
		ssl_certificate     /cert/nb.com.pem;
		ssl_certificate_key /cert/nb.com.key;
		
		ssl_session_timeout 5m;
		ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
		ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
		ssl_prefer_server_ciphers on;
		client_max_body_size 200m;

		proxy_set_header Host $host:$server_port;
		   proxy_set_header X-Real-IP $remote_addr;
		   proxy_set_header X-Real-PORT $remote_port;
		   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
		   
		location / {
		    # 前端代码index.html
			root   /home/www/html/dist/;
			index  index.html index.htm;
		}
		
		# 代理
		location /user-auth/ {
			proxy_pass      http://server_1/user-auth/;
		}
		
		location /hello {
	    default_type text/html;
            content_by_lua '
                ngx.say("<p>Hello, node1!</p>")
            ';
		}
	}
	server {
		listen       80;
		server_name  lcx.nb.com;
		return 301 https://$server_name$request_uri;
	}
}
2.5 启动nginx

编写启动脚本(非必须,只是懒得记启动命令,写成脚本方便点),脚本放在/home//www下。

# start.sh
/usr/local/openresty/nginx/sbin/nginx  -p `pwd`/ -c conf/nginx.conf

# restart.sh
/usr/local/openresty/nginx/sbin/nginx -s reload  -p `pwd`/ -c conf/nginx.conf

# stop.sh
/usr/local/openresty/nginx/sbin/nginx -s stop  -p `pwd`/ -c conf/nginx.conf

给脚本赋予执行权限

chmod +x start.sh

chmod +x restart.sh

chmod +x stop.sh

启动

./start.sh
2.6 查看日志

在/home/www/logs目录中,查看运行或错误日志。

2.7 查看ng是否启动成功

浏览器访问:http://ip/hello,出现Hello, node1

不不不,这里是会报错的,因为NG里配置监听了域名,通过ip访问80端口会转发到域名lcx.nb.com上,但是我们还没有进行域名解析,我们是需要做完keepalived后,将域名解析到虚拟IP上的,所以这时这个域名还是生效的。

如果要验证的,或本来就不打算分配域名的,可以再配置一个server,这个自己NG配置不是我们的重点,自行百度。

3.安装KeepAlived(两台)

3.1 编译安装keepalived
tar xzvf keepalived-2.2.4.tar.gz

cd keepalived-2.2.4/

./configure --prefix=/usr/local/keepalived # 安装到/usr/local/keepalived下

make && make install # 编译安装
3.2 运行前配置

从源目录复制到etc下,注意是源目录,不是安装目录!!!

cp /data/keepalived-2.2.4/keepalived/etc/init.d/keepalived /etc/init.d/

cp /data/keepalived-2.2.4/keepalived/etc/sysconfig/keepalived /etc/sysconfig

从安装目录下复制

mkdir /etc/keepalived

cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/

cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
3.3 修改配置
vim /etc/keepalived/keepalived.conf

编辑配置文件,如下:

  • master 节点
! Configuration File for keepalived

global_defs {
   # 节点ID,唯一
   router_id node_master
}


# 检查nginx是否挂掉的脚本,需要自己编写脚本逻辑
vrrp_script chk_nginx {
        script "/home/keepalived/nginx_check.sh"
        interval 2
        weight -20
}

# 全局配置
vrrp_instance VI_1 {
   
    # MASTER
    state MASTER

	# 虚拟IP绑定网卡,网卡怎么查后面看后面
    interface ens192

	# 虚拟网络集群ID,这个值所有节点保持一致
    virtual_router_id 51

	# 节点权重,主节点比从节点高即可
    priority 100

	# 主备通讯时间间隔
    advert_int 1

	# 应该是节点认证,保持所有节点一致
    authentication {
        auth_type PASS
        auth_pass 1111
    }

	# 虚拟IP,这个就是集群对外提供的IP,必须是未被分配的
    virtual_ipaddress {
        192.168.5.55
    }

    # 检查NG是否启动,NG关闭后停止keepalived,切换节点,实现高可用
    track_script {
        chk_nginx
    }
	
	# 本机ip
    unicast_src_ip 192.168.1.4
    unicast_peer {
        # 其他机器ip
        192.168.1.5
    }
	
}
  • slave节点
! Configuration File for keepalived

global_defs {
   # 节点ID,唯一
   router_id node_slave
}


# 检查nginx是否挂掉的脚本,需要自己编写脚本逻辑
vrrp_script chk_nginx {
        script "/home/keepalived/nginx_check.sh"
        interval 2
        weight -20
}

# 全局配置
vrrp_instance VI_1 {
   
    # MASTER
    state BACKUP

	# 虚拟IP绑定网卡,网卡怎么查后面看后面
    interface ens192

	# 虚拟网络集群ID,这个值所有节点保持一致
    virtual_router_id 51

	# 节点权重,主节点比从节点高即可
    priority 80

	# 主备通讯时间间隔
    advert_int 1

	# 应该是节点认证,保持所有节点一致
    authentication {
        auth_type PASS
        auth_pass 1111
    }

	# 虚拟IP,这个就是集群对外提供的IP,必须是未被分配的
    virtual_ipaddress {
        192.168.5.55
    }

    # 检查NG是否启动,NG关闭后停止keepalived,切换节点,实现高可用
    track_script {
        chk_nginx
    }
	
	# 本机ip
    unicast_src_ip 192.168.1.5
    unicast_peer {
        # 其他机器ip
        192.168.1.4
    }
	
}
3.4 创建nginx监测脚本

我们的目的是实现NG的高可用,如果不配置ng监测,keepalived保证的是服务器的高可用,即如果服务器挂了,导致keepalived节点掉线,则切换节点,而NG挂了并不影响keepalived,显然但这种不满足我们的需求,所以我们需要使用脚本来实现NG挂后干掉此节点的keepalived。
在/home/keepalived/目录下(目录可自定义,和上面的配置文件中保持一致)创建nginx_check.sh

vim /home/keepalived/nginx_check.sh
#! /bin/bash
pidof nginx
if [ $? -ne 0 ];then
/etc/init.d/keepalived stop
fi
# 执行权限
chmod +x nginx_check.sh
3.5 查看网卡
ip a

通过以上命令查看网卡列表,选择一个顺眼的。

3.6 启动keepalived

因为我们在3.2做了配置,可以在任意目录下启动

# 启动keepalived
service keepalived start

# 配置开机自启动
systemctl enable keepalived
3.7 查看日志
tail -f  /var/log/messages
3.8 查看虚拟IP绑定

切换到master节点上

ip a

还是这个命令,查看你选择的网卡下是否成功添加了一条,IP地址为你配置的虚拟IP,有就是成功了,现在访问这个虚拟IP会被转发到master节点。

4. 域名解析

这步看需不需要哈,我们在NG中是配置了域名的,此时把lcx.nb.com域名解析到192.168.5.55这个虚拟IP上,大功告成。

5. 验证

两台NG都有 /hello 的代理转发,输出的内容分别是 hello_node1(master) 和 hello_node2(slave),两台都启动,浏览器访问 https://lcx.nb.com/hello ,出现hello_node1,一直刷新页面,发现一直都是hello_node1,因为他是master节点,此时虚拟IP指向次节点。

  • 关闭master节点NG
    执行事先编写的NG停止脚本,刷新浏览器,输出 hello_node2,节点切换至备用节点,同理,如果是直接杀掉master上的keepalived进程,但是NG还是好的,也是会切换到备用节点的。

需要关注的一点是,我们以上的配置逻辑是,NG挂后杀掉keepalived,但是出现以上情况后,我们人肉运维重启NG后,keepalived是需要手动重启的,不然该节点无效。当然大佬可以编写启动脚本,先启动NG再启动keepalived。

  • reload NG
    NG reload 不会触发我们编写的脚本逻辑去杀掉keepalived,至于为什么可以看下NG的平滑重启reload命令。因此日常发版需要重启NG是,直接reload即可,不需要重启keepalived.

新手上路,有较多不足。战战兢兢,为记录巩固,亦为分享交流,有错误之处还请不吝赐教!