nginx+keepalived实现网站的高可用

本文介绍如何使用Nginx和Keepalived搭建高可用服务器集群,包括配置负载均衡、虚拟IP漂移及故障转移等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

搞了一天,发现自己走了好多弯路,对于像我这种小白来说,搭建服务器最需要的是搞懂原理,精确步骤,所以记录下过程。。。

自己简单画的架构:
这里写图片描述
实验环境:
redhat 6.5
主:172.25.67.2 nginx keepalived
副:172.25.67.3 nginx keepalived
vip:172.25.67.100
一:安装配置nginx
安装包:nginx-1.9.14.tar.gz
源码包安装 在安装过程中可能存在依赖性问题,解决办法:安装依赖包

[root@server2 /]# yum install -y gcc gcc-c++ zlib openssl 
[root@server2 /]# tar zxf nginx-1.9.14.tar.gz 
[root@server2 /]# cd nginx-1.9.14
[root@server2 nginx-1.9.14]# ./configure --prefix=/usr/local/nginx/      ##--prefix后面接的是安装路径

如果还存在依赖性问题,即出现报错,我们直接根据提示安装相应的依赖包
[root@server2 nginx-1.9.14]# make && make install 

启动nginx

[root@server2 nginx-1.9.14]# /usr/local/nginx/sbin/nginx         ##不报错则ok

浏览器访问 ip
这里写图片描述

此页面为nginx的默认发布页面,为了后面测试,我们可以更改发布页面:

[root@server2 /]# cd /usr/local/nginx/html/
[root@server2 html]# rm -fr *
[root@server2 html]# echo "172.25.67.2">>index.html 

此时,我们更改了发布页面
这里写图片描述

编辑配置文件:

[root@server2 nginx]# vim /usr/local/nginx/conf/nginx.conf

[root@server2 nginx]# cat /usr/local/nginx/conf/nginx.conf

#user  www www;   ##可以暂时不更改定义,Nginx运行的用户和用户组
worker_processes  1;#nginx进程数,建议设置为等于CPU总核心数。

#error_log  logs/error.log;      
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;     #全局错误日志定义类型,[ debug | info | notice | warn | error | crit ]

#pid        logs/nginx.pid;#进程pid文件
events {
    worker_connections  1024;  
}


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;          #此选项允许或禁止使用socke的TCP_CORK的选项,此选项仅在使用sendfile的时候使用

    #keepalive_timeout  0;
    keepalive_timeout  65;       #长连接超时时间,单位是秒
    ######################################################
    #gzip  on;
upstream discuz {       #负载均衡配置
                server 172.25.67.2:80 weight=1 max_fails=2 fail_timeout=10s;
                server 172.25.67.3:80 weight=1 max_fails=2 fail_timeout=10s;
}
    server {
        listen       80;
        server_name  localhost;

其他的都不用改,只需要加上负载均衡配置和 server_name localhost; 即
这里写图片描述

[root@server2 nginx]# /usr/local/nginx/sbin/nginx -t  ##检查是否有语法错误
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@server2 nginx]# /usr/local/nginx/sbin/nginx #启动

好了:到此,我们已经配置好nginx并且加入了 server 172.25.67.2:80 weight=1 max_fails=2 fail_timeout=10s; 即当2或者3服务器如果最大错误连接为2时间超过十秒就报错

在此,主备两个nginx的设置相同,不同点在于在制作发布页面时,要和server2区分开,所以我直接写下server3的ip

[root@server3 /]# cd /usr/local/nginx/html/
[root@server3 html]# rm -fr *
[root@server3 html]# echo "172.25.67.3">>index.html 

二:安装keepalived
安装包:keepalived-1.2.18.tar.gz
server2为主服务器,注意主备服务器的配置有所不同
解决依赖性:

[root@server2 /]# yum -y install gcc pcre-devel zlib-devel openssl-devel
[root@server2 keepalived-1.2.18]# ./configure --prefix=/usr/local/keepalived/       ##编译环境
[root@server2 keepalived-1.2.18]# make
[root@server2 keepalived-1.2.18]# make install

由于源文件安装的没有将文件放在指定位置,因此我们可以做个软链接,当然也可以cp,不过我觉得cp过去的如果修改文件可能会有些麻烦。。。

   70  cd /usr/local/keepalived/
   71  ln -s etc/keepalived/keepalived.conf /etc/keepalived/ 
   72  ln -s etc/rc.d/init.d/keepalived /etc/init.d/
   73  ln -s etc/sysconfig/keepalived /etc/sysconfig/

修改配置文件:
注:以下是主服务器即master的配置

[root@server2 keepalived-1.2.18]# cat /usr/local/keepalived/etc/keepalived/keepalived.conf
! Configuration File for keepalived
****************************************************
global_defs {
   notification_email {#指定keepalived在发生事件时(比如切换)发送通知邮件的邮箱
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc#keepalived在发生诸如切换操作时需要发送email通知地址
   smtp_server 127.0.0.1 #指定发送email的smtp服务器
   smtp_connect_timeout 30#设置连接smtp server的超时时间
   router_id LVS_DEVEL
}
****************************************************
#注:上述是邮件的发送设置,我们暂时不用去管
vrrp_script chk_nginx {   #检测nginx服务是否在运行。有很多方式,比如进程,用脚本检测等等
         script"/data/sh/check_nginx.sh" #这里通过脚本监测,记住这个地址,里面写检测脚本
         interval2  #脚本执行间隔,每2s检测一次
         weight2      #脚本结果导致的优先级变更,检测失败(脚本返回非0)
}
vrrp_instance VI_1 {#keepalived在同一virtual_router_id中priority(0-255)最大的会成为master,也就是接管VIP,当priority最大的主机发生故障后次priority将会接管
    state MASTER  #指定keepalived的角色,MASTER表示此主机是主服务器,BACKUP表示此主机是备用服务器
    interface eth0 #指定HA监测网络的接口。实例绑定的网卡,因为在配置虚拟IP的时候必须是在已有的网卡上添加的
    virtual_router_id 51  #虚拟路由标识MASTER和BACKUP必须是一致的
    priority 100   #定义优先级,数字越大,优先级越高,MASTER的优先级必须大于BACKUP的优先级
    advert_int 1
    authentication { #设置验证类型和密码。主从必须一样
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress { #VRRP HA 虚拟地址 如果有多个VIP,继续换行填写
        172.25.67.100
    }
    track_script{   #执行监控的服务。注意这个设置不能紧挨着写在vrrp_script配置块的后面
         chk_nginx             #引用VRRP脚本,即在 vrrp_script 部分指定的名字
                        }
}

。。。。。后面是属于lvs的配置,我们暂时不需要,直接注释或者删除

总结上面配置文件需要更改注意的地方:
vrrp_script chk_nginx {
script”/data/sh/check_nginx.sh”
interval2
weight2
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.67.100
}
track_script{
chk_nginx
}
}

黑体标记

加载vip模块

   27  modprobe ip_vs
   28  modprobe ip_vs_rr
   29  modprobe ip_vs_wrr

制作检测脚本:

[root@server2 /]#  mkdir -p /data/sh
[root@server2 /]# vim /data/sh/check_nginx.sh
[root@server2 /]# chmod +x /data/sh/check_nginx.sh 
[root@server2 nginx-1.9.14]# cat /data/sh/check_nginx.sh
#!/bin/bash
#Target: If Nginx Down, Stop keepalive!
#
killall -0 nginx

if [[ ! $? -eq 0 ]];then
         /etc/init.d/keepalived stop       ##看到这里是在etc下启动,所以一定要有上面的ln -s 
fi

server3
备服务器和主服务器唯一的不同在于配置文件中的设置

[root@server3 /]# cat /etc/keepalived/keepalived.conf 
! 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 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}

vrrp_script chk_nginx {
         script"/data/sh/check_nginx.sh" ##同样用脚本判定nginx
         是否正常
         interval2
         weight2
}
vrrp_instance VI_1 {
    state BACKUP  ##BACKUP为备服务器
    interface eth0
    virtual_router_id 51
    priority 80    ##优先级一定要低于主
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.25.67.100
    }
    track_script{
         chk_nginx
                        }
}

对于备服务器server3的配置和server2相同,不同点只是上述文件内的内容。

配置好所有后,检查是否关闭了防火墙

好了现在我们到了最后一步,开启所有服务:
server2

[root@server2 /]# /usr/local/nginx/sbin/nginx
[root@server2 /]# /etc/init.d/keepalived start
正在启动 keepalived:                                  [确定]

server3

[root@server3 /]# /usr/local/nginx/sbin/nginx
[root@server3 /]# /etc/init.d/keepalived start
正在启动 keepalived:                                  [确定]

server2(主)查看ip 发现ip已经绑定在了eth0上

[root@server2 /]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 52:54:00:55:3e:83 brd ff:ff:ff:ff:ff:ff
    inet 172.25.67.2/24 brd 172.25.67.255 scope global eth0
    inet 172.25.67.100/32 scope global eth0
    inet6 fe80::5054:ff:fe55:3e83/64 scope link 
       valid_lft forever preferred_lft forever
[root@server2 /]# 

测试:
访问vip:172.25.67.100
这里写图片描述

出现主设备nginx的发布页面

当停掉主keepalived时

[root@server2 /]# /etc/init.d/keepalived stop
停止 keepalived:                                          [确定]
[root@server2 /]# 

查看server3的ip

[root@server3 /]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 52:54:00:18:70:9b brd ff:ff:ff:ff:ff:ff
    inet 172.25.67.3/24 brd 172.25.67.255 scope global eth0
    inet 172.25.67.100/32 scope global eth0
    inet6 fe80::5054:ff:fe18:709b/64 scope link 
       valid_lft forever preferred_lft forever
[root@server3 /]# 

我们会发现vip漂移到3上
访问vip:
这里写图片描述

当我们重新打开server2的keepalived:

[root@server2 /]# /etc/init.d/keepalived start
正在启动 keepalived:                                      [确定]
[root@server2 /]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 52:54:00:55:3e:83 brd ff:ff:ff:ff:ff:ff
    inet 172.25.67.2/24 brd 172.25.67.255 scope global eth0
    inet 172.25.67.100/32 scope global eth0
    inet6 fe80::5054:ff:fe55:3e83/64 scope link 
       valid_lft forever preferred_lft forever
[root@server2 /]# 
刷新访问界面:

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值