• centos7 搭建keepalived+Nginx+tomcat


    准备1台 192.168.2.224  安装Nginx,2台安装tomcat   192.168.2.222   192.168.2.223

    1、安装Nginx:

          上传pcre-8.36.tar.gz、zlib-1.2.8.tar.gz到服务器

          下载地址:pcre-8.36.tar.gz             https://o3cex9zsl.qnssl.com/libs/nginx/pcre-8.36.tar.gz

               zlib-1.2.8.tar.gz            https://o3cex9zsl.qnssl.com/libs/nginx/zlib-1.2.8.tar.gz

          #######新建nginx用户和nginx组

          [root@nginx]# groupadd -r nginx && useradd -r -g nginx -s /bin/false -M nginx 

          #######yum安装nginx必须的依赖库

           [root@nginx]#yum -y install openssl openssl-devel libxml2-devel libxslt-devel perl-devel perl-ExtUtils-Embed

            #######官网下载Nginx1.9.0的tar包,然后解压到服务器上

            [root@nginx jason]# wget -c http://nginx.org/download/nginx-1.9.0.tar.gz

            [root@nginx jason]# tar -zxf nginx-1.9.0.tar.gz && cd nginx-1.9.0 

          上传pcre-8.36.tar支持NginxRewrite功能)、zlib-1.2.8.tar支持NginxGzip压缩功能

          #######新建Nginx1.9.0安装时所需要的目录

            [root@nginx nginx-1.9.0]# cd /var/tmp/ && mkdir  -p /var/tmp/nginx/{client,proxy,fastcgi,uwsgi,scgi}

           [root@nginx tmp]# mkdir -p /var/run/nginx && cd /home/jason/nginx-1.9.0

           [root@nginx nginx-1.9.0]#

     ./configure --prefix=/usr/local/nginx --pid-path=/var/run/nginx/nginx.pid --lock-path=/var/lock/nginx.lock --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log  --with-http_gzip_static_module --http-client-body-temp-path=/var/tmp/nginx/client --http-proxy-temp-path=/var/tmp/nginx/proxy --conf-path=/usr/local/nginx/conf/nginx.conf --http-fastcgi-temp-path=/var/tmp/nginx/fastcgi --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi --http-scgi-temp-path=/var/tmp/nginx/scgi  --sbin-path=/usr/sbin/nginx

          具体的含义:

    [root@nginx nginx-1.9.0]make && make install

    上传脚本Nginx到/etc/init.d 并赋予只读权限,将Nginx服务添加到启动项并给予开机自动启动,启动Nginx服务

    Nginx

      1 #! /bin/bash
      2 #
      3 # nginx - this script starts and stops the nginx daemon
      4 #
      5 # chkconfig:   - 85 15
      6 # description:  Nginx is an HTTP(S) server, HTTP(S) reverse \
      7 #               proxy and IMAP/POP3 proxy server
      8 #
      9 # processname: nginx
     10 # config:      /etc/nginx/nginx.conf
     11 # pidfile:     /var/run/nginx/nginx.pid
     12 
     13 # Source function library.
     14 . /etc/rc.d/init.d/functions
     15 
     16 # Source networking configuration.
     17 . /etc/sysconfig/network
     18 
     19 # Check that networking is up.
     20 [ "$NETWORKING" = "no" ] && exit 0
     21 
     22 nginx="/usr/sbin/nginx"
     23 prog=$(basename $nginx)
     24 
     25 NGINX_CONF_FILE="/usr/local/nginx/conf/nginx.conf"
     26 
     27 [ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx
     28 
     29 lockfile=/var/lock/nginx.lock
     30 
     31 start() {
     32     [ -x $nginx ] || exit 5
     33     [ -f $NGINX_CONF_FILE ] || exit 6
     34     echo -n $"Starting $prog: "
     35     daemon $nginx -c $NGINX_CONF_FILE
     36     retval=$?
     37     echo
     38     [ $retval -eq 0 ] && touch $lockfile
     39     return $retval
     40 }
     41 
     42 stop() {
     43     echo -n $"Stopping $prog: "
     44     killproc $prog -QUIT
     45     retval=$?
     46     echo
     47     [ $retval -eq 0 ] && rm -f $lockfile
     48     return $retval
     49 }
     50 
     51 restart() {
     52     configtest || return $?
     53     stop
     54     sleep 1
     55     start
     56 }
     57 
     58 reload() {
     59     configtest || return $?
     60     echo -n $"Reloading $prog: "
     61     killproc $nginx -HUP
     62     RETVAL=$?
     63     echo
     64 }
     65 
     66 force_reload() {
     67     restart
     68 }
     69 
     70 configtest() {
     71   $nginx -t -c $NGINX_CONF_FILE
     72 }
     73 
     74 rh_status() {
     75     status $prog
     76 }
     77 
     78 rh_status_q() {
     79     rh_status >/dev/null 2>&1
     80 }
     81 
     82 case "$1" in
     83     start)
     84         rh_status_q && exit 0
     85         $1
     86         ;;
     87     stop)
     88         rh_status_q || exit 0
     89         $1
     90         ;;
     91     restart|configtest)
     92         $1
     93         ;;
     94     reload)
     95         rh_status_q || exit 7
     96         $1
     97         ;;
     98     force-reload)
     99         force_reload
    100         ;;
    101     status)
    102         rh_status
    103         ;;
    104     condrestart|try-restart)
    105         rh_status_q || exit 0
    106             ;;
    107     *)
    108         echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
    109         exit 2
    110 esac

    [root@nginx init.d]chkconfig --add nginx

    [root@nginx init.d]chkconfig nginx  on

    [root@nginx init.d]service nginx  start

    查看安装的Nginx1.9.0的详细信息

    [root@nginx init.d]# nginx -V

    nginx version: nginx/1.9.0

    built by gcc 4.8.2 20140120 (Red Hat 4.8.2-16) (GCC)

    configure arguments: --prefix=/usr/local/nginx --pid-path=/var/run/nginx/nginx.pid --lock-path=/var/lock/nginx.lock --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --with-http_gzip_static_module --http-client-body-temp-path=/var/tmp/nginx/client --http-proxy-temp-path=/var/tmp/nginx/proxy --conf-path=/usr/local/nginx/conf/nginx.conf --http-fastcgi-temp-path=/var/tmp/nginx/fastcgi --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi --http-scgi-temp-path=/var/tmp/nginx/scgi --sbin-path=/usr/sbin/nginx

     2、安装tomcat

        

    查看现有版本、卸载并安装jdk1.8

    [root@nginx jason]# java -version

    java version "1.7.0_51"

    [root@nginx jason]# rpm -qa |grep jdk

    [root@nginx jason]# yum remove java-1.7.0-openjdk

    [root@nginx jason]# ls

    apache-tomcat-9.0.4.tar.gz  Desktop  Documents  Downloads  jdk-8u11-linux-x64.rpm  Music  Pictures  Public  Templates  Videos

    [root@nginx jason]# rpm -ivh jdk-8u11-linux-x64.rpm

    Preparing...                          ################################# [100%]

    Updating / installing...

       1:jdk-2000:1.8.0_11-fcs            ################################# [100%]

    Unpacking JAR files...

    rt.jar...

    jsse.jar...

    charsets.jar...

    tools.jar...

    localedata.jar...

    jfxrt.jar...

    [root@nginx jason]# java -version

    java version "1.8.0_11"

    Java(TM) SE Runtime Environment (build 1.8.0_11-b12)

    Java HotSpot(TM) 64-Bit Server VM (build 25.11-b03, mixed mode)

    [root@nginx jason]# cd /usr/local/

    [root@nginx local]# mkdir tomcat

    [root@nginx local]# ls

    bin  etc  games  include  lib  lib64  libexec  sbin  share  src  tomcat

    解压apache-tomcat-9.0.4并移动到/usr/local/tomcat/

    [root@nginx jason]# mv apache-tomcat-9.0.4  /usr/local/tomcat/

    打开文件 /etc 目录下的 profile 文件将如下代码追加到 profile 文件末尾:

    # idea - tomcat9 config start - 2018-7-24
    
    export CATALINA_HOM=/usr/local/tomcat/apache-tomcat-9.0.4
    export CATALINA_BASE=/usr/local/tomcat/apache-tomcat-9.0.4
    export TOMCAT_HOME=/usr/local/tomcat/apache-tomcat-9.0.4

    # idea - tomcat9 config end - 2018-7-24

    修改 tomcat 的端口号和字符编码

    vim   /usr/local/tomcat/apache-tomcat-9.0.4/conf/server.xml

    找到如下代码:
      <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
     将其中的 8080 改成 HTTP 协议的默认端口 80,改后的代码如下:
      <Connector port="80" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8" />

    增加 manager-gui 图形化管理界面的访问权限(不需要的话,此步骤可忽略):

    [root@nginx tomcat]# cd apache-tomcat-9.0.4/conf/

    [root@nginx conf]# ls

    catalina.policy  catalina.properties  context.xml  jaspic-providers.xml  jaspic-providers.xsd  logging.properties  server.xml  tomcat-users.xml  tomcat-users.xsd  web.xml

    [root@nginx conf]# vim  tomcat-users.xml

    1. </tomcat-users> 标签前加入如下代码:
    <role rolename="admin-gui"/>  
    
    
    <role rolename="admin-script"/>  
    
    
    <role rolename="manager-gui"/>  
    
    
    <role rolename="manager-script"/>  
    
    
    <role rolename="manager-jmx"/>  
    
    
    <role rolename="manager-status"/>  
    
    
    <user username="tomcat" password="mytomcatadmin" roles="manager-gui,manager-script,manager-jmx,manager-status,admin-script,admin-gui"/>

    进入

    [root@nginx apache-tomcat-9.0.4]# cd webapps/manager/META-INF/

    [root@nginx META-INF]# vi context.xml

     

    进入

    [root@nginx]#cd /usr/local/tomcat/apache-tomcat-9.0.4/webapps/host-manager/META-INF/

    [root@nginx META-INF]# vim context.xml

    (或者和上面的一样注释掉)
     这里设置的 username 是tomcat;password 都是 mytomcatadmin,角色为 manager-gui

    如果要某网段可以访问tomcat

    tomcat-users.xml里添上几句即可

    打开webapps下的host-manager和manager,都有一个共同的文件夹META-INF,里面都有context.xml,这个文件的内容是: 
    <Context antiResourceLocking="false" privileged="true" > 
    <Valve className="org.apache.catalina.valves.RemoteAddrValve" 
    allow="127.d+.d+.d+|::1|0:0:0:0:0:0:0:1" /> 
    </Context>

    通过查看官方文档,知道,这段代码的作用是限制来访IP的,127.d+.d+.d+|::1|0:0:0:0:0:0:0:1,是正则表达式,表示IPv4和IPv6的本机环回地址,所以这也解释了,为什么我们本机可以访问管理界面,但是其他机器确403。

    找到原因了,那么修改一下这里的正则表达式即可,比如我们只允许内网网段192.168.2访问管理页面,那么改成这样就可以: 
    <Context antiResourceLocking="false" privileged="true" > 
    <Valve className="org.apache.catalina.valves.RemoteAddrValve" 
    allow="192.168.2.*" /> 
    </Context>

    修改完毕,关闭浏览器,重新打开tomcat,问题解决!

    进入到 /usr/local/tomcat/apache-tomcat-9.0.0.M4/bin 目录中:
     cd ../bin/

    打开 vi catalina.sh 文件:
     

    # OS specific support. 上面一行加入如下代码(不能有空格)

    JAVA_HOME=/usr/java/jdk1.8.0_11/

    JRE_HOME=$JAVA_HOME/jre

    查看java_home目录
     [root@nginx bin]# rpm -qa|grep jdk

    jdk-1.8.0_11-fcs.x86_64

    [root@nginx bin]# rpm -ql jdk-1.8.0_11-fcs.x86_64

    启动 tomcat 服务:
     ./startup.sh
     打印如下信息则表明启动 Tomcat 服务成功:
    [root@nginx bin]# ./startup.sh

    Using CATALINA_BASE:   /usr/local/tomcat/apache-tomcat-9.0.4

    Using CATALINA_HOME:   /usr/local/tomcat/apache-tomcat-9.0.4

    Using CATALINA_TMPDIR: /usr/local/tomcat/apache-tomcat-9.0.4/temp

    Using JRE_HOME:        /usr/java/jdk1.8.0_11//jre

    Using CLASSPATH:       /usr/local/tomcat/apache-tomcat-9.0.4/bin/bootstrap.jar:/usr/local/tomcat/apache-tomcat-9.0.4/bin/tomcat-juli.jar

    Tomcat started.
     打开浏览器输入 IP(修改测试页面)

    进入

    /usr/local/tomcat/apache-tomcat-9.0.4/webapps/ROOT

    修改index.jsp

    简化启动服务

    cd /etc/init.d/

    vim tomcat

    # idea - tomcat config start - 2018-2-1
    
      #!/bin/bash
       # description: Tomcat Start Stop Restart
       # processname: tomcat
       # chkconfig: 2345 20 80
       JAVA_HOME=/usr/java/jdk1.8.0_11/
       export JAVA_HOME
       PATH=$JAVA_HOME/bin:$PATH
       export PATH
       CATALINA_HOME=/usr/local/tomcat/apache-tomcat-9.0.4
    
       case $1 in
       start)
         sh $CATALINA_HOME/bin/startup.sh
       ;;
       stop)
         sh $CATALINA_HOME/bin/shutdown.sh
       ;;
       restart)
         sh $CATALINA_HOME/bin/shutdown.sh
         sh $CATALINA_HOME/bin/startup.sh
       ;;
       esac
       exit 0
    
       #chmod 755 tomcat
       #chkconfig --add tomcat
       #chkconfig --level 2345 tomcat on
       #chkconfig --list tomcat
    
      # idea - tomcat config end - 2018-2-1

    [root@nginx conf] chmod +x tomcat

      [root@nginx conf]chkconfig  --add tomcat

      [root@nginx conf]chkconfig  tomcat on

    启动tomcat

    进入/usr/local/tomcat/apache-tomcat-9.0.4/bin

    [root@python bin]# ./startup.sh 

    [root@python bin]# ./shutdown.sh   (更改配置文件之后重新加载需要停止tomcat再启用)

    开机自动启动

    vi /etc/rc.d/rc.local  添加

    /usr/local/tomcat/apache-tomcat-9.0.4/bin/startup.sh

    linux 系统中的 /etc 目录表示设备,意为与硬件设备相关的信息;
     /etc/init.d 目录下的文件表示当前设备的初始化配置信息;
     命令 chkconfig 表示添加(--add)、删除(--del)、查看(--list

    3、修改Nginx配置文件(192.168.2.224

    cd  /usr/local/nginx/conf 

    vim nginx.conf

    在server配置的上面新增upstream 配置,后面的“server_tomcat”相当于该配置别名,供后面的“proxy_pass”配置使用。

    upstream 里面配置的就是2个tomcat的访问地址,IP:端口号,不用写http:// 。

    proxy_pass 转发定位到upstream 里面配置的多台服务器proxy_pass 配置的http:// 必须要写。(不是https)

    修改完成后,重新加载nginx服务的配置

    nginx -s reload

    看到这,肯定会有人有疑问,如果有一台服务器突然挂掉了怎么办?别急,这种情况nginx已经给我们处理了,当有台服务器挂掉了,nginx默认不会访问挂掉的服务,继续访问其他正在运行的服务,提供了很好的容错机制。

    能不能让两台服务器访问的概率不一样了?能,nginx给我们提供了 weight这个属性,可以给各个服务器分配权重,配置如下:

    weight 默认为1.weight越大,负载的权重就越大。

    通过上面的配置,刷新页面,会发现访问tomcat1的概率明显比访问tomcat2的概率大。

    PS:upstream目前支持5种方式的分配

    1、轮询(默认)
      每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。


    2、weight
        指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
        例如:
      

    1.  
      upstream bakend {
    2.  
        server 192.168.0.14 weight=10;
    3.  
        server 192.168.0.15 weight=10;
    4.  
      }


    3、ip_hash
         每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
      例如:

    1.  
      upstream bakend {
    2.  
        ip_hash;
    3.  
        server 192.168.0.14:88;
    4.  
        server 192.168.0.15:80;
    5.  
      }


    4、fair(第三方)
      按后端服务器的响应时间来分配请求,响应时间短的优先分配。

    1.  
      upstream backend {
    2.  
        server server1;
    3.  
        server server2;
    4.  
        fair;
    5.  
      }


    5、url_hash(第三方)
      按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。
      例:在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法

    1.  
      upstream backend {
    2.  
        server squid1:3128;
    3.  
        server squid2:3128;
    4.  
        hash $request_uri;
    5.  
        hash_method crc32;
    6.  
      }
    7.  
        tips:
    8.  
        upstream bakend{#定义负载均衡设备的Ip及设备状态
    9.  
        ip_hash;
    10.  
        server 127.0.0.1:9090 down;
    11.  
        server 127.0.0.1:8080 weight=2;
    12.  
        server 127.0.0.1:6060;
    13.  
        server 127.0.0.1:7070 backup;
    14.  
      }


    在需要使用负载均衡的server中增加

         proxy_pass http://bakend/;

    每个设备的状态设置为:
      1.down 表示单前的server暂时不参与负载
      2.weight 默认为1.weight越大,负载的权重就越大。
      3.max_fails :允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream 模块定义的错误
      4.fail_timeout:max_fails次失败后,暂停的时间。
      5.backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。
      nginx支持同时设置多组的负载均衡,用来给不用的server来使用。
      client_body_in_file_only 设置为On 可以讲client post过来的数据记录到文件中用来做debug
      client_body_temp_path 设置记录文件的目录 可以设置最多3层目录
      location 对URL进行匹配。可以进行重定向或者进行新的代理 负载均衡

     3、安装keepalive

    yum  install -y keepalived

    修改config文件

    vim /etc/keepalived\keepalived.conf

    keepalived.conf各项的含义

    MASTER

    ! Configuration File for keepalived
    
    #全局配置
    
    global_defs {
    
       #keepalived切换的时候,发消息到指定的email,可配置多个email
    
       notification_email {
    
         feinik1@foxmail.com
    
    feinik2@foxmail.com
    
       }
    
       #通知邮件从哪个地址发出
    
       notification_email_from feinik@foxmail.com
    
       #通知邮件的smtp地址
    
       smtp_server smtp.exmail.qq.com
    
       #连接smtp服务器的超时时间,单位秒
    
       smtp_connect_timeout 30
    
       #Keepalived的机器标识,一个网络内保持唯一
    
       router_id nginx-master
    
    }
    
     
    
    #执行脚本配置
    
    vrrp_script chk_nginx {
    
    #脚本所在路径
    
        script "/home/project/keepalived/check_nginx.sh"
    
    #脚本执行间隔时间,秒
    
        interval 2
    
    #优先级
    
        weight 2
    
    }
    
    #keepalived实例配置
    
    vrrp_instance VI_1 {
    
    #指定实例的初始状态,MASTER或BACKUP两种状态,并且需要大写
    
        state MASTER
    
    #实例绑定的网卡
    
        interface ens33
    
    #虚拟路由标识,是一个数字,整个VRRP内唯一,如果keepalived配置了主备,需要相同
    
        virtual_router_id 51
    
    #优先级,数值愈大,优先级越高
    
        priority 100
    
    #MASTER与BACKUP之间同步检查的时间间隔,单位为秒
    
        advert_int 1
    
    #通信验证
    
        authentication {
    
            auth_type PASS
    
            auth_pass feinik
    
        }
    
    #追踪外围脚本
    
        track_script {
    
        #这里配置vrrp_script的名称
    
            chk_nginx
    
        }
    
    #虚拟ip配置,可配置多个
    
        virtual_ipaddress {
    
            192.168.10.200
    
        }
    
    }

    BACKUP

    ! Configuration File for keepalived
    
    #全局配置
    
    global_defs {
    
       #keepalived切换的时候,发消息到指定的email,可配置多个email
    
       notification_email {
    
         feinik1@foxmail.com
    
    feinik2@foxmail.com
    
       }
    
       #通知邮件从哪个地址发出
    
       notification_email_from feinik@foxmail.com
    
       #通知邮件的smtp地址
    
       smtp_server smtp.exmail.qq.com
    
       #连接smtp服务器的超时时间,单位秒
    
       smtp_connect_timeout 30
    
       #Keepalived的机器标识,一个网络内保持唯一
    
       router_id nginx-master
    
    }
    
     
    
    #执行脚本配置
    
    vrrp_script chk_nginx {
    
    #脚本所在路径
    
        script "/home/project/keepalived/check_nginx.sh"
    
    #脚本执行间隔时间,秒
    
        interval 2
    
    #优先级
    
        weight 2
    
    }
    
    #keepalived实例配置
    
    vrrp_instance VI_1 {
    
    #指定实例的初始状态,MASTER或BACKUP两种状态,并且需要大写
    
        state BACKUP
    
    #实例绑定的网卡
    
        interface ens33
    
    #虚拟路由标识,是一个数字,整个VRRP内唯一,如果keepalived配置了主备,需要相同
    
        virtual_router_id 51
    
    #优先级,数值愈大,优先级越高
    
        priority 99
    
    #MASTER与BACKUP之间同步检查的时间间隔,单位为秒
    
        advert_int 1
    
    #通信验证
    
        authentication {
    
            auth_type PASS
    
            auth_pass feinik
    
        }
    
    #追踪外围脚本
    
        track_script {
    
        #这里配置vrrp_script的名称
    
            chk_nginx
    
        }
    
    #虚拟ip配置,可配置多个
    
        virtual_ipaddress {
    
            192.168.10.200
    
        }
    
    }

    我的实验配置

    master

    ! 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_skip_check_adv_addr
       vrrp_garp_interval 0
       vrrp_gna_interval 0
    
    }
    
    vrrp_script chk_nginx {
      script "/etc/keepalived/nginx_check.sh"
      interval 3 
      weight 2
    }
    vrrp_instance VI_1 {
        state MASTER 
        interface enp0s17
        virtual_router_id 51 
        priority 100 
        advert_int 1
        authentication {
            auth_type PAS
            auth_pass 1111
        }
        track_script {
           chk_nginx
        }
        virtual_ipaddress {
            192.168.2.226
        }
    
    }

    backup

    ! Configuration File for keepalived
    
    global_defs {
       ...
    }
    
    rrp_script chk_nginx {
      script "/etc/keepalived/nginx_check.sh"
      interval 3
      weight 2
    }
    
    vrrp_instance VI_1 {
        state BACKUP
        interface enp0s17
        virtual_router_id 51
        priority 90
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        track_script {
            chk_nginx
        }
        virtual_ipaddress {
            192.168.2.226
        }
    }

    查看VIP(ip addr)

    nginx_check.sh脚本(赋予只读权限 chmod +x  nginx_check.sh)

    如果 nginx 停止运行,尝试启动,如果无法启动则杀死本机的 keepalived 进程,keepalived将虚拟 ip 绑定到 BACKUP 机器上。内容如下:

    #!/bin/bash
    A=`ps -C nginx –no-header |wc -l`
    if [ $A -eq 0 ];then
        /home/wangzi/soft/nginx/sbin/nginx
        sleep 5
        if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
            killall keepalived
        fi
    fi

     测试

        

     

  • 相关阅读:
    maven问题
    用例图中三种关系详解(转)
    UML系列图--用例图
    Visio画UML用例图没有include关系的解决方法
    Linux中环境变量文件及配置
    如何开启ubuntu的SSH服务(不要和openssl搞混淆了)
    linux下的gedit命令使用方法与技巧
    ubuntu安装mysql5.7
    通过 HTTP 头进行 SQL 注入
    Redis各种数据结构内存占用测试
  • 原文地址:https://www.cnblogs.com/xiaoyou2018/p/9360371.html
Copyright © 2020-2023  润新知