一、部署概述
1 概述
版本说明:
WEB服务器名称 | Apache Tomcat |
WEB服务器版本 | Tomcat 7.x for x64 |
JDK | Jdk7.x for x64 |
操作系统 | Centos7 |
负载均衡组 | Nginx |
会话存储 | Redis |
文件同步备份 | rsync+inotify |
高可用检测 | keepalived |
本次部署,程序方面将使用4台Centos7作为服务器,我将它们命名为nginx1.nginx2.tomcat1,tomcat2,同时tomcat1还需要兼会话管理的功能,nginx将使用轮询的方式进行负载均衡。系统的示意图如下:
Nginx的ip分别为192.168.111.101和192.168.111.102它们两个将使用keepalived的使其进行保活,并互相剔除有故障机器。推荐nginx机器不低于4G内存,tomcat的机器不低于8G内存。客户机通过虚IP(192.168.111.100)来访问到当前活动的nginx机器中,nginx根据负载规则,分发到两个不同的tomcat机器,这就是一个请求的经过。
二、安装
1 安装JDK及Tomcat(201,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/tomcat为tomcat根目录 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/可以发现是可以访问的
然后,我把这两个tomcat下新建一个datadriver文件夹,然后建一个index.jsp文件
我分别访问
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 |
第一步,在/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欢迎页面了的
开放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 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下的datadriver的index.jsp文件,201是tomcat1,202是tomcat2
最后访问192.168.111.101\datadriver可以看到,nginx默认的轮换负载均衡是可以使用的,一个是tomcat1的一个是tomcat2的,并且能够保证session不变
然后就是把102机器也搭建上nginx并且和101机器同时提供服务,并且互相监控对方,来实现高可用集群
102安装好nginx后分别在101,102执行,
systemctl enable nginx |
让它开机自启
需要注意的是在安装102nginx的时候需要,把server_name改为虚ip,192.168.111.100,两个机器都改,然后重启nginx,包括上边101所执行的命令,开放端口之类的,102都要执行,最后访问192.168.111.102\datadriver会出现和上边101同样的结果,session不变
在192.168.111.101和192.168.111.102两个机器分别执行下面的命令:
yum -y install keepalived |
配置keepalived
修改192.168.111.101的配置文件/etc/keepalived/keepalived.conf
vi /etc/keepalived/keepalived.conf |
我这里把101当master
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 master的id,在一个网络应该是唯一的 } 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 backup的id,在一个网络应该是唯一的 } 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 |
我准备使用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为第二台服务器IP,src为要监控的路径,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 |
该配置文件是用来接收另一台服务器的文件。其中web是server服务端(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为第二台服务器IP,src为要监控的路径,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
我的笔记博客版权我的笔记博客版权