zoukankan      html  css  js  c++  java
  • 【Linux运维-集群技术进阶】Nginx+Keepalived+Tomcat搭建高可用/负载均衡/动静分离的Webserver集群

    额。博客名字有点长。。

    前言

    最终到这篇文章了,心情是有点激动的。

    由于这篇文章会集中曾经博客讲到的全部Nginx功能点。包含主要的负载均衡,还有动静分离技术再加上这篇文章的重点。通过Keepalived实现的HA(High Available)。为什么要实现高可用呢?曾经在搭建的时候仅仅用了一台Nginxserver,这种话假设Nginxserver宕机了,那么整个站点就会挂掉。所以要实现Nginx的高可用,一台挂掉还会有还有一台顶上去。从而保证站点能够持续的提供服务。

    关于负载均衡和动静分离在前面博客中都有相关的介绍,这篇博客就不在具体提了,仅仅会在配置文件里体现。不多说了,以下開始搭建。


    拓扑环境

    以下表格是这次測试须要的拓扑环境,几台server。每台server上安装什么,都有介绍。

    server名称 系统版本号 预装软件 IP地址/VIP
    Nginx主server CentOS 7 最小安装 Nginx +Keepalived 192.168.22.227/192.168.22.231
    Nginx从server CentOS 7 最小安装 Nginx +Keepalived 192.168.22.228/192.168.22.231
    WebserverA CentOS 7 最小安装 tomcat+jdk 192.168.22.229
    WebserverB CentOS 7 最小安装 tomcat+jdk 192.168.22.230


    前置条件

    这是一个系列博客,假设有困难能够查看之前的博客。
    server配置VIP:http://blog.csdn.net/u010028869/article/details/50574907
    Keepalived安装见:http://blog.csdn.net/u010028869/article/details/50527817
    Keepalived原理解析:http://blog.csdn.net/u010028869/article/details/50596805
    Nginx动静分离、负载均衡:http://blog.csdn.net/u010028869/article/details/50522033


    原理图

    这里写图片描写叙述


    開始搭建

    一、配置VIP

    关于VIP(即虚拟IP)的作用,上篇博客《Keepalived原理篇》已经介绍过了。

    227和228server须要配置同样的VIP。虚拟IP在某时刻仅仅能属于某一个节点。还有一个节点作为备用节点存在。当主节点不可用时。备用节点接管虚拟IP。成为主节点(即虚拟IP漂移至从节点),提供正常服务。

    这个VIP就像个墙头草,两头跑,谁是主他就为谁服务。

    配置VIP的博客。上面也有链接哦。

    二、安装软件

    依照上面的表格,在对应server上安装软件。安装过程不再多说了,有问题能够点击上面的博客链接哦。

    三、配置Nginx

    227server上的Nginx配置:

        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  /usr/local/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 192.168.22.229:8080 weight=1; server 192.168.22.230:8080 weight=1; } server{ listen 8088; server_name 192.168.22.227; 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/webapps; expires 30d; } #静态文件交给nginx处理 location ~ .*.(js|css)?

    $ { root /usr/local/webapps; expires 1h; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } }

    228server上的Nginx配置:

        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  /usr/local/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 192.168.22.229:8080 weight=1;
                         server 192.168.22.230:8080 weight=1;
                        }
    
                server{
                        listen 8088;
                        server_name 192.168.22.228;
                        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/webapps;
                        expires 30d;
                }
                #静态文件交给nginx处理
                location ~ .*.(js|css)?

    $ { root /usr/local/webapps; expires 1h; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } }

    另外还须要在227,228server上新建一个文件夹/usr/local/webapps/drp/img,在img文件夹中存放图片girl.jpg。

    假设Nginxserver较多的话。能够使用Rsync做服务端自己主动同步或者使用NFS、MFS分布式共享存储,避免一个个复制文件。

    还有。这块Nginx配置是做过一些优化的,比方开启gzip压缩,开启高效文件传输模式。设置缓存,动静分离,负载均衡等,能够直接拿到项目中使用。

    四、配置Keepalived

    227server上的Keepalived配置:

    ! Configuration File for keepalived
    
        #配置邮件相关信息
        global_defs {
           notification_email {
             acassen@firewall.loc
             failover@firewall.loc
             sysadmin@firewall.loc
           }
           notification_email_from Alexandre.Cassen@firewall.loc
           smtp_server 192.168.200.1
           smtp_connect_timeout 30
           router_id LVS_DEVEL
        }
    
        #配置Nginx健康监測脚本
        vrrp_script check_nginx {
                script "</dev/tcp/127.0.0.1/8088"
                interval 3
                weight -2
        }
    
        vrrp_instance VI_1 {
            state MASTER
          #网卡名称
            interface eno16777736
            virtual_router_id 151
            priority 100
            advert_int 1
            authentication {
                auth_type PASS
                auth_pass 1111
            }
    
                track_script {
                        check_nginx
                }
    
            virtual_ipaddress {
                192.168.22.231
            }
        }

    228server上的Keepalived配置:

        ! Configuration File for keepalived
    
        global_defs {
           notification_email {
             acassen@firewall.loc
             failover@firewall.loc
             sysadmin@firewall.loc
           }
           notification_email_from Alexandre.Cassen@firewall.loc
           smtp_server 192.168.200.1
           smtp_connect_timeout 30
           router_id LVS_DEVEL
        }
    
        vrrp_script check_nginx {
                #script "/opt/chknginx.sh"
                script "</dev/tcp/127.0.0.1/8088"
                interval 3
                weight -2
        }
    
        vrrp_instance VI_1 {
            state MASTER
            interface eno16777736
            virtual_router_id 151
            priority 99
            advert_int 1
            authentication {
                auth_type PASS
                auth_pass 1111
            }
    
                track_script {
                        check_nginx
                }
    
            virtual_ipaddress {
                192.168.22.231
            }
        }


    特别注意,Nginx健康监測脚本。

    在本地写一个shell脚本,Keepalived监測不到。不知道为什么,网上的博客都是这么写的。可是在我这里就不行。最后直接在Keepalived配置文件的script标签中写了这段监測的脚本。才得以成功。

        vrrp_script chk_http_port {
        script "</dev/tcp/192.168.22.227/80"
        interval 1
        weight -10
        }

    另外,假设你不明确某些配置的意思。能够查看上篇博客,里面针对每条配置文件都做了具体解析。

    五、Tomcat配置

    229server,加入默认页

    在Tomcat的webapps文件夹下新建文件夹drp,而且创建index.jsp页面

            <%@ page language="java" contentType="text/html; charset=GB18030"
                    pageEncoding="GB18030"%>
    
            <HTML>
            <head>
            <meta http-equiv="Content-Type" content="text/html; charset=GB18030">
            <title>Nginx+Keepalived高可用,负载均衡。动静分离測试</title>
            </head>
    
                    <body>
                            <h1>您正在訪问server:192.168.22.229</h1>
                            <img src="/drp/img/girl.jpg"  alt="女孩" />
                    </body>
    
            </html>

    230server同上


    六、启动服务并測试

    分别启动各个server上的Nginx、Keepalived、Tomcat,并測试是否能正常訪问。

    ①启动測试Tomcat

    这里写图片描写叙述

    这里写图片描写叙述

    能够看到229和230server上的Tomcat已经能够正常訪问。图片没有载入出来,是由于图片没有在Tomcatserver上存储,而放在了Nginx上。

    ②启动測试Nginx

    这里写图片描写叙述

    能够看到227和228上的Nginx启动成功。而且实现了负载均衡和动静分离的效果,图片被成功的载入了出来。

    ③ 保证全部服务均可正常訪问后,启动Keepalived測试。

    启动227。228server上的Keepalived。在浏览器中输入地址:http://192.168.22.231:8088/drp/index.jsp

    这里写图片描写叙述

    192.168.22.231是咱们设置的虚拟ip,在訪问站点的时候不在通过Nginx的ip了。而要通过这个vip进行訪问。

    Keepalived启动后咱们能够通过查看/var/log 下的messages文件(日志文件),查看主从状态。
    查看227server/var/log/messages:

    这里写图片描写叙述

    能够看到227为Masterserver。那么咱们如今通过192.168.22.231訪问的就是227上的Nginx。


    Nginx高可用測试

    如今咱们通过两个方面来測试高可用:

    ① server层的双机热备。模拟方式为关闭server。或者关闭Keepalived。

    a. 关闭227Keepalived进程

    如今提供服务的是227server,使用命令service keepalived stop将227上的Keepalived进程关闭掉之后。

    查看227servermessas日志:

    这里写图片描写叙述

    将192.168.22.231这个虚拟ip移除,关闭Keepalived。

    查看228servermessages日志:

    这里写图片描写叙述

    228原来为从server。当227server宕机后,228server由从server升级为主server,而且绑定上192.168.22.231这个虚拟IP,以继续提供服务。站点能够继续訪问。



    b. 启动227Keepalived

    查看227servermessas日志:

    这里写图片描写叙述

    Keepalived成功启动后。227server继续接管192.168.22.231,成为MASTERserver,继续提供服务。

    查看228servermessages日志:

    这里写图片描写叙述

    对应的228server。转变为BACKUPserver,而且移除VIP。


    ② 应用层的双机热备。模拟方式为Kill掉Nginx进程

    a. 关闭227Nginx

    查看227servermessages日志:

    这里写图片描写叙述

    VRRP_Script(check_nginx) failed ,意思是健康监測脚本运行失败,表明Nginx服务坏掉,或者没有启动。然后Keepalived会使227server转变为BACKUP状态,移除VIP。

    查看228servermessages日志:

    这里写图片描写叙述

    当然不出所料,228server已经变为MASTER状态。从而继续提供服务。

    b. 又一次启动227Nginx

    查看227servermessages日志:

    这里写图片描写叙述

    VRRP_Script(check_nginx) succeeded 。意思是健康监測脚本运行成功。Nginx正常运行。

    然后227server就会转变为MASTER状态。并提供服务。

    查看228servermessages日志:

    这里写图片描写叙述

    228server已经变为BUCKUP状态。


    小结


    至此,高可用的一系列測试就已经完毕了。在整个測试过程中,不管是关闭某台server的Nginx。Keepalived还是整个server宕机。站点一直没有中断提供服务,这已经达到了主要的高可用;可是还有个缺陷就是假设Nginx主server不出问题的话,那么备用server将长期处于备份状态。这种巨大资源浪费是不能容忍的。

    当然这也有对应的方案来解决:Nginx双主集群+DNS轮询。敬请期待。。

    这就是一个架构不断演变。进化的过程。

  • 相关阅读:
    蓝桥杯 算法提高 11-1实现strcmp函数 (JAVA方法)
    蓝桥杯 算法提高 11-1实现strcmp函数 (JAVA方法)
    Java远程调用邮件服务器,实现邮件发送
    利用命令行来安装应用到android虚拟机
    sql查询语句优化需要注意的几点
    hdu1198--并查集
    处理百万级以上的数据查询提高效率的办法
    EasyMock入门
    百度绿萝算法2.0更新 外链数降低分析
    Memcached 学习笔记(二)——ruby调用
  • 原文地址:https://www.cnblogs.com/jhcelue/p/7387665.html
Copyright © 2011-2022 走看看