×

普通的web项目实现tomcat集群和nginx负载均衡以及session共享,文档上传同步的方案

我的笔记 我的笔记 发表于2019-04-12 10:46:47 浏览6492 评论2

2人参与发表评论

一、部署概述

1 概述

版本说明:

WEB服务器名称

Apache Tomcat

WEB服务器版本

Tomcat 7.x for x64

JDK

Jdk7.x for x64

操作系统

Centos7 

负载均衡组

Nginx

会话存储

Redis

文件同步备份

rsync+inotify

高可用检测

keepalived

本次部署,程序方面将使用4Centos7作为服务器,我将它们命名为nginx1.nginx2.tomcat1,tomcat2,同时tomcat1还需要兼会话管理的功能,nginx将使用轮询的方式进行负载均衡。系统的示意图如下:





图片1.png

 


 

 

 

Nginxip分别为192.168.111.101192.168.111.102它们两个将使用keepalived的使其进行保活,并互相剔除有故障机器。推荐nginx机器不低于4G内存,tomcat的机器不低于8G内存。客户机通过虚IP192.168.111.100)来访问到当前活动的nginx机器中,nginx根据负载规则,分发到两个不同的tomcat机器,这就是一个请求的经过。

安装

1 安装JDKTomcat201,202机器)

1.1 下载配置JDK

cd /opt

从下面网页中下载jdk1.7,并上传到opt目录

https://www.oracle.com/technetwork/java/javase/downloads/java-archive-downloads-javase7-521261.html

解压

tar -xzvf jdk-7u80-linux-x64.tar.gz

使用vi命令打开系统的环境变量配置文件:

vi /etc/profile

profile文件最后加入:

export JAVA_HOME=/opt/jdk1.7.0_80

export PATH=$PATH:$JAVA_HOME/bin

使配置生效

source /etc/profile

最后

java –version

 

1.2 Tomcat安装

安装tomcat,同样进入opt目录

cd /opt

wget http://mirror.bit.edu.cn/apache/tomcat/tomcat-7/v7.0.93/bin/apache-tomcat-7.0.93.tar.gz

(如果不能wget,先安装wget,yum install wget

tar -zxvf apache-tomcat-7.0.93.tar.gz

tomcat注册为服务

vi /etc/systemd/system/tomcat.service

内容如下:

# Systemd unit file for tomcat

[Unit]

Description=Apache Tomcat Web Application Container

After=syslog.target network.target

 

[Service]

Type=forking

# /opt/tomcattomcat根目录

Environment=JAVA_HOME=/opt/jdk1.7.0_80

Environment=CATALINA_PID=/opt/apache-tomcat-7.0.93/temp/tomcat.pid

Environment=CATALINA_HOME=/opt/apache-tomcat-7.0.93

Environment=CATALINA_BASE=/opt/apache-tomcat-7.0.93

Environment='CATALINA_OPTS=-Xms512M -Xmx1024M -server -XX:+UseParallelGC'

Environment='JAVA_OPTS=-Djava.awt.headless=true -Djava.security.egd=file:/dev/./urandom'

 

ExecStart=/opt/apache-tomcat-7.0.93/bin/startup.sh

ExecStop=/bin/kill -15 $MAINPID

 

User=root

Group=root

UMask=0007

RestartSec=10

Restart=always

[Install]

WantedBy=multi-user.target

加载服务

systemctl daemon-reload

现在可以通过systemctl命令启动tomcat

systemctl start tomcat

检查服务运行状态

systemctl status tomcat

如果想让tomcat服务随服务器自动启动,执行以下命令

systemctl enable tomcat

Ps:因为为了安全考虑,这四台服务器的防火墙是开着的,所以8080端口需要开放:

首先看一下是不是正在运行防火墙

systemctl status firewalld.service

开放8080端口

firewall-cmd --zone=public --add-port=8080/tcp --permanent

重启防火墙

systemctl restart firewalld.service

重新载入配置

firewall-cmd --reload

我分别访问http://192.168.111.201:8080/http://192.168.111.202:8080/可以发现是可以访问的

wps2.jpg 

wps3.jpg 

然后,我把这两个tomcat下新建一个datadriver文件夹,然后建一个index.jsp文件

我分别访问

wps4.jpg 

 

2 会话共享(Session)(201机器

2.1 Redis安装

设置Redis的仓库地址

yum install epel-release

安装redis

yum install redis

 修改配置文件,监听所有的IP地址

vi   /etc/redis.conf

找到下面这一行

bind 127.0.0.1

注释掉

#bind 127.0.0.1

启动redis,到此完成

systemctl restart redis

systemctl enable redis

通过配置文件进行配置

yum方式安装的redis配置文件通常在/etc/redis.conf中,打开配置文件找到

#requirepass foobared

去掉行前的注释,并修改密码为所需的密码,保存文件

requirepass youpwd

systemctl restart redis

链接客户端

redis-cli -h 127.0.0.1 -p 6379 -a 123456

开放6379端口

firewall-cmd --zone=public --add-port=6379/tcp --permanent

重启防火墙

systemctl restart firewalld.service

重新载入配置

firewall-cmd --reload

3 Nginx安装

3.1安装PCRE

下载 PCRE 安装包,下载地址:(如果直接查看版本,高于3.2可以不用安装,有时候centos自带)

cd /usr/src

wget http://downloads.sourceforge.net/project/pcre/pcre/8.35/pcre-8.35.tar.gz

解压安装包

tar -zxvf pcre-8.35.tar.gz

cd pcre-8.35

编译安装

./configure

make && make install

查看pcre版本

pcre-config --version

 

3.2安装Nginx

第一步,在/etc/yum.repos.d/目录下创建一个源配置文件nginx.repo

cd /etc/yum.repos.d/

vim nginx.repo

填写如下内容:

[nginx]

name=nginx repo

baseurl=http://nginx.org/packages/centos/7/$basearch/

gpgcheck=0

enabled=1

保存,则会产生一个/etc/yum.repos.d/nginx.repo文件。

下面直接执行如下指令即可自动安装好Nginx

yum install nginx -y

安装完成,下面直接就可以启动Nginx了:

systemctl start nginx

现在Nginx已经启动了,直接访问服务器就能看到Nginx欢迎页面了的

wps5.jpg 

开放80端口

firewall-cmd --zone=public --add-port=80/tcp --permanent

重启防火墙

systemctl restart firewalld.service

重新载入配置

firewall-cmd --reload

修改配置文件/etc/nginx/nginx.conf

vi /etc/nginx/nginx.conf

http{}中加入

#负载均衡组

upstream myServer{  

server 192.168.111.201:8080 weight=1;

server 192.168.111.202:8080 weight=1;

}

server {  

listen 80;

server_name 192.168.111.100; #如果是集群环境,此处换成虚ip 192.168.111.100

location / {  

 proxy_pass http://myServer;

 #这个必须设置 否则访问有问题
        proxy_set_header Host        $host:$server_port;    # 如果不配这个 ,jscss 文件无法访问

proxy_set_header   X-Real-IP        $remote_addr;

      proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;

      proxy_set_header Cookie $http_cookie;

      log_subrequest on;

}

}

 

我这里先在101机器上搭建单机版nginx

后来发现不管我怎么访问都是502错误,再查了各种资料,解决办法是在101上执行

/usr/sbin/setsebool -P httpd_can_network_connect=1

摘自:

https://stackoverflow.com/questions/25235453/nginx-proxy-server-localhost-permission-denied

我编辑了tomcat下的datadriverindex.jsp文件,201tomcat1202tomcat2

wps6.jpg 

最后访问192.168.111.101\datadriver可以看到,nginx默认的轮换负载均衡是可以使用的,一个是tomcat1的一个是tomcat2的,并且能够保证session不变

wps7.jpg 

wps8.jpg 

然后就是把102机器也搭建上nginx并且和101机器同时提供服务,并且互相监控对方,来实现高可用集群

102安装好nginx后分别在101,102执行,

systemctl enable nginx

 

让它开机自启

需要注意的是在安装102nginx的时候需要,把server_name改为虚ip192.168.111.100,两个机器都改,然后重启nginx,包括上边101所执行的命令,开放端口之类的,102都要执行,最后访问192.168.111.102\datadriver会出现和上边101同样的结果,session不变

wps9.jpg 

 

3.3安装Keepalived

192.168.111.101192.168.111.102两个机器分别执行下面的命令:

yum -y install keepalived

配置keepalived

 修改192.168.111.101的配置文件/etc/keepalived/keepalived.conf

vi /etc/keepalived/keepalived.conf

我这里把101master

global_defs {

    notification_email {

        1416136299@qq.com

    }

    notification_email_from sns-lvs@gmail.com

    smtp_server smtp.hysec.com

    smtp_connection_timeout 30

    router_id nginx_master        # 设置nginx masterid,在一个网络应该是唯一的

}

vrrp_script chk_http_port {

    script "/usr/local/check_nginx_pid.sh"    #最后手动执行下此脚本,以确保此脚本能够正常执行

    interval 2                          #(检测脚本执行的间隔,单位是秒)

    weight 2

}

vrrp_instance VI_1 {

    state MASTER            # 指定keepalived的角色,MASTER为主,BACKUP为备

    interface eth0            # 当前进行vrrp通讯的网络接口卡(当前centos的网卡)

    virtual_router_id 51        # 虚拟路由编号,主从要一直

    priority 100            # 优先级,数值越大,获取处理请求的优先级越高

    advert_int 1            # 检查间隔,默认为1s(vrrp组播周期秒数)

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    track_script {

    chk_http_port            #(调用检测脚本)

    }

    virtual_ipaddress {

        192.168.111.100            # 定义虚拟ip(VIP),可多设,每行一个

    }

}

同样,修改102机器上配置文件/etc/keepalived/keepalived.conf,可以看到,只有一处不同,一个是master,一个是backup

global_defs {

    notification_email {

        1416136299@qq.com

    }

    notification_email_from sns-lvs@gmail.com

    smtp_server smtp.hysec.com

    smtp_connection_timeout 30

    router_id nginx_backup              # 设置nginx backupid,在一个网络应该是唯一的

}

vrrp_script chk_http_port {

    script "/usr/local/check_nginx_pid.sh"

    interval 2                          #(检测脚本执行的间隔)

    weight 2

}

vrrp_instance VI_1 {

    state BACKUP                        # 指定keepalived的角色,MASTER为主,BACKUP为备

    interface eth0                      # 当前进行vrrp通讯的网络接口卡(当前centos的网卡)

    virtual_router_id 51               # 虚拟路由编号,主从要一直

    priority 99                         # 优先级,数值越大,获取处理请求的优先级越高

    advert_int 1                        # 检查间隔,默认为1s(vrrp组播周期秒数)

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    track_script {

        chk_http_port                   #(调用检测脚本)

    }

    virtual_ipaddress {

        192.168.111.100                   # 定义虚拟ip(VIP),可多设,每行一个

    }

}

以下是针对nginx状态进行检测的脚本,第一次nginx服务死掉时,会重新启动,如果Nginx服务无法正常启动,则杀掉keepalived进程

vi /usr/local/check_nginx_pid.sh

内容如下

#!/bin/bash

A=`ps -C nginx --no-header |wc -l`

if [ $A -eq 0 ];then

systemctl restart nginx

if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then

killall keepalived

fi

fi

101,102分别执行

systemctl restart keepalived

systemctl enable keepalived

4 文件同步(201,202机器)

4.1 安装rsync+inotify

我准备使用rsync+inotify来解决文件同步的问题,这两个工具结合能实现实时双向同步文件,任意一台tomcat下的文件发生改变,另一台就会同步。

两台机器分别执行

开机自启赋权

chmod +x /etc/rc.d/rc.local

开放873端口

firewall-cmd --zone=public --add-port=873/tcp --permanent

重启防火墙

systemctl restart firewalld.service

重新载入配置

firewall-cmd --reload

yum -y install zlib zlib-devel pcre pcre-devel gcc gcc-c++ openssl openssl-devel libevent libevent-devel perl unzip net-tools wget

下载所需的安装包:

        先把两个包放在/usr/src/

rsync下载路径:wget http://rsync.samba.org/ftp/rsync/src/rsync-3.0.9.tar.gz

inotify下载路径:https://pan.baidu.com/s/1jIRLiei

第一台服务器(192.168.111.201)配置(不分主次)

安装rsync:

cd /usr/src/

tar zxvf rsync-3.0.9.tar.gz

cd rsync-3.0.9

mkdir /usr/local/rsync

./configure --prefix=/usr/local/rsync

make

make install

cd /usr/local/rsync/

创建密码认证文件:

echo "123456" >/usr/local/rsync/rsync1.passwd

echo "webuser:123456" >/usr/local/rsync/rsync1_1.passwd

给密码文件赋予600权限:

chmod 600 rsync1.passwd

chmod 600 rsync1_1.passwd

安装inotify:

cd /usr/src/

tar zxvf inotify-tools-3.14.tar.gz

cd inotify-tools-3.14

./configure --prefix=/usr/local/inotify

make

make install

创建监控脚本:

vi /root/rsync1.sh

#!/bin/bash

#警告:当在企业项目中两个项目相互同步时,请把delete参数删掉,下边两个命令中都要删除,他们代表删除客户端无用文件,但在实践中它们会互相删除新上传的文件

host=192.168.111.202

src=/opt/test/

des=web

user=webuser

cd ${src}

/usr/local/inotify/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e modify,delete,create,attrib,move ./ | while read files

do

/usr/local/rsync/bin/rsync -vzrtopg --delete --progress --password-file=/usr/local/rsync/rsync1.passwd $src $user@$host::$des

done

注意:host为第二台服务器IPsrc为要监控的路径,web是认证模块名称,最后把监控脚本命名为rsync1.sh放在要监控的路径下。此处应是/root/

给监控脚本赋予764权限:

chmod 764 /root/rsync1.sh

创建rsync配置文件:

vi /usr/local/rsync/rsync1.conf

 

uid = root

gid = root

use chroot = no

max connections = 10

strict modes = yes

pid file = /var/run/rsyncd.pid

lock file = /var/run/rsync.lock

log file = /var/log/rsyncd.log

hosts allow = 192.168.111.202

hosts deny = *

[web]

path = /opt/test/

comment = web file

ignore errors

read only = no

write only = no

list = false

auth users = webuser 

secrets file = /usr/local/rsync/rsync1_1.passwd

该配置文件是用来接收另一台服务器的文件。其中webserver服务端(90服务器)的认证模块名称,需要与90服务器里的一致。把配置文件命名为rsync1.conf,放到/usr/local/rsync/目录里

启动该配置文件

/usr/local/rsync/bin/rsync --daemon --config=/usr/local/rsync/rsync1.conf

需要开机启动的话:

echo "/usr/local/rsync/bin/rsync --daemon --config=/usr/local/rsync/rsync1.conf" >> /etc/rc.local

第二台服务器(192.168.111.202)配置(不分主次)

安装rsync:

cd /usr/src/

tar zxvf rsync-3.0.9.tar.gz

cd rsync-3.0.9

mkdir /usr/local/rsync

./configure --prefix=/usr/local/rsync

make

make install

cd /usr/local/rsync/

创建密码认证文件:

echo "123456" >/usr/local/rsync/rsync2.passwd

echo "webuser:123456" >/usr/local/rsync/rsync2_1.passwd

给密码文件赋予600权限:

chmod 600 rsync1.passwd

chmod 600 rsync1_1.passwd

安装inotify:

cd /usr/src/

tar zxvf inotify-tools-3.14.tar.gz

cd inotify-tools-3.14

./configure --prefix=/usr/local/inotify

make

make install

创建监控脚本:

vi /root/rsync2.sh

#!/bin/bash

#警告:当在企业项目中两个项目相互同步时,请把delete参数删掉,下边两个命令中都要删除,他们代表删除客户端无用文件,但在实践中它们会互相删除新上传的文件

host=192.168.111.201

src=/opt/test/

des=web

user=webuser

cd ${src}

/usr/local/inotify/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e modify,delete,create,attrib,move ./ | while read files

do

/usr/local/rsync/bin/rsync -vzrtopg --delete --progress --password-file=/usr/local/rsync/rsync2.passwd $src $user@$host::$des

done

注意:host为第二台服务器IPsrc为要监控的路径,web是认证模块名称,最后把监控脚本命名为rsync2.sh放在要监控的路径下。此处应是/root/

给监控脚本赋予764权限:

chmod 764 /root/rsync2.sh

创建rsync配置文件:

vi /usr/local/rsync/rsync2.conf

 

uid = root

gid = root

use chroot = no

max connections = 10

strict modes = yes

pid file = /var/run/rsyncd.pid

lock file = /var/run/rsync.lock

log file = /var/log/rsyncd.log

hosts allow = 192.168.111.201

hosts deny = *

[web]

path = /opt/test/

comment = web file

ignore errors

read only = no

write only = no

list = false

auth users = webuser 

secrets file = /usr/local/rsync/rsync2_1.passwd

启动该配置文件

/usr/local/rsync/bin/rsync --daemon --config=/usr/local/rsync/rsync1.conf

需要开机启动的话:

echo "/usr/local/rsync/bin/rsync --daemon --config=/usr/local/rsync/rsync1.conf" >> /etc/rc.local

最后启动两台服务器的监控脚本:

  201服务器:  

sh /root/rsync1.sh &

 需要开机启动的话:

echo "/root/rsync1.sh &" >> /etc/rc.local

202服务器:

sh /root/rsync2.sh &

需要开机启动的话:

echo "/root/rsync2.sh &" >> /etc/rc.local

文件同步常见解决方案,如果上边出现问题,下边能解决

https://www.jb51.net/article/31920.htm

我的笔记博客版权我的笔记博客版权