nginx+keepalived+tomcat实现的高可用

环境准备

 172.16.119.100:nginx + keepalived   master

 172.16.119.101:nginx + keepalived   backup

 172.16.119.102:tomcat

 172.16.119.103:tomcat

 虚拟ip(VIP):172.16.119.200,对外提供服务的ip,也可称作浮动ip

 各个组件之间的关系图如下:

tomcat做应用服务器

将172.16.119.102、172.16.119.103上的tomcat启动起来

上传apache-tomcat-8.5.23.tar.gz到172.16.119.102

解压:tar -zxf apache-tomcat-8.5.23.tar.gz

  

  情况webapp文件夹:rm -rf *

  上传ROOT项目

  访问:http://172.16.119.102:8080/

  

  

  修改index.jsp页面内容为当前服务器IP

  

  JSP不需要编译直接刷新页面看效果

  

  现在直接复制tomcat文件夹到172.16.119.103服务器

   执行:scp -r apache-tomcat-8.5.23/ [email protected]:/usr/local/

  修改index.jsp页面内容启动

  启动:./startup.sh  

  

  

172.16.119.102安装nginx服务

准备nginx-1.8.1.tar.gz,并解压到当前目录,命令tar -zxf nginx-1.8.1.tar.gz

nginx依赖包安装

  nginx安装有环境要求,nginx依赖下面3个包

      a. gzip 模块需要 zlib 库 ( 下载: http://www.zlib.net/ )

      b. rewrite 模块需要 pcre 库 ( 下载: http://www.pcre.org/ )

      c. ssl 功能需要 openssl 库 ( 下载: http://www.openssl.org/ )

           这里我就不用源码包方式来安装了,直接一键式安装:yum -y install zlib zlib-devel openssl openssl--devel pcre pcre-devel

nginx安装

    cd nginx-1.8.1 

    ./configure --prefix=/home/hadoop/apps/nginx 

    make

    make install

    安装完成之后,检查nginx的配置文件是否正确

    cd /home/hadoop/apps/nginx/sbin/

    ./nginx -t

说明配置文件正确,那么nginx安装成功!

nginx启动

cd /home/hadoop/apps/nginx/sbin/

./nginx

注意如果访问是403解决:修改cd /home/hadoop/apps/nginx/conf   vi nginx.conf

nginx负载均衡

修改:vim /home/hadoop/apps/nginx/conf/nginx.conf

172.16.119.100配置

user nobody;

worker_processes 2;

events{
    worker_connections 1024;
}

http{
    #设置默认类型为二进制流
    default_type    application/octet-stream;

    server_names_hash_bucket_size   128;
    #指定来自client请求头的headerbuffer大小。设置为32KB
    client_header_buffer_size   32k;
    #指定client请求中较大的消息头的缓存最大数量和大小,这里是4个32KB
    large_client_header_buffers 4 32k;
    #上传文件大小
    client_max_body_size 356m;
    #nginx的HttpLog模块指定,指定nginx日志的输出格式,输出格式为access
    log_format access ‘$remote_addr - $remote_user [$time_local] "$request" ‘
    ‘$status $body_bytes_sent "$http_referer" ‘
    ‘"$http_user_agent" "$http_x_forwarded_for"‘;
    #access日志存在未知
    access_log  /home/hadoop/apps/nginx/logs/access.log    access;
    #开启高效模式文件传输模式,将tcp_nopush和tcp_nodelay两个指另设置为on,用于防止网络堵塞。

    sendfile    on;
    tcp_nopush  on;
    tcp_nodelay on;
    #设置client连接保持活动的超时时间
    keepalive_timeout   65;
    server_tokens   off;
    #client请求主体读取缓存
    client_body_buffer_size 512k;
    proxy_connect_timeout   5;
    proxy_send_timeout      60;
    proxy_read_timeout      5;
    proxy_buffer_size       16k;
    proxy_buffers           4 64k;
    proxy_busy_buffers_size 128k;
    proxy_temp_file_write_size 128k;

    #fastcgi_connect_timeout 300;
    #fastcgi_send_timeout   300;
    #fastcgi_read_timeout   300;
    #fastcgi_buffer_timeout 300;
    #fastcgi_buffers 4 64k;
    #fastcgi_busy_buffers_size 128k;
    #fastcgi_temp_file_write_size 128k;

    #开启gzip
    gzip    on;
    #同意压缩的最小字节数
    gzip_min_length 1k;
    #4个单位为16k的内存作为压缩结果流缓存
    gzip_buffers 4 16k;
    #设置识别HTTP协议版本号,默认是1.1
    gzip_http_version 1.1;
    #gzip压缩比,可在1~9中设置,1压缩比最小,速度最快。9压缩比最大。速度最慢,消耗CPU
    gzip_comp_level 2;
    #压缩的类型
    gzip_types text/plain application/x-javascript text/css application/xml;
    #让前端的缓存server混村经过的gzip压缩的页面
    gzip_vary   on;

    upstream mycluster{
        server 172.16.119.102:8080 weight=1;
        server 172.16.119.103:8080 weight=1;
    }

    server{
        listen 8089;
        server_name 172.16.119.100;
        charset    utf-8; #设置编码为utf-8
        #root   html;

        #location / {
        #    root   html;
        #    index  index.html index.htm;
        #}

        #location ~ .*\.(jsp|do|action)$
        location / {
            proxy_next_upstream http_502 http_504 error timeout invalid_header;
            proxy_pass http://mycluster;
            # 真实的clientIP
            proxy_set_header   X-Real-IP        $remote_addr;
            # 请求头中Host信息
            proxy_set_header   Host             $host;
            # 代理路由信息。此处取IP有安全隐患
            proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
            # 真实的用户訪问协议
            proxy_set_header   X-Forwarded-Proto $scheme;
        }
        #静态文件交给nginx处理
        location ~ .*\.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$
        {
            root /usr/local/apache-tomcat-8.5.23/webapps;
            expires 30d;
        }
        #静态文件交给nginx处理
        location ~ .*\.(js|css)?
        {
            root /usr/local/apache-tomcat-8.5.23/webapps;
            expires 1h;
        }
        error_page   500 502 503 504  /50x.html;

        location = /50x.html {
            root   html;
        }

    }

172.16.119.101配置

user nobody;

worker_processes 2;

events{
    worker_connections 1024;
}

http{
    #设置默认类型为二进制流
    default_type    application/octet-stream;

    server_names_hash_bucket_size   128;
    #指定来自client请求头的headerbuffer大小。设置为32KB
    client_header_buffer_size   32k;
    #指定client请求中较大的消息头的缓存最大数量和大小,这里是4个32KB
    large_client_header_buffers 4 32k;
    #上传文件大小
    client_max_body_size 356m;
    #nginx的HttpLog模块指定,指定nginx日志的输出格式,输出格式为access
    log_format access ‘$remote_addr - $remote_user [$time_local] "$request" ‘
    ‘$status $body_bytes_sent "$http_referer" ‘
    ‘"$http_user_agent" "$http_x_forwarded_for"‘;
    #access日志存在未知
    access_log  /home/hadoop/apps/nginx/logs/access.log    access;
    #开启高效模式文件传输模式,将tcp_nopush和tcp_nodelay两个指另设置为on,用于防止网络堵塞。

    sendfile    on;
    tcp_nopush  on;
    tcp_nodelay on;
    #设置client连接保持活动的超时时间
    keepalive_timeout   65;
    server_tokens   off;
    #client请求主体读取缓存
    client_body_buffer_size 512k;
    proxy_connect_timeout   5;
    proxy_send_timeout      60;
    proxy_read_timeout      5;
    proxy_buffer_size       16k;
    proxy_buffers           4 64k;
    proxy_busy_buffers_size 128k;
    proxy_temp_file_write_size 128k;

    #fastcgi_connect_timeout 300;
    #fastcgi_send_timeout   300;
    #fastcgi_read_timeout   300;
    #fastcgi_buffer_timeout 300;
    #fastcgi_buffers 4 64k;
    #fastcgi_busy_buffers_size 128k;
    #fastcgi_temp_file_write_size 128k;

    #开启gzip
    gzip    on;
    #同意压缩的最小字节数
    gzip_min_length 1k;
    #4个单位为16k的内存作为压缩结果流缓存
    gzip_buffers 4 16k;
    #设置识别HTTP协议版本号,默认是1.1
    gzip_http_version 1.1;
    #gzip压缩比,可在1~9中设置,1压缩比最小,速度最快。9压缩比最大。速度最慢,消耗CPU
    gzip_comp_level 2;
    #压缩的类型
    gzip_types text/plain application/x-javascript text/css application/xml;
    #让前端的缓存server混村经过的gzip压缩的页面
    gzip_vary   on;

    upstream mycluster{
        server 172.16.119.102:8080 weight=1;
        server 172.16.119.103:8080 weight=1;
    }

    server{
        listen 8089;
        server_name 172.16.119.101;
        charset    utf-8; #设置编码为utf-8
        #root   html;

        #location / {
        #    root   html;
        #    index  index.html index.htm;
        #}

        #location ~ .*\.(jsp|do|action)$
        location / {
            proxy_next_upstream http_502 http_504 error timeout invalid_header;
            proxy_pass http://mycluster;
            # 真实的clientIP
            proxy_set_header   X-Real-IP        $remote_addr;
            # 请求头中Host信息
            proxy_set_header   Host             $host;
            # 代理路由信息。此处取IP有安全隐患
            proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
            # 真实的用户訪问协议
            proxy_set_header   X-Forwarded-Proto $scheme;
        }
        #静态文件交给nginx处理
        location ~ .*\.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$
        {
            root /usr/local/apache-tomcat-8.5.23/webapps;
            expires 30d;
        }
        #静态文件交给nginx处理
        location ~ .*\.(js|css)?
        {
            root /usr/local/apache-tomcat-8.5.23/webapps;
            expires 1h;
        }
        error_page   500 502 503 504  /50x.html;

        location = /50x.html {
            root   html;
        }

    }

  

 启动:访问http://172.16.119.100:8089/测试

安装Keepalived

下载keepalived-1.4.5.tar.gz

  

在/home/hadoop/apps/keepalived-1.4.5目录下,添加check_nginx.sh(检查nginx存活的shell脚本)和keepalived.conf(keepalived配置文件)

check_nginx.sh

#!/bin/bash
#代码一定注意空格,逻辑就是:如果nginx进程不存在则启动nginx,如果nginx无法启动则kill掉keepalived所有进程
A=`ps -C nginx --no-header |wc -l`
if [ $A -eq 0 ];then
 /etc/init.d/nginx start
 sleep 3
 if [ `ps -C nginx --no-header |wc -l`-eq 0 ];then
  killall keepalived
 fi
fi

安装编译:./configure --prefix=/usr/app/keepalived && make && make install

安装好了之后,你就会看到如下的内容,那就恭喜你,安装成功了。

Keepalived configuration
------------------------
Keepalived version       : 1.4.2
Compiler                 : gcc
Preprocessor flags       :
Compiler flags           : -Wall -Wunused -Wstrict-prototypes -Wextra -g -O2 -fPIE -D_GNU_SOURCE
Linker flags             : -pie
Extra Lib                :  -lcrypto  -lssl
Use IPVS Framework       : Yes
IPVS use libnl           : No
IPVS syncd attributes    : No
IPVS 64 bit stats        : No
fwmark socket support    : Yes
Use VRRP Framework       : Yes
Use VRRP VMAC            : Yes
Use VRRP authentication  : Yes
With ip rules/routes     : Yes
SNMP vrrp support        : No
SNMP checker support     : No
SNMP RFCv2 support       : No
SNMP RFCv3 support       : No
DBUS support             : No
SHA1 support             : No
Use Debug flags          : No
smtp-alert debugging     : No
Use Json output          : No
Stacktrace support       : No
Memory alloc check       : No
libnl version            : None
Use IPv4 devconf         : No
Use libiptc              : No
Use libipset             : No
init type                : systemd
Build genhash            : Yes
Build documentation      : No

安装好了之后,在/home/hadoop/apps/keepalived/etc/keepalived目录下有一个keepalived.conf文件,现在你要做的事情就是

将它copy到/etc/keepalived文件夹下就可以了。

mkdir -p /etc/keepalived
cp /home/hadoop/apps/keepalived/etc/keepalived/keepalived.conf  /etc/keepalived

接下来我们改一下配置文件。

172.16.119.100

机器中的配置文件,修改如下:

vim /etc/keepalived/keepalived.conf

Master(172.16.119.100)中的keepalived.conf配置如下

vrrp_script chk_nginx {
 script "/home/hadoop/apps/keepalived-1.4.5/check_nginx.sh" //检测nginx进程的脚本
 interval 2
 weight -20
}  

global_defs {
 notification_email {
      //可以添加邮件提醒
 }
}
vrrp_instance VI_1 {
 state MASTER //主服务器
 interface et
 virtual_router_id 51
 mcast_src_ip 172.16.119.100
 priority 250
 advert_int 1  

 authentication {
        auth_type PASS
        auth_pass 123456
 }
 track_script {
        chk_nginx
 }
 virtual_ipaddress {
        172.16.119.200
 }
}  

关于keepalived配置的几点说明 
- state - 主服务器需配成MASTER,从服务器需配成BACKUP 
- interface - 这个是网卡名,可以通过ifconfig查询到
- mcast_src_ip - 配置各自的实际IP地址 
- priority - 主服务器的优先级必须比从服务器的高,这里主服务器配置成250,从服务器配置成240 
- virtual_ipaddress - 配置虚拟IP(172.16.119.200) 
- authentication - auth_pass主从服务器必须一致,keepalived靠这个来通信 
- virtual_router_id - 主从服务器必须保持一致

执行pkill keepalived来关闭keepalived

启动:命令

cd /home/hadoop/apps/keepalived/sbin
./keepalived -D

查询进程:

如果查不到进程查看启动日志:tail -f  /var/log/messages

查看虚拟IP:

 

部署172.16.119.101

scp -r /home/hadoop/apps/keepalived/ [email protected]:/home/hadoop/apps/

scp /etc/keepalived/keepalived.conf [email protected]:/etc/keepalived/

修改配置

Backup(172.16.119.101)中的keepalived.conf配置如下

vrrp_script chk_nginx {
 script "/home/hadoop/apps/keepalived-1.4.5/check_nginx.sh" //检测nginx进程的脚本
 interval 2
 weight -20
}  

global_defs {
 notification_email {
      //可以添加邮件提醒
 }
}
vrrp_instance VI_1 {
 state BACKUP //从服务器
 interface eth1
 virtual_router_id 51
 mcast_src_ip 172.16.119.101
 priority 240
 advert_int 1  

 authentication {
        auth_type PASS
        auth_pass 123456
 }
 track_script {
        chk_nginx
 }
 virtual_ipaddress {
        172.16.119.200
 }
}  

配置完启动

这个时候发现虚拟IP并没有绑定在101服务器上,现在关闭100服务器看虚拟IP会不会偏移到101服务器

现在再查看101服务器的虚拟IP

访问网站也是没有问题的

现在Master恢复正常后,Master继续提供服务,Backup停止服务,并继续等待Master出现故障

重新启动100会发现虚拟IP会重新被100抢占

Keepalived抢占模式和非抢占模式

keepalived的HA分为抢占模式和非抢占模式,抢占模式即MASTER从故障中恢复后,会将VIP从BACKUP节点中抢占过来。非抢占模式即MASTER恢复后不抢占BACKUP升级为MASTER后的VIP。 
前面的例子中,我们实际上配置的是抢占模式,下面我们再来看看非抢占模式

Master(100)中的keepalived.conf配置如下

vrrp_script chk_nginx {
 script "/home/hadoop/apps/keepalived-1.4.5/check_nginx.sh"//检测nginx进程的脚本
 interval 2
 weight -20
}  

global_defs {
 notification_email {
      //可以添加邮件提醒
 }
}
vrrp_instance VI_1 {
 state BACKUP //主服务器(非抢占模式需要配置成BACKUP)
 interface eth0
 virtual_router_id 51
 mcast_src_ip 172.16.119.100
 priority 250
 advert_int 1
 nopreempt //非抢占模式
 authentication {
        auth_type PASS
        auth_pass 123456
 }
 track_script {
        chk_nginx
 }
 virtual_ipaddress {
        172.16.119.200
 }
}  

Master(101)中的keepalived.conf配置如下

vrrp_script chk_nginx {
 script "/home/hadoop/apps/keepalived-1.4.5/check_nginx.sh"//检测nginx进程的脚本
 interval 2
 weight -20
}  

global_defs {
 notification_email {
      //可以添加邮件提醒
 }
}
vrrp_instance VI_1 {
 state BACKUP //主服务器(非抢占模式需要配置成BACKUP)
 interface eth1
 virtual_router_id 51
 mcast_src_ip 172.16.119.100
 priority 240
 advert_int 1
 nopreempt //非抢占模式
 authentication {
        auth_type PASS
        auth_pass 123456
 }
 track_script {
        chk_nginx
 }
 virtual_ipaddress {
        172.16.119.200
 }
}  

 

 

抢占模式配置说明 
和非抢占模式的配置相比,只改了两个地方: 
1> 在vrrp_instance块下两个节点各增加了nopreempt指令,表示不争抢vip 
2> 节点的state都为BACKUP 
两个keepalived节点都启动后,默认都是BACKUP状态,双方在发送组播信息后,会根据优先级来选举一个MASTER出来。由于两者都配置了nopreempt,所以MASTER从故障中恢复后,不会抢占vip。这样会避免VIP切换可能造成的服务延迟。

(非抢占模式)Step-1 Master,Backup都正常,只有Master对外提供服务

配置完成后,先启动Master(100)机器的keepalived和nginx,查看Master的IP信息,可以看到VIP已经被绑定到100机器上了,再启动Backup(101)机器的keepalived和nginx,查看Backup的IP信息,可以看到VIP没有被绑定到101机器上了 
浏览器多次刷新并访问 http://172.16.119.200:8089/
可以看到页面上IP交替显式102和103,并且显示NGINX-1,则表明是Master(100)在转发web请求

(非抢占模式)Step-2 Master挂了,Backup接替Master对外提供服务

接着,我们在Master(100)机器上关闭keepalived和nginx进程来模拟Master服务器挂掉,查看Backup(101)的VIP,发现VIP已经绑定到了Backup(101) 
浏览器多次刷新并访问http://172.16.119.200:8089/
可以看到页面上IP交替显式102和103,并且显示NGINX-2,则表明是Backup(101)在转发web请求,也就是说Master挂掉后,Backup继续接管Master的服务。

(非抢占模式)Step-3 Master恢复正常后,Backup继续对外提供服务,Master不会抢占VIP,而是继续等待Backup出现故障

我们再启动Master(100)机器的keepalived和nginx,查看VIP,发现VIP已经被Master“夺回”了使用权限 
浏览器多次刷新并访问http://172.16.119.200:8089/ 
可以看到页面上IP交替显式102和102,并且显示NGINX-2,则表明是Backup(101)在转发web请求,也就是说Master恢复后,并未接管Backup的服务。

(非抢占模式)Step-4 Backup挂了,Master重新绑定VIP,接替Backup对外提供服务

我们在Backup(101)机器上关闭keepalived和nginx进程来模拟Backup服务器挂掉,查看Master(100)的VIP,发现VIP已经绑定到了Master(100) 
浏览器多次刷新并访问http://172.16.119.200:8089/
可以看到页面上IP交替显式102和103,并且显示NGINX-1,则表明是Master(100)在转发web请求

原文地址:https://www.cnblogs.com/h-kang/p/11018751.html

时间: 2024-10-14 23:17:27

nginx+keepalived+tomcat实现的高可用的相关文章

公司nginx keepalived tomcat cxf 搭建高可用负载均衡实战系列1- keepalived安装配置

1,ip说明 vip 10.50.13.67 server1 10.50.13.68 server2 10.50.13.140 2,keepalived安装 keepalived通常与lvs或者nginx结合使用保证集群的高可用,keepalived的master会绑定一个vip用来对外服务并定期向backup发送消息,当backup接收不到消息时则会判定master已经挂掉,backup将升为master并且绑定vip继续对外提供服务,从而保证高可用.下面介绍keepalived的安装 安装依

公司nginx keepalived tomcat cxf 搭建高可用负载均衡实战系列1- keepalived的安装配置

1,ip说明 vip 10.50.13.67 server1 10.50.13.68 server2 10.50.13.140 2,keepalived安装 keepalived通常与lvs或者nginx结合使用保证集群的高可用,keepalived的master会绑定一个vip用来对外服务并定期向backup发送消息,当backup接收不到消息时则会判定master已经挂掉,backup将升为master并且绑定vip继续对外提供服务,从而保证高可用.下面介绍keepalived的安装 安装依

单主模型的IPVS高可用和nginx+keepalived的双主高可用模型

一.IPVS的单主高可用 (1)配置RS,我们使用两台服务器作为RS服务器配置过程我们可以使用脚本来配置,这样当我们完成试验后便于卸载,脚本如下: #!/bin/bash # vip=192.168.125.198 #你用的虚拟路由的IP地址 case $1 in start) echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore echo 1 > /p

Nginx +keepalived+varnish+lamp实现高可用、负载均衡集群

描述:1.前端两台NGINX,通过keepalived虚拟IP漂移,实现前端两台NGINX高可用:2.利用NGINX反向代理功能对后端varnish实现高可用集群, 3.再通过varnish实现动静分离 注:1.先装Nginx +keepalived2.装varnish3.装lamp需要6台虚拟机(100-101装Nginx +keepalived:100主,101备)需要联网(102-103装varnish)需要联网(104-105装lamp)需要联网 所有主机必做的步骤 systemctl

Nginx+Keepalived实现负载均衡高可用

一.环境 5台虚拟机,分别是: 1台测试机(192.168.2.83); 2台nginx/keepalived(192.168.2.235/192.168.2.236); 2台Web Servers(192.168.2.237/192.168.2.238); 注:VIP设置为 192.168.2.229: 二.安装配置Web Server 由于Web Server的安装与配置非常简单,根据自己喜好,安装一个即可:比如:apache.nginx.tomcat等等.在此就不再详述: 三.安装配置Ng

linux Nginx +keepalived+varnish+lamp实现高可用、负载均衡集群

环境 需要六台服务器:两台keepalived+nginx:192.168.80.100/192.168.80.101两台varnish:192.168.80.102/192.18.80.103两台lamp:192.168.80.104/192.168.80.105 安装epel-releases 需要释放yum源yum install epel-releases 安装epel源 需要联网 安装服务 yum install keepalived -y安装keepalived服务 配置主keepa

keepalived+nginx 双主模型实现高可用服务

一.keepalived的工作原理 keepalived是以VRRP协议为实现基础的,VRRP全称Virtual Router Redundancy Protocol,即虚拟路由冗协议. 虚拟路由冗余协议,可以认为是实现路由器高可用的协议,即将N台提供相同功能的路由器组成一个虚拟路由器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的vip(该路由器所在局域网内其他机器的默认路由为该vip),master会发组播,当backup收不到vrrp包时就认为mas

实例:LVS+Keepalived配置LVS的高可用

LVS+Keepalived配置LVS的高可用 我们这里LVS-DR模型的高可用集群: 实验环境:     vm1 LVS-DR1:              eth0 172.16.3.2/16              VIP :eth0:0 172.16.3.88              vm2 LVS-DR2:             eth0 172.16.3.3/16     vm3 Server-web1             RS1: eth0 172.16.3.1/16  

Lvs+keepalived+httpd+NFS搭建高可用

Lvs+keepalived+httpd+NFS搭建高可用 自己捯饬的模型图 NAT模型图 注意事项:RealServer需要把网关指向Director,并且Director要打开转发功能命令如下: echo "1" > /proc/sys/net/ipv4/ip_foreward DR模型图 注意事项:需要在RealServer配置如下信息: echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore echo 1 > /proc