1.前期准备
- 两台Linux服务器(以下以Centos7为例)
- OpenResty安装包(1.19.9.1)
- KeepAlived安装包(2.2.4)
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.
新手上路,有较多不足。战战兢兢,为记录巩固,亦为分享交流,有错误之处还请不吝赐教!