JAVA和Nginx 教程大全

网站首页 > 精选教程 正文

构建高可用nginx集群

wys521 2024-09-10 23:20:51 精选教程 25 ℃ 0 评论

构建高可用nginx集群

一、案例例需求:

? 部署基于nginx分发器的高可用web集群

● 分发器故障自动切换

● 数据服务器自动容错

● 任何机器宕机不中断web业务


二、实验拓扑:

三、实验环境:

角色

IP

操作环境

master

192.168.26.40 VIP=192.168.26.150

nginx+keepalived


backup

192.168.26.41 VIP=192.168.26.150

nginx+keepalived


web1

192.168.26.42

nginx

web2

192.168.26.43

nginx


四、 实验步骤:

1.Master和Backup2个节点都需要安装nginx和keepalived

(其中nginx是以tar安装包方式进行编译安装,keepalived是用yum install keepalived -y安装)


无法使用killall 命令需要下载

yum -y install psmisc

master&backup节点都需要操作
#安装依赖包和keepalived
yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel lsof elinks keepalived -y
#下载nginx安装包
wget http://nginx.org/download/nginx-1.15.5.tar.gz -P /usr/src
#安装包位置及解压
cd /usr/src
tar -zxvf nginx-1.15.5.tar.gz
#编译安装
cd nginx-1.15.5
./configure --prefix=/usr/local/nginx
make && make install
#杀死nginx
yum install psmisc
killall nginx
#启动nginx
/usr/local/nginx/sbin/nginx
#重启nginx
/usr/local/nginx/sbin/nginx -s reload
//检测nginx开启
lsof -i:80
COMMAND  PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
nginx   4191   root    6u  IPv4  21646      0t0  TCP *:http (LISTEN)
nginx   4192 nobody    6u  IPv4  21646      0t0  TCP *:http (LISTEN)

2.master和backup 配置nginx和keepalived

01、master nginx配置

[root@vms40 ~]# cat /usr/local/nginx/conf/nginx.conf
worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
         upstream web {
                server 192.168.26.42 max_fails=2 fail_timeout=3;#3秒内失败2次,则认为此节点失效
                server 192.168.26.43 max_fails=2 fail_timeout=3;
        }
server {
        listen  80;
        server_name     localhost;
        location / {
        proxy_pass http://web;
        }
}
}
[root@vms40 ~]#systemctl enable nginx --now

02、master keepalived配置

[root@vms40 ~]# cat /etc/keepalived/keepalived.conf 
! Configuration File for keepalived
global_defs {
    router_id NGINX_DEVEL
}
vrrp_script check_nginx {
    script "/etc/keepalived/nginx_pid.sh"
    interval 2
    fall 1
}
vrrp_instance nginx {
    state MASTER
    interface ens32
    mcast_src_ip 192.168.26.40
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    track_script {
        check_nginx
    }
    virtual_ipaddress {
        192.168.26.150/24
    }
}
[root@vms40 keepalived]# ip addr
1: lo:  mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens32:  mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:45:e5:48 brd ff:ff:ff:ff:ff:ff
    inet 192.168.26.40/24 brd 192.168.26.255 scope global ens32
       valid_lft forever preferred_lft forever
    inet 192.168.26.150/24 scope global secondary ens32
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe45:e548/64 scope link 
       valid_lft forever preferred_lft forever
[root@vms40 keepalived]# 

02-1、构建关联脚本

[root@vms40 ~]# cat /etc/keepalived/nginx_pid.sh 
#!/bin/bash
nginx_kp_check () {
    nginxpid=`ps -C nginx --no-header |wc -l`
    if [ $nginxpid -eq 0 ];then
        /usr/local/nginx/sbin/nginx
        sleep 1
        nginxpid=`ps -C nginx --no-header |wc -l`
        if [ $nginxpid -eq 0 ];then
            systemctl stop keepalived
        fi
    fi
}

nginx_kp_check
[root@vms40 ~]#chmod 755 /etc/keepalived/nginx_pid.sh
[root@vms40 ~]#systemctl enable keepalived --now   #开机和现在启动

脚本功能说明:统计nginx进程数量,如果进程数量的值等于0,说明nginx挂了,那么执行/usr/local/nginx/sbin/nginx去启动分发器,等待1秒后再次检查进程数量,如果进程数量的值还是等于0,则执行systemctl stop keepalived停止keepalived服务。这样就停止发组播,释放VIP,而备用服务器就开始接手工作了。

03、Backup nginx配置

[root@vms41 ~]# cat /usr/local/nginx/conf/nginx.conf
worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
         upstream web {
                server 192.168.26.42 max_fails=2 fail_timeout=3;#3秒内失败2次,则认为此节点失效
                server 192.168.26.43 max_fails=2 fail_timeout=3;
        }
server {
        listen  80;
        server_name     localhost;
        location / {
        proxy_pass http://web;
        }
}
}
[root@vms41 ~]# systemctl enable nginx --now   #开机和现在启动

04、Backup keepalived配置

[root@vms41 ~]# cat /etc/keepalived/keepalived.conf 
! Configuration File for keepalived
global_defs {
    router_id NGINX_DEVEL
}
vrrp_script check_nginx {
    script "/etc/keepalived/nginx_pid.sh"
    interval 2
    fall 1
}
vrrp_instance nginx {
    state BACKUP
    interface ens32
    mcast_src_ip 192.168.26.41
    virtual_router_id 51
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    track_script {
        check_nginx
    }
    virtual_ipaddress {
        192.168.26.150/24
    }
}
[root@vms41 ~]# ip add      
1: lo:  mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens32:  mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:27:1c:a2 brd ff:ff:ff:ff:ff:ff
    inet 192.168.26.41/24 brd 192.168.26.255 scope global ens32
       valid_lft forever preferred_lft forever
    inet 192.168.26.150/24 scope global secondary ens32
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe27:1ca2/64 scope link 
       valid_lft forever preferred_lft forever
[root@vms41 ~]# 

04-1、构建关联脚本

[root@vms41 ~]# cat /etc/keepalived/nginx_pid.sh 
#!/bin/bash
nginx_kp_check () {

#检测nginx服务
nginxpid=`ps -C nginx --no-header |wc -l`
if [ $nginxpid -eq 0 ];then

#检测不到时启动nginx
/usr/local/nginx/sbin/nginx

#1秒后继续检测
sleep 1
nginxpid=`ps -C nginx --no-header |wc -l`
if [ $nginxpid -eq 0 ];then

#启动服务失败后关闭keepalived
systemctl stop keepalived
fi
fi
}
nginx_kp_check
[root@vms41 ~]#chmod 755 /etc/keepalived/nginx_pid.sh
[root@vms41 ~]#systemctl enable keepalived --now   #开机和现在启动

05.web1、web2节点分别安装nginx和配置

#web1、web2下载nginx
yum install nginx -y
#web1、web2配置
[root@vms42 ~]# echo "web1" > /usr/share/nginx/html/index.html 
[root@vms42 ~]# curl 192.168.26.42
web1
[root@vms43 ~]# echo "web2" > /usr/share/nginx/html/index.html 
[root@vms43 ~]# curl 192.168.26.43
web2

五、 集群高可用性测试

集群测试:使用客户端正常访问VIP

访问keepalived配置的公网vip

停止nginx服务,nginx_pid.sh检测脚本将自动启动nginx

#杀死nginx服务[root@localhost ~]# killall nginx
#再次查看nginx_pid.sh是否生效,检测不到时启动nginx,已经杀死了nginx,脚本再次启动nginx,查看80端口是否启动。
[root@localhost ~]# lsof -i:80

COMMAND   PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME

nginx   18462   root    6u  IPv4  59924      0t0  TCP *:http (LISTEN)

nginx   18464 nobody    6u  IPv4  59924      0t0  TCP *:http (LISTEN)


强制停止master的nginx服务,主检测脚本发现不能启动nginx,直接杀死主keepalived服务,backup自己组播vip代替master

[root@vms40 ~]# watch -n1 'killall nginx'
每隔秒执行一次killall nginx命令
[root@40 ~]# ip add #查看VIP是否还在
1: lo:  mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens32:  mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:45:e5:48 brd ff:ff:ff:ff:ff:ff
    inet 192.168.26.40/24 brd 192.168.26.255 scope global ens32
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe45:e548/64 scope link 
       valid_lft forever preferred_lft forever


恢复master的keepalived服务,正常运行,backup退出vip


[root@vms40 keepalived]# systemctl  restart keepalived.service 
[root@vms40 keepalived]# ip addr
1: lo:  mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens32:  mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:45:e5:48 brd ff:ff:ff:ff:ff:ff
    inet 192.168.26.40/24 brd 192.168.26.255 scope global ens32
       valid_lft forever preferred_lft forever
    inet 192.168.26.150/24 scope global secondary ens32
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe45:e548/64 scope link 
       valid_lft forever preferred_lft forever
[root@vms40 keepalived]# lsof -i:80
COMMAND   PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
nginx   24068   root    6u  IPv4  71692      0t0  TCP *:http (LISTEN)
nginx   24070 nobody    6u  IPv4  71692      0t0  TCP *:http (LISTEN)
[root@vms40 keepalived]# 

web服务器故障测试

web服务器容错机制

每个设备的状态设置为:
1.down 表示单前的server暂时不参与负载
2.weight 默认为1.weight越?,负载的权重就越?。
3.max_fails :允许请求失败的次数默认为1.当超过最?次数时,返回
proxy_next_upstream 模块定义的错误
4.fail_timeout:失败超时时间,在连接Server时,如果在超时时间之内超过
max_fails指定的失败次数,会认为在fail_timeout时间内Server不可?。默认为
10s。
5.backup: 其它所有的?backup机器down或者忙的时候,请求backup机器。所以这台
机器压?会最轻。

在nginx配置文件中配置rs

upstream web{

        server 192.168.42.134 max_fails=2 fail_timeout=5;

        server 192.168.42.135 max_fails=2 fail_timeout=5;

web01服务器故障,分发器自动将请求分发到web02上面,web01 nginx恢复,请求分发正常

[root@vms42 ~]# killall nginx
[root@vms42 ~]# lsof -i:80
[root@vms42 ~]# curl  192.168.26.150
web2
[root@vms42 ~]# curl  192.168.26.150
web2
[root@vms42 ~]# curl  192.168.26.150
web2
[root@vms42 ~]# curl  192.168.26.150
web2
#重启web1 nginx
[root@vms42 ~]# systemctl  restart nginx
[root@vms42 ~]# curl  192.168.26.150
web2
[root@vms42 ~]# curl  192.168.26.150
web1
[root@vms42 ~]# curl  192.168.26.150
web2
[root@vms42 ~]# curl  192.168.26.150
web1

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表