用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

相关实践学习
部署高可用架构
本场景主要介绍如何使用云服务器ECS、负载均衡SLB、云数据库RDS和数据传输服务产品来部署多可用区高可用架构。
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
10天前
|
负载均衡 算法 应用服务中间件
面试题:Nginx有哪些负载均衡算法?Nginx位于七层网络结构中的哪一层?
字节跳动面试题:Nginx有哪些负载均衡算法?Nginx位于七层网络结构中的哪一层?
28 0
|
2月前
|
负载均衡 应用服务中间件 Linux
高可用系列文章之三 - NGINX 高可用实施方案
高可用系列文章之三 - NGINX 高可用实施方案
|
3月前
|
负载均衡 应用服务中间件 nginx
百度搜索:蓝易云【Nginx和tomcat实现负载均衡教程】
至此,你已经成功地使用Nginx和Tomcat实现了负载均衡。Nginx将根据配置的负载均衡策略将客户端请求分发到多个Tomcat服务器上,以提高系统的性能和可用性。请注意,在实际生产环境中,还需要进行其他配置和优化,如健康检查、会话保持等,以满足具体的需求。
34 0
|
3月前
|
负载均衡 安全 前端开发
百度搜索:蓝易云【Nginx与Tomcat负载均衡-动静分离教程】
这些是将Nginx与Tomcat结合使用实现负载均衡和动静分离的基本步骤。根据您的需求和具体环境,可能还需要进行其他配置和调整。请确保在进行任何与网络连接和安全相关的操作之前,详细了解您的网络环境和安全需求,并采取适当的安全措施。
48 1
|
3月前
|
负载均衡 应用服务中间件 nginx
nginx-tomcat反向代理以及负载均衡测试
nginx-tomcat反向代理以及负载均衡测试
|
2月前
|
负载均衡 Java 应用服务中间件
|
2月前
|
存储 缓存 运维
解密一致性哈希算法:实现高可用和负载均衡的秘诀
解密一致性哈希算法:实现高可用和负载均衡的秘诀
134 0
|
2月前
|
负载均衡 监控 应用服务中间件
Nginx负载均衡:你的网站流量翻倍利器
Nginx负载均衡:你的网站流量翻倍利器
42 0
|
2月前
|
消息中间件 关系型数据库 MySQL
使用Nginx的stream模块实现MySQL反向代理与RabbitMQ负载均衡
使用Nginx的stream模块实现MySQL反向代理与RabbitMQ负载均衡
60 0
|
3月前
|
缓存 负载均衡 算法
【Nginx】Nginx 负载均衡
【1月更文挑战第25天】【Nginx】Nginx 负载均衡