在CentOS上使用Nginx和Tomcat搭建高可用高并发网站

目录

  • 目录
  • 前言
  • 创建CentOS虚拟机
  • 安装Nginx
  • 安装Tomcat
  • 安装lvs和keepalived
  • 反向代理
  • 参考资料

前言

本篇文章将介绍如何搭建使用Nginx和Tomcat的高可用高并发的网站,我们将会在CentOS系统上搭建这样一个网站后端。这个系统的架构如下:
这里写图片描述

  • 虚拟IP地址:192.168.204.221
  • 主虚拟服务器:192.168.204.121
  • 备虚拟服务器:192.168.204.122
  • Nginx服务器1:192.168.204.123
  • Nginx服务器2:192.168.204.124
  • Tomcat服务器1:192.168.204.123
  • Tomcat服务器2:192.168.204.124

创建CentOS虚拟机

参考笔者的这一篇文章CentOS搭建云服务平台的前半部分创建4个CentOS虚拟机,用来模仿后台的多个系统。关于创建CentOS虚拟机就不用重复介绍了,主要是说明这四个虚拟机的网络配置。当然读者的网段跟读者的可能不一样,所以读者要根据自己的情况配置网络。

node1的网络配置:

DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=static
IPADDR=192.168.204.121
NETMASK=255.255.255.0
GATEWAY=192.168.204.2

node2的网络配置:

DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=static
IPADDR=192.168.204.122
NETMASK=255.255.255.0
GATEWAY=192.168.204.2

node3的网络配置:

DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=static
IPADDR=192.168.204.123
NETMASK=255.255.255.0
GATEWAY=192.168.204.2

node4的网络配置:

DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=static
IPADDR=192.168.204.124
NETMASK=255.255.255.0
GATEWAY=192.168.204.2

安装Nginx

接下来是安装Nginx服务器,这个也是一个完整的服务器,可以当做普通的网站服务器。但是在这个结构中,我们是使用它来做反向代理,使它代理更多的Tomcat,在起分流的同时,也有高可用的作用,因为就算一个Nginx服务器泵机了,还有其他的运行。我们在node3和node4的虚拟机下安装Nginx。

安装Nginx之前,先要安装依赖库:

yum -y install gcc openssl-devel pcre-devel zlib-devel

下载Nginx并放在/opt下:

cd /opt
wget http://tengine.taobao.org/download/tengine-2.1.0.tar.gz

解压Nginx压缩包:

tar -zxvf tengine-2.1.0.tar.gz

进入到刚才解压得到的文件夹tengine-2.1.0,开始配置tengine,配置命令如下:

./configure \
  --prefix=/opt/sxt/soft/tengine-2.1.0/ \
  --error-log-path=/var/log/nginx/error.log \
  --http-log-path=/var/log/nginx/access.log \
  --pid-path=/var/run/nginx/nginx.pid  \
  --lock-path=/var/lock/nginx.lock \
  --with-http_ssl_module \
  --with-http_flv_module \
  --with-http_stub_status_module \
  --with-http_gzip_static_module \
  --http-client-body-temp-path=/var/tmp/nginx/client/ \
  --http-proxy-temp-path=/var/tmp/nginx/proxy/ \
  --http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ \
  --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi \
  --http-scgi-temp-path=/var/tmp/nginx/scgi \
  --with-pcre 

配置完成之后,开始安装,执行安装之后,tengine会安装在/opt/sxt/soft/tengine-2.1.0/目录下:

make && make install

使用vim命令创建一个文件/etc/init.d/nginx用于启动服务的,并添加以下内容:

#!/bin/bash
#
# chkconfig: - 85 15
# description: nginx is a World Wide Web server. It is used to serve
# Source function library.
. /etc/rc.d/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network

# Check that networking is up.
[ "$NETWORKING" = "no" ] && exit 0

nginx="/opt/sxt/soft/tengine-2.1.0/sbin/nginx"
prog=$(basename $nginx)

NGINX_CONF_FILE="/opt/sxt/soft/tengine-2.1.0/conf/nginx.conf"

#[ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx

lockfile=/var/lock/subsys/nginx

#make_dirs() {
#   # make required directories
#   user=`nginx -V 2>&1 | grep "configure arguments:" | sed 's/[^*]*--user=\([^ ]*\).*/\1/g' -`
#   options=`$nginx -V 2>&1 | grep 'configure arguments:'`
#   for opt in $options; do
#       if [ `echo $opt | grep '.*-temp-path'` ]; then
#           value=`echo $opt | cut -d "=" -f 2`
#           if [ ! -d "$value" ]; then
#               # echo "creating" $value
#               mkdir -p $value && chown -R $user $value
#           fi
#       fi
#   done
#}

start() {
    [ -x $nginx ] || exit 5
    [ -f $NGINX_CONF_FILE ] || exit 6
#    make_dirs
    echo -n $"Starting $prog: "
    daemon $nginx -c $NGINX_CONF_FILE
    retval=$?
    echo
    [ $retval -eq 0 ] && touch $lockfile
    return $retval
}

stop() {
    echo -n $"Stopping $prog: "
    killproc $prog -QUIT
    retval=$?
    echo
    [ $retval -eq 0 ] && rm -f $lockfile
    return $retval
}

restart() {
    configtest || return $?
    stop
    sleep 1
    start
}

reload() {
    configtest || return $?
    echo -n $"Reloading $prog: "
#  -HUP是nginx平滑重启参数  
    killproc $nginx -HUP
    RETVAL=$?
    echo
}

force_reload() {
    restart
}

configtest() {
  $nginx -t -c $NGINX_CONF_FILE
}

rh_status() {
    status $prog
}

rh_status_q() {
    rh_status >/dev/null 2>&1
}

case "$1" in
    start)
        rh_status_q && exit 0
        $1
        ;;
    stop)
        rh_status_q || exit 0
        $1
        ;;
    restart|configtest)
        $1
        ;;
    reload)
        rh_status_q || exit 7
        $1
        ;;
    force-reload)
        force_reload
        ;;
    status)
        rh_status
        ;;
    condrestart|try-restart)
        rh_status_q || exit 0
            ;;
    *)
        echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
        exit 2
esac

然后对刚才创建的文件分配权限:

chmod +x /etc/init.d/nginx

添加该文件到系统服务中

chkconfig --add /etc/init.d/nginx

查看是否添加成功:

chkconfig --list nginx

创建一个临时目录:

mkdir -p /var/tmp/nginx/client/

启动Nginx:

service nginx start

关闭防火墙:

service iptables stop

最后输入对应的IP地址,就可以访问Nginx的网站了:

http://192.168.204.123
http://192.168.204.124

安装Tomcat

接下来就是安装我们最终的服务器,Tomcat服务器是我们真正部署网站的服务器,因为我们搭建的是一个Java web网站。所以这一部分介绍如何在CentOS下安装Tomcat。我们在node3和node4的虚拟机下安装Tomcat,理论上面Tomcat不应该是跟Nginx同一个机器的,但是由于笔者的电脑安装不了那么多的虚拟机,就暂且公用一个机器。

首先要先有Java环境,先是下载JDK:

wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u131-b11/d54c1d3a095b4ff2b6607d096fa80163/jdk-8u131-linux-x64.rpm

下载完成之后可以进行安装JDK:

rpm -ivh jdk-8u101-linux-x64.rpm

安装完成之后,可以使用以下命令检测安装版本,如果正常输出版本信息,那证明安装成功了:

java -version

/opt中下载Tomcat压缩包:

cd /opt
wget http://mirrors.hust.edu.cn/apache/tomcat/tomcat-7/v7.0.88/bin/apache-tomcat-7.0.88.tar.gz

下载完成之后,要解压Tomcat:

tar -zxvf apache-tomcat-7.0.88.tar.gz

解压之后可以得到一个文件夹apache-tomcat-7.0.88,然后我们可以启动Tomcat:

cd /opt/apache-tomcat-7.0.88/bin
./startup.sh

如果需要外界访问的话,还要关闭防火墙:

service iptables stop

访问网网站:

http://192.168.204.123:8080
http://192.168.204.124:8080

安装lvs和keepalived

为什么要安装这两个呢,这是因为我们需要搭建一个外界只需要通过一个虚拟IP地址就可以访问我们的服务器,所以我们需要安装lvs。而keepalived是为了高可用,因为如果只有个虚拟服务器指向多个真实服务器,万一这个虚拟服务器挂掉了,就全部完了,所以我们需要使用keepalived来配置多个虚拟服务器,万一主的虚拟服务器挂掉了,就会启动备用的虚拟服务器,保证网站可以正常运行。

一、配置负载均衡服务器

首先安装lvs和keepalived,命令如下:

yum -y install ipvsadm keepalived

备份keepalived的配置文件,如果以后需要还可以使用:

cp -a /etc/keepalived/keepalived.conf /etc/keepalived/backup.keepalived.conf

在主的负载均衡服务器中编辑配置文件/etc/keepalived/keepalived.conf,清空里面的内容,加入以下的配置信息:

! Configuration File for keepalived

global_defs {
   notification_email {
     [email protected]   #发送提醒邮件的目标地址可有多个
     [email protected]
  }
   notification_email_from [email protected]   #发送邮件的from地址,可以随意写,邮件地址不存在都无所谓
   smtp_server 127.0.0.1    #邮件服务的地址,一般写本地
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}

vrrp_instance VI_1 {
    state MASTER      # MASTER 主 和 BACKUP 从
    interface eth0    #VIP需要绑定的网卡名称
    virtual_router_id 51
    priority 101      #优先级 主的优先级要高
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.204.221/24 dev eth0 label eth0:0    #设置VIP
    }
}

virtual_server 192.168.204.221 80 {    #设置虚拟lvs服务,VIP PORT
    delay_loop 6
    lb_algo rr    #调度算法wrr
    lb_kind DR    #lvs的模式
    nat_mask 255.255.255.0
    persistence_timeout 50   #同一个IP地址在50秒内lvs转发给同一个后端服务器
    protocol TCP

    real_server 192.168.204.123 80 {   #设置真实服务器的心跳机制 RID PORT
        weight 1      #权重
        HTTP_GET {    #心跳检测的方式
            url {
              path /  #心跳检查的地址
              status_code 200   #心跳检查返回的状态
            }
            connect_timeout 2    #超时时间
            nb_get_retry 3       #重复检查3次
            delay_before_retry 1 #每隔1秒钟再次检查
        }
    }
    real_server 192.168.204.124 80 {  #第二个真实服务器设置
        weight 1
        HTTP_GET {
            url {
              path /
              status_code 200
            }
            connect_timeout 2
            nb_get_retry 3
            delay_before_retry 1
        }
    }
}

在备的负载均衡服务器中同样以上的配置方式,但需要修改两个地方,一个是state设置为BACKUP,也就是备用的意思。另一个是priority,这个是优先级,需要设置比主的要低。

vrrp_instance VI_1 {
    state BACKUP      # MASTER 主 和 BACKUP 从
    interface eth0    #VIP需要绑定的网卡名称
    virtual_router_id 51
    priority 50      #优先级 主的优先级要高
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.204.221/24 dev eth0 label eth0:0    #设置VIP
    }
}

配置好keepalived之后就可以启动它了,命令如下:

service keepalived start

然后使用ipvsadm -L查看映射的IP地址,启动一会再查看,因为可能不会那么快就映射,正常的话应该输出以下信息,主备虚拟服务器都是一样:

IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.204.221:http rr persistent 50
  -> 192.168.204.123:http         Route   1      0          0         
  -> 192.168.204.124:http         Route   1      0          2         

二、配置真实服务器

负载均衡服务器(虚拟服务器)设置好了,然后就可以设置真实服务器(Nginx服务器)了。通过命令输入有点麻烦,我们可以编写一个脚本,让它来帮我们处理这些。node3和node4这个两真实服务器都要配置,创建文件vim realserver.sh并添加以下信息:

#!/bin/bash
#description: Config realserver

VIP=192.168.204.221

/etc/rc.d/init.d/functions

case "$1" in
start)
       /sbin/ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP
       /sbin/route add -host $VIP dev lo:0
       echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
       echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
       echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
       echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
       sysctl -p >/dev/null 2>&1
       echo "RealServer Start OK"
       ;;
stop)
       /sbin/ifconfig lo:0 down
       /sbin/route del $VIP >/dev/null 2>&1
       echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
       echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
       echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
       echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
       echo "RealServer Stoped"
       ;;
*)
       echo "Usage: $0 {start|stop}"
       exit 1
esac

exit 0

然后执行这个脚本就可以自动配置了,命令如下:

sh realserver.sh start

然后使用ifconfig查看是否有添加以下网络信息:

lo:0      Link encap:Local Loopback  
          inet addr:192.168.204.221  Mask:255.255.255.255
          UP LOOPBACK RUNNING  MTU:16436  Metric:1

安装完成之后,可以测试是否可以正常工作,如何还没启动Nginx,首先启动Nginx:

service nginx start

需要关闭防火墙:

service iptables stop

最后我们只需要通过虚拟IP地址就可以访问真实服务器了。

http://192.168.204.221

我们可以手动关闭keepalived,观察是否会自动启动备的服务器。这就是keepalived的作用,当主服务器挂了,会自动启动备虚拟服务器来指向真实服务器。

service keepalived stop

反向代理

我们希望是使用Nginx来代理更多的Tomcat服务器,来对用户进行分流,以应对高并发时对单个服务器的压力。所以我们要设置node3和node4的Nginx。

要配置这个反向代理,只要修改一个配置文件就可以了。如下:

vim /opt/sxt/soft/tengine-2.1.0/conf/nginx.conf

我们主要是添加upstream cluster1这个内容,这就是反向代理的服务器IP地址,同时也可以设置健康检查的配置信息。
然后要在server中添加反向代理,还可以创建对各个代理的服务器进行健康检查location /status。其他的地方不用修改。

upstream cluster1 {
    # 服务器访问的路径,可以指定多个服务器
    server 192.168.204.123:8080;
    server 192.168.204.124:8080;

    # 健康检查
    check interval=3000 rise=2 fall=5 timeout=1000 type=http;
    check_http_send "HEAD / HTTP/1.0\r\n\r\n";
    check_http_expect_alive http_2xx http_3xx;
}

server {
    listen       80;
    server_name  localhost;

    # 根目录访问路径
    location / {
        # 指定反向代理,跟上面的名称一样cluster1
        proxy_pass http://cluster1;
        root   html;
        index  index.html index.htm;
    }

    # 健康检查路径
    location /status {
        check_status;
    }
}

修改配置文件之后,需要重启Nginx:

service nginx restart

在访问之前,要确保Tomcat是正常启动了,因为我们是反向代理了Tomcat的服务器,所以需要启动Tomcat服务器。

如果在访问路径的时候加上健康检查的路径/status,就可查看各个服务器的健康问题。

http://192.168.204.123/status
http://192.168.204.124/status

通过访问上面的地址就可以看到类似以下的页面信息:
这里写图片描述

最后我们在正常访问Nginx服务器的时候,就会访问都Tomcat服务器了。而且Nginx是访问到多个Tomcat。
比如笔者只是访问其中的一个Nginx,如下:

http://192.168.204.123

这里写图片描述

这里写图片描述

上面是访问Nginx服务器的IP地址的,我们在安装lvs和keepalived这部分设置了虚拟IP,所以我们可以直接访问这个虚拟IP就可以了。最终网站只需要访问一个IP地址就可以了:

http://192.168.204.221/

这里写图片描述

参考资料

  1. https://blog.csdn.net/u010392801/article/details/52085394
  2. https://blog.csdn.net/u012852986/article/details/52412174
文章来源: 在CentOS上使用Nginx和Tomcat搭建高可用高并发网站

人吐槽 人点赞

猜你喜欢

发表评论

用户名: 密码:
验证码: 匿名发表

你可以使用这些语言

查看评论:在CentOS上使用Nginx和Tomcat搭建高可用高并发网站