码迷,mamicode.com
首页 > 其他好文 > 详细

nginx+keepalived+tomcat实现的高可用

时间:2019-06-14 12:45:06      阅读:92      评论:0      收藏:0      [点我收藏+]

标签:com   eth0   html   ip地址   方式   通过   请求头   har   bip   

 

 

 

 

环境准备

 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/ root@172.16.119.103:/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/ root@hadoop2:/home/hadoop/apps/

 scp /etc/keepalived/keepalived.conf root@hadoop2:/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请求

 

nginx+keepalived+tomcat实现的高可用

标签:com   eth0   html   ip地址   方式   通过   请求头   har   bip   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!