Nginx反向代理,负载均衡,redis session共享,keepalived高可用(转)

相关知识自行搜索,直接上干货。。。javascript

使用的资源:css

nginx主服务器一台,nginx备服务器一台,使用keepalived进行宕机切换。html

tomcat服务器两台,由nginx进行反向代理和负载均衡,此处可搭建服务器集群。前端

redis服务器一台,用于session的分离共享。java

nginx主服务器:192.168.50.133node

nginx备服务器:192.168.50.135linux

tomcat项目服务器1:192.168.50.137nginx

tomcat项目服务器2:192.168.50.139c++

redis服务器:192.168.50.140web

注意访问时须要配置防火墙规则,或者关闭防火墙

 

首先进行的通用安装:

总的须要模拟五台服务器,使用vmware,所有使用centos6.5 64位,五台服务器所有安装jdk,我使用的是jdk1.8.

1.安装VMware虚拟机,安装linux系统,此处使用centOS6.5 64位,安装linux命令行工具,上传文件工具,此处使用SecureCRT,SecureFX 。安装教程再也不赘述,百度一大堆..........

这步有问题请使劲点:www.baidu.com

 

 

2.在linux上安装jdk:

安装jdk:卸载openjdk版本,上传解压jdk,配置环境变量----参考:http://jingyan.baidu.com/article/ab0b56308966acc15afa7d18.html

 

1、Nginx反向代理与负载均衡:

架构图:

 

此时须要用到三台服务器,一台nginx服务器,两台正式部署项目的服务器:选择的是192.168.50.133主nginx和192.168.50.137,192.168.50.139两台tomcat服务器

首先在两台服务器上安装tomcat:这个也是简单,很少说

安装tomcat:上传解压便可使用,bin目录下 startup.sh启动,shutdown.sh关闭

配置防火墙端口:vim /etc/sysconfig/iptables 编辑,开放8080端口,80端口等一些经常使用端口,固然后边有用到一些端口都是须要配置开放的,不建议关闭防火墙

编辑好后 service iptables restart 从新加载防火墙配置

 

若是是本身测试嫌配置麻烦,关闭防火墙: service iptables stop 重启后防火墙打开,即在这次开机状态下有效,彻底关闭再使用 chkconfig iptables off ,即会在重启后也关闭防火墙,注意有时候服务都起了但访问出错,可能就是防火墙问题哦

启动tomcat访问:192.168.50.137:8080,192.168.50.139:8080,打开tomcat首页即成功。

而后编写测试项目,部署到两台tomcat上,eclipse新建web项目,项目名为testproject,在webapp下新建一个jsp页面为index.jsp,添加以下内容

将项目中web.xml中的访问顺序<welcome-file>index.jsp</welcome-file>上移到第一个访问

 

而后右键导出为war包,testproject.war,将该war包上传到两台服务器的tomcat的webapps中

 

 而后修改tomcat的server.xml文件,在tomcat conf目录中:可使用notepad++的插件NppFTP直接连上linux,而后使用notepad++修改文件哦,保存记得使用UTF-8无BOM格式,具体去百度吧,哈哈

修改Engine标签中,添加jvmRoute,用于标识nginx访问的是哪一个服务器tomcat,137服务器标识为137Server1,139服务器标识为139Server2

在两台tomcat的server.xml文件,Host标签中添加:<Context path="" docBase="testproject"/>,path标识访问路径,docBase为项目名,表示访问项目

此时,从新启动tomcat,访问192.168.50.137:8080,192.168.50.139:8080,显示index.jsp内容:两台服务器访问显示以下

 

至此,两台tomcat服务器搭建完成。

 

在nginx主机192.168.50.133上安装nginx:

 先使用yum命令安装gcc,安装pcre,zlib,openssl:

1
2
3
4
yum install -y gcc
yum install -y pcre pcre-devel
yum install -y zlib zlib-devel
yum install -y openssl openssl-devel

 在/usr/local/目录下新建nginx-src目录,将nginx-1.8.0.tar.gz放到此处,解压 

1
tar -zxvf nginx-1.8.0.tar.gz

进入解压后目录

依次执行命令:

1
2
3
4
5
./configure
 
make
 
mkae install

 此时nginx安装完毕,安装目录是/usr/local/nginx,nginx默认占用80端口

其中,sbin目录为nginx执行命令,conf目录下的nginx.conf为默认加载的配置文件

启动nginx:

1
./sbin/nginx

关闭nginx:

1
./sbin/nginx -s stop

 启动nginx后访问192.168.50.133:80便可访问nginx:显示nginx欢迎页

 

 至此,nginx安装完毕。

 

 

3.反向代理与负载均衡配置

现有两台服务器,一台为192.168.50.137,一台为192.168.50.139,服务器上各有一台tomcat,端口均为8080,在192.168.50.133上有nginx,通过配置nginx,当访问192.168.50.133:80时,便可访问192.168.50.137:8080,192.168.50.139:8080中随机一台,此时192.168.50.133:80被nginx监听,当有请求时,代理到192.168.50.137:8080,192.168.50.139:8080随机一台便可,即为nginx反向代理功能,同时此时能够经过nginx将请求进行转发,保证了一个入口,将全部请求转发到两台服务器上也减轻了任何一台的负载压力,当有大量请求时,能够搭建大量服务器,在入口代理服务器上使用nginx进行转发,便是负载均衡功能。

 

 配置便是配置nginx安装目录中conf目录下的nginx.conf文件便可:具体配置以下,重点是红色部分

#Nginx所用用户和组
#user  niumd niumd;

#工做的子进程数量(一般等于CPU数量或者2倍于CPU)
worker_processes  2;

#错误日志存放路径
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
error_log  logs/error.log  info;

#指定pid存放文件
pid        logs/nginx.pid;

events {
    #使用网络IO模型linux建议epoll,FreeBSD建议采用kqueue
    #use epoll;
    
    #容许最大链接数
    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  off;
    access_log  logs/access.log;

    client_header_timeout  3m;
    client_body_timeout    3m;
    send_timeout           3m;
 
    client_header_buffer_size    1k;
    large_client_header_buffers  4 4k;

    sendfile        on;
    tcp_nopush      on;
    tcp_nodelay     on;

    #fastcgi_intercept_errors on; 
   
    error_page 404  /404.html;

    #keepalive_timeout  75 20;

    gzip                 on;
    gzip_min_length      1000;
    gzip_types           text/plain text/css application/x-javascript;

    #配置被代理的服务器
  upstream blank-cc { #ip_hash; server 192.168.50.137:8080; server 192.168.50.139:8080; } 
    server {
            #nginx监听80端口,请求该端口时转发到真实目标
            listen 80;
            #配置访问域名
            server_name localhost;                 
        
            location / {
                #这里配置代理是指上面定义的两个被代理目标,blank-cc名字必须一致
                proxy_pass http://blank-cc;
                
                #proxy_redirect          off;
                #若是是非80端口,配置为Host $host:端口号,目的是将代理服务器收到的用户的信息传到真实服务器上
                proxy_set_header Host $host;
                proxy_set_header        X-Real-IP $remote_addr;
                proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
                client_max_body_size    10m;
                client_body_buffer_size 128k;
                proxy_connect_timeout   300;
                proxy_send_timeout      300;
                proxy_read_timeout      300;
                proxy_buffer_size       4k;
                proxy_buffers           4 32k;
                proxy_busy_buffers_size 64k;
                proxy_temp_file_write_size 64k;
                add_header Access-Control-Allow-Origin *;
            }
            
            #此处定义500 502 503 504的错误页面
            error_page   500 502 503 504  /50x.html;
            #错误页面位置
            location = /50x.html {
            #root表示路径 html为nginx安装目录中的html文件夹
            #位于/usr/local/nginx/html/下
               root   html;
            }        
    }
}

 

启动两台tomcat,从新启动nginx:

访问192.168.50.133:80将会随机访问192.168.50.137:8080和192.168.50.139:8080其中一台。(问题:每次刷新nginx服务器地址sessionid会变,session不能共享。)

 

 

nginx轮询策略:

nginx负载均衡到多台服务器上时,默认采用轮询策略:

常见策略:

一、轮询

每一个请求按时间顺序逐一分配到不一样的后端服务器,若是后端服务器down掉,能自动剔除。

二、weight
指定轮询概率,weight和访问比率成正比,用于后端服务器性能不均的状况,数字越大命中率越高。
例如:轮询概率是2:1
upstream bakend {
server 192.168.0.14 weight=2;
server 192.168.0.15 weight=1;
}

二、ip_hash
每一个请求按访问ip的hash结果分配,这样每一个访客固定访问一个后端服务器,能够解决session的问题。
例如:
upstream bakend {
ip_hash;
server 192.168.0.14:88;
server 192.168.0.15:80;
}

其余策略能够自行查询学习,nginx还有不少其余可配置项,静态资源缓存,重定向等,想深刻的童鞋请自行学习

nginx配置详解:http://blog.csdn.net/tjcyjd/article/details/50695922

 

实际问题:虽然解决了,可是不是很理解,记录一下

其中192.168.50.133:80是有外网映射的,外网55.125.55.55:5555映射到192.168.50.133:80上,此时使用55.125.55.55:5555访问,会映射到192.168.50.133:80上,而后会被转发到192.168.50.137:8080或192.168.50.139:8080,可是此时却出现图片,js,css等静态文件没法访问的状况,经过两种方法解决。

<1>.映射非80端口

让55.125.55.55:5555映射192.168.50.133的非80端口,例如55.125.55.55:5555映射192.168.50.133:5555,而后再在nginx配置文件中配置以下,注意红色加大部分:这地方不理解

........ upstream blank { #ip_hash; server 192.168.50.137:8080; server 192.168.50.139:8080; } server { #nginx监听5555端口,请求该端口时转发到真实目标 listen 5555; #配置访问域名 server_name 192.168.11.133; location / { #这里配置代理是指上面定义的两个被代理目标,blank名字必须一致 proxy_pass http://blank;
 #proxy_redirect off; #非80端口使用,目的是将代理服务器收到的用户的信息传到真实服务器上 proxy_set_header Host $host:$server_port; proxy_set_header X-Real-IP $remote_addr;    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; client_max_body_size 10m; client_body_buffer_size 128k; proxy_connect_timeout 300; proxy_send_timeout 300; proxy_read_timeout 300; proxy_buffer_size 4k; proxy_buffers 4 32k; proxy_busy_buffers_size 64k; proxy_temp_file_write_size 64k; add_header Access-Control-Allow-Origin *;
  }........

此时访问55.125.55.55:5555,映射到192.168.50.133:5555上,而后转发到192.168.50.137:8080或192.168.50.139:8080上,此时静态文件均能访问。

 <2>.使用域名在外网服务器上使用nginx进行转发

将55.125.55.55绑定域名为test.baidubaidu.com,此时在55.125.55.55服务器上使用nginx,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
........location / {
         #加入判断,若是域名为test.baidubaidu.com,转发到 192.168 . 50.133 : 80 ,而后再进行转发,注意,此处未进行测试,貌似是这么写的,$host为nginx变量,能够获取域名    
         if ($host =  "test.baidubaidu.com"  ){
           proxy_pass http: //192.168.50.133:80;
         }
                 
         #proxy_redirect          off;
         #非 80 端口使用,目的是将代理服务器收到的用户的信息传到真实服务器上,我也不是很理解
         proxy_set_header        Host $host:$server_port;
         proxy_set_header        X-Real-IP $remote_addr;
         proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
         client_max_body_size    10m;
         client_body_buffer_size 128k;
         proxy_connect_timeout    300 ;
         proxy_send_timeout       300 ;
         proxy_read_timeout       300 ;
         proxy_buffer_size       4k;
         proxy_buffers            4  32k;
         proxy_busy_buffers_size 64k;
         proxy_temp_file_write_size 64k;
         add_header Access-Control-Allow-Origin *;
             }........

 以上即nginx反向代理与负载均衡介绍,通过这次学习,发现nginx确实是博大精深,一个配置文件搞得我不要不要的。。。

 

2、session共享问题:

因为nginx是随机分配请求,假设一个用户登陆时访问网站登陆时被分配到192.168.50.137:8080上,而后进行了登陆操做,此时该服务器上就会有该用户登陆的session信息,而后登录后重定向到网站首页或我的中心时,此时若是被分配到192.168.50.139:8080上,那么这台服务器上没有该用户session信息,因而又会变成未登陆状态,因此因为nginx的负载均衡会致使session共享的问题。

解决方法:

1.nginx提供了ip_hash策略,能够保持用户ip进行hash值计算固定分配到某台服务器上,而后只要是该ip则会保持分配到该服务器上,保证用户访问的是同一台服务器,那么session问题就不存在了。这也是解决session共享的一种方式,也称为黏性session。可是假设一台tomcat服务器挂了的话,那么session也会丢失。因此比较好的方案是抽取session。

2.session存在memcache或者redis中,以这种方式来同步session,把session抽取出来,放到内存级数据库里面,解决了session共享问题,同时读取速度也是很是之快。

 

本例中:

 

 

Redis解决session共享:

在redis服务器192.168.50.140上搭建redis,redis默认端口为6379

Redis搭建:

redis依赖gcc,先安装:

1
yum install -y gcc-c++

下载redis,我使用的是redis-3.2.1.tar.gz,上传至linux /usr/local/redis-src/中,解压

进入解压后目录redis-3.2.1,执行make命令进行编译

安装到目录/usr/local/redis

执行:

1
make PREFIX=/usr/local/redis install

安装完成以后将redis配置文件拷贝到安装目录下,redis.conf是redis的配置文件,redis.conf在redis源码目录,port默认6379。

执行命令:

1
cp /usr/local/redis-src/redis- 3.2 . 1 /redis.conf /usr/local/redis/

在redis安装目录启动和关闭redis:

启动:

1
./bin/redis-server ./redis.conf

这种启动方式叫作前端启动,必须保持在当前窗口,若是ctrl + c 退出,那么redis也就退出了,不建议使用

那么后端启动:

首先修改redis.conf中daemonize的值,打开能够看到默认是no,修改成daemonize yes,启动便可。也能够在该配置文件中修改redis默认端口6379为其余值。

关闭redis:

1
./bin/redis-cli shutdown

 

 至此,redis服务器搭建完成。

 

 tomcat与redis集成实现session共享:

环境为tomcat7 + jdk1.6的话:

在全部须要共享session的服务器的tomcat中目录下:

lib目录中添加如下三个jar包,注意版本最好一致,否则极容易出现错误,下边的测试是可用的:

conf目录中content.xml中加入:配置redis服务

1
2
3
4
5
6
<Valve className= "com.radiadesign.catalina.session.RedisSessionHandlerValve" /> 
<Manager className= "com.radiadesign.catalina.session.RedisSessionManager"
host= "192.168.50.140"
port= "6379"
database= "0"  
maxInactiveInterval= "60"  />

 

环境为tomcat7 + jdk1.7或1.8的话:

在全部须要共享session的服务器的tomcat中目录下:

lib目录中添加如下三个jar包,测试经过:

conf目录中content.xml中加入:配置redis服务

1
2
3
4
5
6
<Valve className= "com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve"  />       
<Manager className= "com.orangefunction.tomcat.redissessions.RedisSessionManager"
host= "192.168.50.140"  
port= "6379"  
database= "0"              
maxInactiveInterval= "60" />

 

根据我这测试,是jkd1.8+tomcat7,在137和139两台tomcat中加入jar包且进行如上配置:

上传jar包

 修改content.xml

启动redis服务,从新启动全部tomcat,启动nginx,刷新nginx页面,两台tomcat页面能够看到sessionid值不变,关闭某台tomcat,nginx中sessionid不变,说明session是共享的。

问题:

有可能此时访问会报错,redis没法访问,这是因为redis的安全机制,默认只有127.0.0.1才能访问,在redis.conf中能够找到bind 127.0.0.1,你能够将此ip改成访问者ip,

若是有多个访问者,也能够把bind 127.0.0.1注释掉,而后在配置文件中找到protected-mode,修改protected-mode yes改成protected-mode no 关闭redis保护模式便可

详细能够参考这:http://www.cnblogs.com/liusxg/p/5712493.html

 

通过大牛指点:添加两个注意点:

1.按照如上配置,使用redis数据库,放入session中的对象必需要实现java.io.Serializable接口,使用memcache的能够不用实现Serializable接口

缘由是:由于tomcat里使用的将session放置redis使用的工具类,是使用的jdk序列化模式存储的,这一点也是很容易理解的,session.setAttribute(String key, Object value),存储Object类型

object放入redis中又要能取出来,只能是序列化进行存储了,而后取出的时候进行反序列化。

因此咱们在session中存储的任何对象,都必须实现序列化接口。

2.按照如上配置,使用redis作session存储空间时,web应用的session-time的时间单位会变成[秒],而不是本来的[分]

缘由是:由于tomcat里使用的将session放置redis使用的工具类,在存储时为对tomcat容器时间作转换,

在redis中设置过时时间是使用秒做为单位的,有个命令叫expire能够设置redis键值过时时间,因此在context.xml配置文件中咱们须要制定session过时时间(默认是60秒,配成1800即30分钟),这一点很重要。

 

请注意!!!!

context.xml配置说明:

1
2
3
4
5
6
7
8
9
10
<Valve className= "com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve"  />      
<Manager className= "com.orangefunction.tomcat.redissessions.RedisSessionManager"
//这里是redis服务器地址
host= "192.168.50.140"
//这里是redis端口,redis默认端口是6379
port= "6379"
//这里是redis数据库中的标识,标识第0个,默认使用0便可
database= "0"            
//须要注意的是这里因为redis过时时间默认设置为60,单位是秒,session过时时间为30分钟,因此须要设置为1800对应30分钟
maxInactiveInterval= "1800" />

 

3、keepalived高可用:

架构图:

上图画的不对称好难看,将就下吧

根据上边一路走来,已是搭好了从nginx主到服务器的这条线的,那么同理,使用nginx备机192.168.50.135上再搭建nginx,也是代理192.168.137和139两台服务器。搞了一次以后也就简单了

在192.168.50.135上安装nginx,配置nginx配置便可,再也不赘述,nginx备机配置以下:

配置和上边的是同样的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
........upstream blank {
         #ip_hash;
         server  192.168 . 50.137 : 8080 ;
         server  192.168 . 50.139 : 8080 ;
}
     
     server {
         listen        80 ;
         server_name  localhost;
 
         #charset koi8-r;
 
         #access_log  logs/host.access.log  main;
 
         location / {
             proxy_pass http: //blank;
             root   html;
             index  index.html index.htm;
         }........

 

那么如今就是至关于有两套nginx了,代理的服务器是同样的,为何要搞两套?

假设只有一台nginx的话,这个nginx服务器挂了。那怎么办?

因此须要一台备份nginx。

正常状况下,主nginx做为反向代理服务器便可,假设nginx服务器挂了的话,可以当即切换到备份机上,保证用户能够访问,而后运维人员把主nginx服务器故障修好以后,又可以自动切换到主nginx提供服务。经过keepalived来监测两台服务器,正常状况时,将nginx主服务器ip(192.168.50.133)绑定到keepalived定义的一个虚拟ip(我设置为192.168.50.88)上,经过这个虚拟IP能够访问nginx,而后备机(192.168.50.135)啥事不干,就是每隔一小段时间(设置为1秒)keepalived会告诉备机,你不用管,我还活着呢,若是忽然主机死了,那么就会超过一秒备机没有收到主机或者的消息,那么备机立刻接管主机,keeplived将虚拟ip绑定到备机身上,网站继续提供服务。

忽然主机又复活了(运维人员排除故障了),那么备机又将收到主机的活着的消息,因而将管理权交回给主机,虚拟ip又绑到主机上,大概就是这么个过程,我的理解。

 

 先在两台nginx服务器(主备)上都装上keepalived:

 下载:这里使用rpm安装,是区分32,64位的,不要搞错了哦

keepalived-1.2.7-3.el6.x86_64.rpm

openssl-1.0.1e-30.el6_6.4.x86_64.rpm

要求必须是openssl-1.0.1e或以上才行、若是版本已经符合(由于安装nginx时已经安装openssl,使用yum安装应该是符合的)、不用再安装openssl,使用 rpm -q openssl 查看当前openssl版本,我这已是1.0.1e 48的,因此就不安装了

将两个rpm安装包上传到两台nginx服务器,进入上传到的目录,运行如下命令安装:--nodeps是忽略依赖包,固然最好是把依赖包装上,去掉--nodeps能够看到错误,须要哪些依赖包

若是须要安装openssl

1
rpm –Uvh --nodeps ./openssl- 1.0 .1e- 30 .el6_6. 4 .x86_64.rpm

 安装keepalived:

1
  rpm -Uvh --nodeps ./keepalived- 1.2 . 7 - 3 .el6.x86_64.rpm

安装完毕后再/etc/keepalived/目录下有个文件 keepalived.conf便是本台服务器keepalived的核心配置文件了:

重点:keepalived配置,配置文件上边部分按照下面的配置就好了,配置文件后面的内容能够不用管,尚未去研究其余部分

先配置主机192.168.50.133的keepalived,按下边进行配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
! Configuration File  for  keepalived
 
#这是全局配置
global_defs {
    #指定keepalived在发生切换时须要发送email到的对象,一行一个
    notification_email {
      acassen @firewall .loc
      failover @firewall .loc
      sysadmin @firewall .loc
    }
    #指定发件人
    notification_email_from Alexandre.Cassen @firewall .loc
    #指定smtp服务器地址
    #smtp_server  192.168 . 200.1
    #指定smtp链接超时时间
    #smtp_connect_timeout  30
    #运行keepalived机器的一个标识
    router_id LVS_DEVEL
}
 
#主备配置
vrrp_instance VI_1 {
     #标示状态为MASTER 备份机为BACKUP
     state MASTER
     #设置keepalived实例绑定的服务器网卡,通常为eth0,linux使用ifconfig命令可查看当前服务器网卡标识名
     interface  eth0
     #同一实例下(即同一组主备机下)virtual_router_id必须相同
     virtual_router_id  51
     #MASTER权重要高于BACKUP,MASTER为 100 则BACKUP最大为 99
     priority  100
     #MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位是秒,设置为 1
     advert_int  1
     #设置认证
     authentication {
         #主从服务器验证方式,PASS为明文密码验证
         auth_type PASS
         #密码
         auth_pass  1111
     }
     #设置虚拟IP,与咱们的主备机在同一网段下,最后一位随便给就是拉,能够设置多个,换行便可
     virtual_ipaddress {
         192.168 . 50.88
     }
}

 

备机192.168.50.135的keepalived配置:

备机配置注意的地方:须要修改state为BACKUP , priority比MASTER低,virtual_router_id和master的值一致

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
! Configuration File  for  keepalived
 
#这是全局配置
global_defs {
    #指定keepalived在发生切换时须要发送email到的对象,一行一个
    notification_email {
      acassen @firewall .loc
      failover @firewall .loc
      sysadmin @firewall .loc
    }
    #指定发件人
    notification_email_from Alexandre.Cassen @firewall .loc
    #指定smtp服务器地址
    #smtp_server  192.168 . 200.1
    #指定smtp链接超时时间
    #smtp_connect_timeout  30
    #运行keepalived机器的一个标识
    router_id LVS_DEVEL
}
 
#主备配置
vrrp_instance VI_1 {
     #备机为BACKUP
     state BACKUP
     #备机网卡标识,通常都是eth0,先查询一下
     interface  eth0
     #virtual_router_id必须与主机相同
     virtual_router_id  51
     #权重,备机必须比主机小
     priority  99
     #MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位是秒,设置为 1
     advert_int  1
     #认证,与主机一致
     authentication {
         auth_type PASS
         auth_pass  1111
     }
     #虚拟IP,绑定的虚拟ip与主机一致
     virtual_ipaddress {
         192.168 . 50.135
     }
}

 

酱紫,keepalived就配置完成了。

keeplived启动关闭命令:

1
2
service keepalived start
service keepalived stop

 

启动两台nginx,启动主机keepalived,启动备机keepalived服务。

这时,nginx主机在提供服务,备机是闲着的,虚拟ip是192.168.50.88,在主机和备机上使用命令

1
ip addr

 能够发现:

主机:能够看到,192.168.50.133 带有虚拟ip192.168.50.88,在浏览器中输入192.168.50.88,便可访问到主nginx192.168.50.133.而后转发到tomcat服务器上

 

浏览器访问虚拟ip:192.168.50.88,效果以下

 

 

 

 备机:ip addr命令执行:能够看到,备机nginx没有绑定虚拟ip

 

 以上是初始状态下的状况,也是正常服务的状况。

 

如今测试高可用,假设主机nginx服务器挂了,模拟为关闭nginx主机或者将keepalived服务中止,那么主机上keepalived死了就没办法告诉备机本身活着,而备机超过1秒没有接收到主机给本身的消息,立刻接管虚拟ip,同时在配置文件中配置切换主备机时发送邮件,此时开发团队收到邮件即知道主机挂了,立刻去排除主机的故障。

将主机上的keepalived服务中止,service keepalived stop ,而后查看虚拟ip绑定状况,

主机挂了:能够看到虚拟ip就没有绑在主机上

备机状况:虚拟ip已经绑定到备机,此时主机虽然挂了,可是切换到备机上了(发现故障和切换的时间差最大也就是1秒),虚拟ip也绑到备机上了,访问虚拟ip,就会请求备机nginx而后转发到web服务器实现高可用。

 

 

 运维人员收到邮件后就去排除主机故障了,搞定以后(模拟为keepalived服务启动),这时主机告诉备机,我又活了,因而备机将管理权又交给主机(切换为主机nginx提供服务):

主机keepalived服务启动后,即吧主机维护好以后:能够看到,虚拟ip又自动绑到了主机上

 

 

 备机状况,主机活了以后,备机转交管理权,虚拟ip切换到主机上,备机不绑定虚拟ip,貌似启动keepalived服务以后并不能立刻切回,应该是起服务须要点时间吧,可是不影响,这段时间仍是备机绑定虚拟IP的

 

 这就是keepalived高可用的模拟。

 

注意问题:

主机挂了以后,主机nginx恢复时,必定要将nginx也启动,不然即便虚拟ip切换到了主机上,可是主机nginx没起那也是无法转发的。因此要把nginx启动要加在开机启动中。

 

4、Nginx服务开机自启动:

 

在linux系统的/etc/init.d/目录下建立nginx文件,使用以下命令:(vim命令不会的本身去学吧哈哈)

 

1
vi /etc/init.d/nginx

 

 

 

将以下内容搞到该文件中:注意红色部分修改为你的路径便可,nginxd值是启动nginx的nginx路径,nginx_config值是nginx配置文件nginx.conf路径,nginx_pid值是nginx.pid所在路径,若是按照我方法安装的话,是在nginx安装目录的logs里边的

#!/bin/bash # nginx Startup script for the Nginx HTTP Server # it is v.0.0.2 version. # chkconfig: - 85 15 # description: Nginx is a high-performance web and proxy server. # It has a lot of features, but it's not for everyone. # processname: nginx # pidfile: /usr/local/nginx/logs/nginx.pid # config: /usr/local/nginx/conf/nginx.conf
nginxd=/usr/local/nginx/sbin/nginx nginx_config=/usr/local/nginx/conf/nginx.conf nginx_pid=/usr/local/nginx/logs/nginx.pid RETVAL=0 prog="nginx"
# Source function library.
. /etc/rc.d/init.d/functions # Source networking configuration.
. /etc/sysconfig/network # Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 0 [ -x $nginxd ] || exit 0 # Start nginx daemons functions.
start() { if [ -e $nginx_pid ];then echo "nginx already running...." exit 1 fi echo -n $"Starting $prog: " daemon $nginxd -c ${nginx_config} RETVAL=$? echo [ $RETVAL = 0 ] && touch /var/lock/subsys/nginx return $RETVAL } # Stop nginx daemons functions.
stop() { echo -n $"Stopping $prog: " killproc $nginxd RETVAL=$? echo [ $RETVAL = 0 ] && rm -f /var/lock/subsys/nginx /var/run/nginx.pid } # reload nginx service functions.
reload() { echo -n $"Reloading $prog: "
    #kill -HUP `cat ${nginx_pid}`
    killproc $nginxd -HUP RETVAL=$? echo } # See how we were called.
case "$1" in start) start ;; stop) stop ;; reload) reload ;; restart) stop start ;; status) status $prog RETVAL=$? ;; *) echo $"Usage: $prog {start|stop|restart|reload|status|help}" exit 1 esac exit $RETVAL

 

 

而后设置该文件的访问权限:执行如下命令,意为全部用户可访问

 

1
chmod a+x /etc/init.d/nginx

 

 最后将ngix加入到rc.local文件中,这样开机的时候nginx就默认启动了

 

1
vi /etc/rc.local

 

添加

 

1
/etc/init.d/nginx start

 

 

 

保存并退出,下次重启就会生效,nginx的开机自启动。测试无误的。

 

 

4、解决nginx进程和keepalived不一样时存在问题:

 

keepalived是经过检测keepalived进程是否存在判断服务器是否宕机,若是keepalived进程在,可是nginx进程不在了,那么keepalived是不会作主备切换。由于是nginx挂了,而后没法作代理,keepalived还在不会切换到备机。

因此一直检测nginx是否还在,若是不在,那么让keepalived也中止,同生共死。

注:只须要在主机上搞就好了,备机不必检测nginx,由于基本是主机在服务。

解决:写个脚原本监控nginx进程是否存在,若是nginx不存在就将keepalived进程杀掉。

注:keepalived不须要开机启动,假如开机自启的话,若是keepalived比nginx 更快启动的话,脚本检测会把keepalived停掉的,因此不必,只须要nginx开机启动,启动主机后自行手动的把keepalived服务启动便可。

 

在主nginx上编写nginx进程检测脚本(check_nginx_dead.sh),在keepalived配置文件目录下建立脚本:

 

1
vi /etc/keepalived/check_nginx_dead.sh

 

把下边这些内容搞到脚本文件中,内容以下:

 

1
2
3
4
5
6
#!/bin/bash
# 若是进程中没有nginx则将keepalived进程kill掉
A=`ps -C nginx --no-header |wc -l`      ## 查看是否有 nginx进程 把值赋给变量A
if  [ $A -eq  0  ];then                    ## 若是没有进程值得为 零
        service keepalived stop          ## 则结束 keepalived 进程
fi

 

给访问权限:否则不行哦,这里卡了我半小时

1
chmod a+x /etc/keepalived/check_nginx_dead.sh

 

 

先测试一下脚本:

把nginx停了,此时keepalived还在运行,因此不会切换,虚拟ip没法访问到web服务器

而后执行脚本:

主机脚本检测nginx不在了,把keepalived停掉,从输出能够看到确实中止了,主机虚拟没有绑定虚拟ip

备机:成功绑定虚拟ip

 

 

因此,只须要让该脚本一直执行,即一直检测nginx进程是否在,若是没得了,那么直接中止主机keepalived,切换备机,保证可以访问web服务器。

按以下修改keepalived配置文件keepalived.conf,添加脚本定义检测:

只须要在正确的位置添加红色部分便可:那么脚本则是两秒执行一次,一旦发现主机nginx不在了,keepalived中止,切换备机

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
! Configuration File  for  keepalived
 
#这是全局配置
global_defs {
    #指定keepalived在发生切换时须要发送email到的对象,一行一个
    notification_email {
      acassen @firewall .loc
      failover @firewall .loc
      sysadmin @firewall .loc
    }
    #指定发件人
    notification_email_from Alexandre.Cassen @firewall .loc
    #指定smtp服务器地址
    #smtp_server  192.168 . 200.1
    #指定smtp链接超时时间
    #smtp_connect_timeout  30
    #运行keepalived机器的一个标识
    router_id LVS_DEVEL
}
 
vrrp_script check_nginx_dead {
     ##监控脚本路径
     script  "/etc/keepalived/check_nginx_dead.sh"
     ##时间间隔, 2
     interval  2
     ##权重
     weight  2                                            
}
 
#主备配置
vrrp_instance VI_1 {
     #标示状态为MASTER 备份机为BACKUP
     state MASTER
     #设置keepalived实例绑定的服务器网卡,通常为eth0,linux使用ifconfig命令可查看当前服务器网卡标识名
     interface  eth0
     #同一实例下(即同一组主备机下)virtual_router_id必须相同
     virtual_router_id  51
     #MASTER权重要高于BACKUP,MASTER为 100 则BACKUP最大为 99
     priority  100
     #MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位是秒,设置为 1
     advert_int  1
     #设置认证
     authentication {
     #主从服务器验证方式,PASS为明文密码验证
         auth_type PASS
     #密码
         auth_pass  1111
     }
     
     track_script {
     #监控脚本
         check_nginx_dead     
     }
     
     #设置虚拟IP,与咱们的主备机在同一网段下,最后一位随便给就是拉,能够设置多个,换行便可
     virtual_ipaddress {
         192.168 . 50.88
     }
}

 

保存后,从新启动主机keepalived服务便可。

 

测试:

回到负载均衡高可用的初始状态,保证主、备上的keepalived、nginx所有启动。

中止主nginx服务:

主机查看keepalived进程,发现没有,说明已经中止了,虚拟ip也没有绑在主机上

 

 备机:绑定虚拟ip,切换成功。

 

 

 测试经过,若是主机nginx挂了以后,keepalived也会随着挂掉,而后切换备机。

 

转载自:http://blog.coocap.com/?p=92

相关文章
相关标签/搜索