用NginX+keepalived实现高可用的负载均衡

简介:

一、 规划和准备:


用途

IP

MASTER

10.1.1.100

BACKUP

10.1.1.150

两台接入服务器公用一个虚拟IPVIP):10.1.1.200

100\150两个主机配置虚拟IP:

 # vi /etc/sysconfig/network-scripts/ifcfg-eth2:0
      DEVICE=eth2:0
      TYPE=Ethernet
      ONBOOT=yes
      BOOTPROTO=static
      IPADDR=10.1.1.200
      NETMASK=255.255.255.0
# service network restart

二、 安装:

两台接入服务器分别安装NginX和keepalived:

 · 准备依赖包:

# yum -y install gcc pcre-devel zlib-devel openssl-devel
# tar zxvf nginx-1.6.1.tar.gz
# cd nginx-1.6.1/
# ./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --with-http_stub_status_module--with-http_ssl_module --with-http_gzip_static_module
# make && make install
     

· 安装keepalived:

# tar zxvf keepalived-1.2.13.tar.gz
# ./configure --prefix=/usr/local/keepalived
# make && make install 
# cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
# cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
# chmod 755 /etc/init.d/keepalived
# chkconfig --add keepalived
# chkconfig keepalived on
# mkdir /etc/keepalived
# ln -s /usr/local/keepalived/sbin/keepalived /usr/sbin/
# ln -s /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf

configure正确的执行后,可以得到如下的输出:
Keepalived configuration
------------------------
Keepalived version       : 1.2.13
Compiler                 : gcc
Compiler flags           : -g -O2
Extra Lib                : -lpopt -lssl -lcrypto
Use IPVS Framework       : No
IPVS sync daemon support : No
Use VRRP Framework       : Yes
Use Debug flags          : No
Use VRRP Framwork VRRP
框架,这基本上是必须的,Keepalived的核心进程vrrpd

· 加入启动服务

echo "/usr/local/nginx/sbin/nginx" >> /etc/rc.local
echo "/etc/init.d/keepalived start" >> /etc/rc.local

三、 配置:


3.1 配置NginX

两台接入服务器的NginX的配置完全一样,主要是配置/usr/local/nginx/conf/nginx.conf的http。其中多域名指向是通过虚拟主机(配置http下面的server)实现;同一域名的不同虚拟目录通过每个server下面的不同location实现;到后端的服务器在http下面配置upstream,然后在server或location中通过proxypass引用。要实现前面规划的接入方式,http的配置如下:

http {
    include       mime.types;
    default_type  application/octet-stream;
   sendfile        on;
   
    upstream www.123.com {
      ip_hash;
      server 10.1.1.100:80;
      server 10.1.1.150:80;
    }
    
server {
     listen      80;
    server_name www.123.com;
     root  /data/www/html;
     index index.php index.html index.htm;

    location / {
      proxy_pass http://www.123.com;# 
反向代理
      proxy_set_header        X-Real-IP       $remote_addr;
      proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
                       }      
    location  /nginx_status {
      stub_status on; #Nginx 
状态监控配置
      access_log off;
                            }
       }
    }

验证方法:

·        首先用IP访问前表中各个应用服务器的url

·        再用域名和路径访问前表中各个应用系统的域名/虚拟路径


3.2 配置keepalived

按照上面的安装方法,keepalived的配置文件在/etc/keepalived/keepalived.conf。主、从服务器的配置相关联但有所不同。如下:


修改MASTER的keepalived.conf:

 #vim /etc/keepalived/keepalived.conf 


! Configuration File for keepalived 
global_defs { #
指定keepalived在发生切换时需要发送email到的对象,一行一个
   notification_email {
     root@localhost
   }
   notification_email_from root@localhost  #
指定发件人
   smtp_server 127.0.0.1   #
指定smtp服务器地址
   smtp_connect_timeout 30   #
指定smtp连接超时时间
   router_id MY_KEEPALIVED   #
运行keepalived机器的一个标识
}
vrrp_script chk_http_port {         
        script "/opt/nginx_pid.sh" ###
监控脚本  
        interval 2 ###
监控时间  
        weight 2  
        }  
vrrp_instance VI_1 {  
        state MASTER ### 
设置为主  
        interface eth0 ### 
监控网卡  
        virtual_router_id 51 ### 
这个两台服务器必须一样  
        priority 101 ### 
权重值MASTRE一定要高于BAUCKUP  
        authentication {  
        auth_type PASS ### 
加密  
        auth_pass test ### 
加密的密码,两台服务器一定要一样,不然会出错  
        }  
        track_script {  
        chk_http_port ### 
执行监控的服务  
        }  
        virtual_ipaddress {                  
        10.1.1.200 ### VIP 
地址          
        }  
}

 

修改BACKUPkeepalived.conf:

#vim /etc/keepalived/keepalived.conf  

! Configuration File for keepalived
global_defs {
   notification_email {
     root@localhost
   }
   notification_email_from root@localhost
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id MY_KEEPALIVED
}
vrrp_script chk_http_port {  
        script "/opt/nginx_pid.sh"  
        interval 2  
        weight 2  
}  
vrrp_instance VI_1 {  
        state BACKUP ### 
设置为备份机  
        interface eth0  
        virtual_router_id 51 ### 
 MASTRE 设置值一样  
        priority 80 ### 
 MASTRE权重值低  
  
        authentication {  
        auth_type PASS  
        auth_pass test ### 
密码  MASTRE 一样  
        }  
        track_script {  
        chk_http_port  
        }  
        virtual_ipaddress {  
        10.1.1.200 
        }  
}

 

3.3 编写监控nginx监控脚本

vim /opt/nginx_pid.sh 
#!/bin/bash
# varsion 0.0.2
根据一网友说这样做不科学,如果nginx服务起来了,但是我把keepalived 杀掉了,我的理由是,如果nginx死掉了,我觉得就很难在起来,再有就是nagios 当然要给你报警了啊。不过这位同学说的有道理,所以就稍加改了一下脚本
A=`ps -C nginx --no-header |wc -l`                ## 
查看是否有 nginx进程 把值赋给变量
if [ $A -eq 0 ];then                                         ## 
如果没有进程值得为 
                /usr/local/nginx/sbin/nginx
                sleep 3
                if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
                       killall keepalived                        ## 
则结束 keepalived 进程
                fi
fi

 

3.4 测试:

分别在两个服务器启动和日志信息可通过查看监控的日志
# cat /var/log/messages

监控 Nginx Mastaer 的日志
[plain] view plaincopy
May 12 17:33:44 localhost Keepalived_vrrp: Configuration is using : 35676 Bytes  
May 12 17:33:44 localhost Keepalived: Starting VRRP child process, pid=1245  
May 12 17:33:44 localhost Keepalived_vrrp: VRRP sockpool: [ifindex(2), proto(112), fd(8,9)]  
May 12 17:33:45 localhost Keepalived_vrrp: VRRP_Instance(VI_1) Transition to MASTER STATE  
May 12 17:33:46 localhost Keepalived_vrrp: VRRP_Instance(VI_1) Entering MASTER STATE  
May 12 17:33:46 localhost Keepalived_vrrp: VRRP_Instance(VI_1) setting protocol VIPs.  
May 12 17:33:46 localhost Keepalived_vrrp: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 10.1.1.200  
May 12 17:33:46 localhost avahi-daemon[2344]: Registering new address record for 10.1.1.200 on eth0.  
May 12 17:33:46 localhost Keepalived_vrrp: Netlink reflector reports IP 10.1.1.200 added  

监控 Nginx Backup 的日志
[plain] view plaincopy
May 11 22:28:21 localhost Keepalived: Starting Keepalived v1.1.15 (05/11,2010)  
May 11 22:28:21 localhost Keepalived_vrrp: Using MII-BMSR NIC polling thread...  
May 11 22:28:21 localhost Keepalived_vrrp: Registering Kernel netlink reflector  
May 11 22:28:21 localhost Keepalived_vrrp: Registering Kernel netlink command channel  
May 11 22:28:21 localhost Keepalived_vrrp: Registering gratutious ARP shared channel  
May 11 22:28:21 localhost Keepalived: Starting VRRP child process, pid=27040  
May 11 22:28:21 localhost Keepalived_vrrp: Opening file '/etc/keepalived/keepalived.conf'.  
May 11 22:28:21 localhost Keepalived_vrrp: Configuration is using : 35538 Bytes  
May 11 22:28:21 localhost Keepalived_vrrp: VRRP_Instance(VI_1) Entering BACKUP STATE  
May 11 22:28:21 localhost Keepalived_vrrp: VRRP sockpool: [ifindex(2), proto(112), fd(7,8)]  
May 11 22:28:23 localhost Keepalived_vrrp: VRRP_Script(chk_http_port) succeeded  

看日志可以看出,两台服务器的 MASTRE 和 BACUKUP 已经都正常了

现在我们把Master的Nginx停掉.查看Backup的日志
[plain] view plaincopy
May 11 22:28:21 localhost Keepalived: Starting VRRP child process, pid=27040  
May 11 22:28:21 localhost Keepalived_vrrp: Opening file '/etc/keepalived/keepalived.conf'.  
May 11 22:28:21 localhost Keepalived_vrrp: Configuration is using : 35538 Bytes  
May 11 22:28:21 localhost Keepalived_vrrp: VRRP_Instance(VI_1) Entering BACKUP STATE  
May 11 22:28:21 localhost Keepalived_vrrp: VRRP sockpool: [ifindex(2), proto(112), fd(7,8)]  
May 11 22:28:23 localhost Keepalived_vrrp: VRRP_Script(chk_http_port) succeeded  
May 11 22:29:25 localhost Keepalived_vrrp: VRRP_Instance(VI_1) Transition to MASTER STATE  
May 11 22:29:26 localhost Keepalived_vrrp: VRRP_Instance(VI_1) Entering MASTER STATE  
May 11 22:29:26 localhost Keepalived_vrrp: VRRP_Instance(VI_1) setting protocol VIPs.  
May 11 22:29:26 localhost Keepalived_vrrp: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 10.1.1.200 
 
可以看出backup已经变成master

现在再启动原来master的nginx,再查看backup的日志
[plain] view plaincopy
May 11 22:30:32 localhost Keepalived_vrrp: VRRP_Instance(VI_1) Received higher prio advert  
May 11 22:30:32 localhost Keepalived_vrrp: VRRP_Instance(VI_1) Entering BACKUP STATE  
May 11 22:30:32 localhost Keepalived_vrrp: VRRP_Instance(VI_1) removing protocol VIPs.  
May 11 22:30:32 localhost avahi-daemon[2409]: Withdrawing address record for 10.1.1.200 on eth0.  

可以看出又变回了backup.

 

四、还可以做什么

对于简单重复性劳动,人总是容易犯错,这种事情最好交给机器去做。比如,在这个案例中,作为统一接入服务器,可能经常要修改nginx的配置、nginx下面的html文件等。而且,一定要保证集群中的每台服务器的配置相同。最好的做法是由配置管理服务器来管理,如果没有,也可以使用简单的linux文件同步来解决。

五、SSL配置

nginx/conf下生成秘钥:

 

-rand -genkey -out myRSA.key -des3 --new -x509 -days  -key cert.key -  cert.*

#
生成免密码文件
openssl rsa -in cert.key -out cert.key.unsecure

 

 如果要启用SSL,在nginx中进行如下配置:

 

这里是的相关配置

本文转自奔跑在路上博客51CTO博客,原文链接http://blog.51cto.com/qiangsh/1564821如需转载请自行联系原作者


qianghong000

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
相关文章
|
8月前
|
应用服务中间件 Linux 网络安全
使用Nginx免费版与Keepalived实现高可用性High Availablity方案
本文介绍了如何使用Nginx免费版与Keepalived实现高可用性(HA)方案,涵盖环境搭建、Keepalived安装配置、版本升级及主从模式设置。通过虚拟机测试,结合CentOS与宝塔,详细说明VIP配置与服务启动流程,助你构建稳定可靠的Web高可用架构。
|
10月前
|
负载均衡 前端开发 应用服务中间件
Tomcat的负载均衡和动静分离(与nginx联动)
总的来说,负载均衡和动静分离是提高Web应用性能的两个重要手段。通过合理的配置和使用,我们可以让Web应用更好地服务于用户。
324 21
|
10月前
|
负载均衡 前端开发 JavaScript
LVS-DR模式、keepalived、Nginx与Tomcat合作,打造动静分离,高效负载均衡与高可用性
为了采用这样的架构,你需要对LVS-DR、Keepalived、Nginx与Tomcat有一定的理解和掌握,同时也需要投入一些时间去研究和配置,但是一旦你把它运行起来,你将会发现,这一切都是值得的。
405 11
|
Java 应用服务中间件 Shell
Nginx+Keepalived+Tomcat 实现Web高可用集群
Nginx+Keepalived+Tomcat 实现Web高可用集群
453 0
|
存储 负载均衡 NoSQL
搭建高可用及负载均衡的Redis
通过本文介绍的高可用及负载均衡Redis架构,可以有效提升Redis服务的可靠性和性能。主从复制、哨兵模式、Redis集群以及负载均衡技术的结合,使得Redis系统在应对高并发和数据一致性方面表现出色。这些配置和技术不仅适用于小型应用,也能够支持大规模企业级应用的需求。希望本文能够为您的Redis部署提供实用指导和参考。
890 9
|
负载均衡 算法 Linux
LVS+Keepalived:实现高效软负载均衡的利器
本文介绍了如何使用LVS(Linux Virtual Server)和Keepalived搭建高可用负载均衡集群。LVS通过不同调度算法将请求转发给后端服务器,而Keepalived基于VRRP协议实现服务高可用,避免IP单点故障。具体步骤包括环境准备、安装配置ipvsadm和Keepalived、启动服务及测试。文中还详细解释了配置文件中的关键参数,并提供了故障转移测试方法。最后,文章简要对比了软件、硬件和云负载均衡方案的特点,帮助读者选择合适的负载均衡策略。
1928 4
|
负载均衡 前端开发 应用服务中间件
负载均衡指南:Nginx与HAProxy的配置与优化
负载均衡指南:Nginx与HAProxy的配置与优化
850 3
|
运维 负载均衡 网络协议
LVS+Keepalived 负载均衡
LVS+Keepalived 负载均衡
452 8
LVS+Keepalived 负载均衡
|
域名解析 运维 负载均衡
LVS+Keepalived 负载均衡(二)28-1
【8月更文挑战第28天】LVS+Keepalived 负载均衡 配置 LVS VIP
308 6
|
运维 负载均衡 监控
Nginx加Keepalived实现高可用
使用Nginx和Keepalived来实现高可用性的方案,对于确保关键服务的稳定性和可靠性来说是非常有效的。此配置涉及多个步骤,包括各个服务的安装、设置及测试,目标是在主服务器故障时能无缝切换,以确保服务的持续可用。正确的配置和充分的测试是实现高可用性的保证,这也要求管理员对这些工具和它们背后的原理有深入的了解。
631 1

相关实验场景

更多