分享一例测试环境下nginx+tomcat的视频业务部署记录
在日常运维中,我们通常会利用shell的"function函数+if逻辑判断+case选择语句"来实现中间件服务一键部署或一键启停。下面分享几个常用运维的一键脚本:
一、Tomcat一键启停服务脚本 [如有多个tomcat实例,就在/etc/init.d/下配置多个针对每个tomcat端口的启停脚本。下面为tomcat_8080脚本文件]
#!/bin/bash
#chkconfig: 345 99 10
#description: Auto-starts tomcat
# /etc/init.d/tomcatd
# Tomcat auto-start # Source function library.
source /etc/init.d/functions
# source networking configuration.
#. /etc/sysconfig/network RETVAL=0
project_tomcat=tomcat_8080
#这里的tomcat采用结尾以端口号方式命令。即tomcat_port
#如果本机由多个tomcat示例,则这种结尾以端口号命名的方式比较好, #执行"echo $JAVA_HOME"可以查看到本机JAVA主目录路径
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.232.b09-0.el7_7.x86_64/ export CATALINA_HOME=/usr/local/${project_tomcat}
#export CATALINA_BASE=/usr/local/${project_tomcat} #(centos7系统)重新加载服务配置文件。只有当该脚本被修改的时候需要执行该项,可以不配置。
systemctl daemon-reload
#TOMCATUSER=tomcat
start()
{
if [ -f ${CATALINA_HOME}/bin/startup.sh ];
then
echo $"Starting Tomcat"
#这里tomcat使用root启动的,如果不是root用户启动的,这里就修改下用户。
if [ root = `whoami` ];
then
${CATALINA_HOME}/bin/startup.sh
else
su - root -c "${CATALINA_HOME}/bin/startup.sh"
fi
RETVAL=$?
echo " OK"
return ${RETVAL}
fi
}
stop()
{
if [ -f ${CATALINA_HOME}/bin/shutdown.sh ];
then
echo $"Stopping Tomcat"
${CATALINA_HOME}/bin/shutdown.sh
RETVAL=$?
sleep 1
#ps -ef|grep $project_tomcat|egrep -v 'grep|init'|awk '{print$2}'|xargs kill -9
#egrep -v "grep|init" 的过滤效果等同于 grep -v "grep\|init"
ps -ef|grep ${project_tomcat}|egrep -v 'grep|init' | grep ${CATALINA_HOME}|awk '{print $2}'|xargs kill -9
#下面可根据自己tomcat日志的实际路径进行更改
mv ${CATALINA_HOME}/logs/catalina.out ${CATALINA_HOME}/logs/catalina.out_`date '+%Y%m%d_%H_%M_%S'`
find ${CATALINA_HOME}/logs/ -mtime +10 -exec rm -rf {} \;
echo " OK"
# [ $RETVAL -eq 0 ] && rm -f /var/lock/...
return ${RETVAL}
fi
}
status()
{
#这里tomcat实例名结尾是以端口号命名的。如果实例名中没有显示端口号,则取tomcat端口号如下:
#port=$(cat ${CATALINA_HOME}/conf/server.xml |grep -w 'URIEncoding="UTF-8"'|awk '{print $2}'|cut -d"=" -f2|cut -d"\"" -f2)
port=$(echo ${project_tomcat}|awk -F _ '{print$2}')
#打印"lsof -i:port"结果中第二行的第二列,即是该端口所属服务的pid
pid=$(`which lsof` -i:$port|awk 'NR==2{print$2}')
if [ -z $pid ] #判断${pid}字符串是否为空串,空串为真。
then
#使用下面echo方式会将打印内容标红!
echo -e "\033[40;31m${project_tomcat} is stopped\033[0m"
else
echo ${project_tomcat} is running
fi
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
echo $"Restaring Tomcat"
stop
sleep 1
start
;;
status)
status
;;
*)
echo $"Usage: $0 {start|stop|restart|status}"
exit 1
;;
esac
exit ${RETVAL} 执行脚本:
[root@localhost ~]# /etc/init.d/tomcat_8080
Usage: /etc/init.d/tomcat_8080 {start|stop|restart|status} [root@localhost ~]# chmod 755 /etc/init.d/tomcat_8080 [root@localhost ~]# /etc/init.d/tomcat_8080 restart
Restarting tomcat_8080 (via systemctl): [ OK ] [root@localhost ~]# /etc/init.d/tomcat_8080 status
tomcat_8080 is running [root@localhost ~]# /etc/init.d/tomcat_8080 stop
Stopping tomcat_8080 (via systemctl): [ OK ] [root@localhost ~]# /etc/init.d/tomcat_8080 status
tomcat_8080 is stopped [root@localhost ~]# /etc/init.d/tomcat_8080 start
Starting tomcat_8080 (via systemctl): [ OK ] [root@localhost ~]# /etc/init.d/tomcat_8080 status
tomcat_8080 is running
二、Zookeeper集群环境一键部署脚本 [生产环境中推荐使用该脚本]
[root@bobo zookeeper]# cat install_zookeeper.sh
#!/bin/bash source /etc/profile
java -version
if [ "$?" -ne 0 ]; then
echo "JDK未安装,请先安装JDK"
exit 1
fi
while getopts "a:b:n:l:c:f:m:h" opts
do
case $opts in
a)
#APP_NAME:项目编码
APP_NAME=$OPTARG
;;
b)
#MODULE_NAME:模块名称
MODULE_NAME=$OPTARG
;;
n)
#ZK_SRVNUM:ZOOKEEPER数量
ZK_SRVNUM=$OPTARG
;;
l)
#ZK_IPLIST:ZOOKEEPER服务器IP地址列表
ZK_IPLIST=$OPTARG
;;
c)
#ZKCLIENT_PORT:客户端访问 zookeeper 的端口号
ZKCLIENT_PORT=$OPTARG
;;
f)
#ZKLEADER_PORT:ZOOKEEPER的F和L通信端口号
ZKLEADER_PORT=$OPTARG
;;
m)
#ZKCOM_PORT:ZOOKEEPER选举端口号
ZKCOM_PORT=$OPTARG
;;
h)
echo -e "OPTIONS:\n-a:项目编码(必选)\n-b:模块名称(可选,默认为空)\n-n:ZooKeeper服务器数量(可选,默认为3)"
echo -e "-l:ZooKeeper服务器IP地址列表(必选,IP地址以英文逗号分隔)"
echo -e "-c:Client-Port(可选,默认为2181,多个端口以英文逗号分隔,且与IP地址一一对应)"
echo -e "-f:ZooKeeper的F和L通信端口号(可选,默认为2888,多个端口以英文逗号分隔,且与IP地址一一对应)"
echo -e "-m:ZooKeeper选举端口号(可选,默认为3888,多个端口以英文逗号分隔,且与IP地址一一对应)"
exit 1
;;
?)
echo "missing options,pls check!"
exit 1
;;
esac
done
#可选参数赋值
ZK_SRVNUM=${ZK_SRVNUM:-3}
ZKCLIENT_PORT=${ZKCLIENT_PORT:-2181}
ZKLEADER_PORT=${ZKLEADER_PORT:-2888}
ZKCOM_PORT=${ZKCOM_PORT:-3888}
#定义公共变量
#zookeep安装包存放位置
ZKSAVDIR="/usr/local/src/zookeeper"
#zookeeper安装包名(不带扩展名)
ZKNAME="zookeeper-3.4.8"
#必选参数存在性及参数合法性判断
#if [ -z ${APP_NAME} ]||[ -z ${MODULE_NAME} ]||[ -z ${ZK_IPLIST} ];then
if [ -z ${APP_NAME} ]||[ -z ${ZK_IPLIST} ];then
echo "Missing options,exit"
exit 1
elif [ ${ZK_SRVNUM} -ne 1 ]&&[ ${ZK_SRVNUM} -ne 3 ]&&[ ${ZK_SRVNUM} -ne 5 ];then
echo "Wrong server num,exit"
exit 1
fi
IPLIST_NUM=`echo ${ZK_IPLIST}|awk -F"," '{print NF}'`
if [ ${ZK_SRVNUM} -ne ${IPLIST_NUM} ];then
echo "IP list and server num do not match,exit"
exit 1
fi
APP_NAME=`echo ${APP_NAME} | tr '[A-Z]' '[a-z]'`
#多个端口时判断端口数与IP地址数量是否一致
CPORT_NUM=`echo ${ZKCLIENT_PORT}|awk -F"," '{print NF}'`
LPORT_NUM=`echo ${ZKLEADER_PORT}|awk -F"," '{print NF}'`
EPORT_NUM=`echo ${ZKCOM_PORT}|awk -F"," '{print NF}'`
if [ ${CPORT_NUM} -gt 1 ];then
if [ ${IPLIST_NUM} -ne ${CPORT_NUM} ]||[ ${IPLIST_NUM} -ne ${LPORT_NUM} ]||[ ${IPLIST_NUM} -ne ${EPORT_NUM} ];then
echo "IP list and Port list number do not match,exit"
exit 1
fi
#获取IP地址和端口对应关系
rm -f /home/workapp/zkinfo.cfg
for ((i=1;i<=${ZK_SRVNUM};i++)); do
eval IP_$i='`echo ${ZK_IPLIST}|awk -F, "{ print $"$i" }"`'
eval PORT_$i='`echo ${ZKCLIENT_PORT}|awk -F, "{ print $"$i" }"`'
eval LPORT_$i='`echo ${ZKLEADER_PORT}|awk -F, "{ print $"$i" }"`'
eval EPORT_$i='`echo ${ZKCOM_PORT}|awk -F, "{ print $"$i" }"`'
# eval echo "server.${i}=\$IP_$i:${ZKLEADER_PORT}:${ZKCOM_PORT}">>${ZKHOME}/conf/zoo.cfg
# eval IPTMP=\$IP_$i
eval PORTTMP=\$PORT_$i
#zookeeper HOME路径
[ -z ${MODULE_NAME} ]&&eval ZKHOME="/opt/${APP_NAME}/zookeeper_\$PORT_$i"||eval ZKHOME="/opt/${APP_NAME}/zookeeper_${MODULE_NAME}_\$PORT_$i"
#zookeeper日志存储路径
[ -z ${MODULE_NAME} ]&&eval DATA_LOGDIR="/var/log/${APP_NAME}/zookeeper_\$PORT_$i"||eval DATA_LOGDIR="/var/log/${APP_NAME}/zookeeper_${MODULE_NAME}_\$PORT_$i"
#zookeeper数据存储路径
DATA_DIR="${ZKHOME}/data"
#生成参数列表
eval echo "$i,\$IP_$i,\$PORT_$i,\$LPORT_$i,\$EPORT_$i,${ZKHOME},${DATA_LOGDIR},${DATA_DIR}">>/home/workapp/zkinfo.cfg
done
cat /home/workapp/zkinfo.cfg
else
#zookeeper HOME路径
[ -z ${MODULE_NAME} ]&&ZKHOME="/opt/${APP_NAME}/zookeeper"||ZKHOME="/opt/${APP_NAME}/zookeeper_${MODULE_NAME}"
echo "ZKHOME is ${ZKHOME}"
#zookeeper日志存储路径
[ -z ${MODULE_NAME} ]&&DATA_LOGDIR="/var/log/${APP_NAME}/zookeeper"||DATA_LOGDIR="/var/log/${APP_NAME}/zookeeper_${MODULE_NAME}"
echo "ZK log dir is ${DATA_LOGDIR}"
#zookeeper数据存储路径
DATA_DIR="${ZKHOME}/data"
echo "ZK data dir is ${DATA_DIR}"
fi
#安装日志
INSTALL_LOG="/home/workapp/zookeeperinstall.log"
#打印变量值
echo "APP_NAME is ${APP_NAME}"|tee -a ${INSTALL_LOG}
echo "MODULE_NAME is ${MODULE_NAME}"|tee -a ${INSTALL_LOG}
echo "ZK_Server_num is ${ZK_SRVNUM}"|tee -a ${INSTALL_LOG}
echo "ZK_Server IP is ${ZK_IPLIST}"|tee -a ${INSTALL_LOG}
echo "ZK_Client Port is ${ZKCLIENT_PORT}"|tee -a ${INSTALL_LOG}
echo "ZK_Leader Port is $ZKLEADER_PORT"|tee -a ${INSTALL_LOG}
echo "ZK_COM Port is ${ZKCOM_PORT}"|tee -a ${INSTALL_LOG}
#获取本机IP地址
HOST_IP=`ip a|grep global|awk '{print $2}'|awk -F"/" '{print $1}'`
echo "Local IP is ${HOST_IP}"|tee -a ${INSTALL_LOG}
#安装包MD5校验
md5Now=`md5sum ${ZKSAVDIR}/${ZKNAME}.tar.gz|awk '{print $1}'`
md5Save=`cat ${ZKSAVDIR}/${ZKNAME}.tar.gz.md5`
if [ "${md5Now}" != "${md5Save}" ];then
echo "MD5 check Failed!"|tee -a ${INSTALL_LOG}
echo "the md5 now is ${md5Now}"|tee -a ${INSTALL_LOG}
echo "the md5 saved is ${md5Save}"|tee -a ${INSTALL_LOG}
exit 1
else
echo "MD5 check success!"|tee -a ${INSTALL_LOG}
fi
#安装zookeeper
function Install_zk {
echo "=================`date '+%Y%m%d %H:%M:%S'`Start Install ZooKeeper....==============="|tee -a ${INSTALL_LOG}
#解压缩安装包至项目编码安装路径
if [ ! -e /opt/${APP_NAME}/ ]; then
mkdir -p /opt/${APP_NAME}
fi
tar -xzf ${ZKSAVDIR}/${ZKNAME}.tar.gz -C /opt/${APP_NAME}/
mv /opt/${APP_NAME}/${ZKNAME} ${ZKHOME}
mkdir -p ${DATA_DIR}
mkdir -p ${DATA_LOGDIR}
cp ${ZKHOME}/conf/zoo_sample.cfg ${ZKHOME}/conf/zoo.cfg
#客户化zoo.cfg配置
sed -i "s/clientPort=2181/clientPort=${ZKCLIENT_PORT}/g" ${ZKHOME}/conf/zoo.cfg
sed -i "s#dataDir=/tmp/zookeeper#dataDir=${DATA_DIR}#g" ${ZKHOME}/conf/zoo.cfg
sed -i "/dataLogDir/s/^/#/" ${ZKHOME}/conf/zoo.cfg
echo "dataLogDir=${DATA_LOGDIR}" >>${ZKHOME}/conf/zoo.cfg
#修改zookeeper-env.sh,指定运行日志zookeeper.log路径
sed -i "s#/var/log/zookeeper#${DATA_LOGDIR}#g" ${ZKHOME}/conf/zookeeper-env.sh
#修改java.env,设置jvm参数,指定gc日志路径
sed -i "s#/var/log/zookeeper#${DATA_LOGDIR}#g" ${ZKHOME}/conf/java.env
#服务器数量为3个或5个为集群模式
if [ ${ZK_SRVNUM} -eq 3 ]||[ ${ZK_SRVNUM} -eq 5 ];then
#根据端口数量判断安装方式
if [ ${CPORT_NUM} -eq 1 ];then
#拆分IP地址列表,获取本机ZK_ID
for ((i=1;i<=${ZK_SRVNUM};i++));do
eval IP_$i='`echo ${ZK_IPLIST}|awk -F, "{ print $"$i" }"`'
# eval echo \$IP_$i
eval IPTMP=\$IP_$i
eval echo "server.${i}=\$IP_$i:${ZKLEADER_PORT}:${ZKCOM_PORT}">>${ZKHOME}/conf/zoo.cfg
if [ "$HOST_IP" == "$IPTMP" ];then
#当列表中的IP地址等于本机地址时,获取当前i值作为ID
ZK_ID=${i}
else
continue
fi
done
else
ZK_ID=${NUM}
while read ZK_INFO;do
echo ${ZK_INFO}|awk -F, '{print "server."$1"="$2":"$4":"$5}'>>${ZKHOME}/conf/zoo.cfg
done</home/workapp/zkinfo.cfg
fi
#客户化myid
echo "${ZK_ID}" >${DATA_DIR}/myid
echo "zookeeper ID is ${ZK_ID}"|tee -a ${INSTALL_LOG}
fi
chown -R workapp:workapp ${ZKHOME}
chown -R workapp:workapp ${DATA_LOGDIR}
cat ${ZKHOME}/conf/zoo.cfg
}
function Check_install {
retval=$?
if [ $retval -eq 0 ];then
echo "`date '+%Y%m%d %H:%M:%S'` zookeeper install SUCCESS!|${APP_NAME} ${MODULE_NAME} ${HOST_IP} ${ZKCLIENT_PORT} ${ZK_ID}|0"|tee -a ${INSTALL_LOG}
else
echo "`date '+%Y%m%d %H:%M:%S'` zookeeper install FAILED!|${APP_NAME} ${MODULE_NAME} ${HOST_IP} ${ZKCLIENT_PORT} ${ZK_ID}|1"|tee -a ${INSTALL_LOG}
fi
}
function Start_check {
su - workapp -c "sh ${ZKHOME}/bin/zkServer.sh start"
sleep 10
su - workapp -c "sh ${ZKHOME}/bin/zkServer.sh status"
netstat -anp|grep ${ZKCLIENT_PORT}
}
#根据端口数量判断安装方式,1个端口为standalone或集群模式,正常安装;
if [ ${CPORT_NUM} -eq 1 ];then
Install_zk
Check_install
Start_check
else
#多个端口为伪集群模式,读取zkinfo.cfg文件
while read ZK_INFO;do
NUM=`echo ${ZK_INFO}|awk -F, '{print $1}'`
IP=`echo ${ZK_INFO}|awk -F, '{print $2}'`
ZKCLIENT_PORT=`echo ${ZK_INFO}|awk -F, '{print $3}'`
ZKHOME=`echo ${ZK_INFO}|awk -F, '{print $6}'`
DATA_LOGDIR=`echo ${ZK_INFO}|awk -F, '{print $7}'`
DATA_DIR=`echo ${ZK_INFO}|awk -F, '{print $8}'`
if [ "$IP" == "$HOST_IP" ];then
Install_zk
Check_install
Start_check
else
continue
fi
done</home/workapp/zkinfo.cfg
fi
rm -f /home/workapp/zkinfo.cfg
查看脚本帮助信息
install_zookeeper.sh脚本用于一键安装zookeeper,支持单实例部署或者3台/5台服务器集群 执行方式:
bash install_zookeeper.sh -a [option] [-b option] -l [option] [-n option] [-c option] [-f option] [-m option] 参数说明:
通过"bash install_zookeeper.sh -h" 命令可以显示参数说明
OPTIONS:
-a:项目编码(必选)
-b:模块名称(可选,默认为空)
-n:ZooKeeper服务器数量(可选,默认为3)
-l:ZooKeeper服务器IP地址列表(必选,格式为以英文逗号[,]分隔的IP地址,如为standalone模式,填写一个IP地址,如为伪集群模式,需填写三个IP地址且与端口号一一对应)
-c:Client-Port(可选,默认为2181,如有多个端口,需与IP地址列表一一对应,格式为以英文逗号[,]分隔)
-f:ZooKeeper的Follower和Leader间通信端口号(可选,默认为2888,如有多个端口,需与IP地址列表一一对应,格式为以英文逗号[,]分隔)
-m:ZooKeeper选举端口号(可选,默认为3888,如有多个端口,需与IP地址列表一一对应,格式为以英文逗号[,]分隔) ================================================================================================
[root@bobo zookeeper]# bash install_zookeeper.sh -h
java version "1.8.0_51"
Java(TM) SE Runtime Environment (build 1.8.0_51-b16)
Java HotSpot(TM) 64-Bit Server VM (build 25.51-b03, mixed mode)
OPTIONS:
-a:项目编码(必选)
-b:模块名称(可选,默认为空)
-n:ZooKeeper服务器数量(可选,默认为3)
-l:ZooKeeper服务器IP地址列表(必选,IP地址以英文逗号分隔)
-c:Client-Port(可选,默认为2181,多个端口以英文逗号分隔,且与IP地址一一对应)
-f:ZooKeeper的F和L通信端口号(可选,默认为2888,多个端口以英文逗号分隔,且与IP地址一一对应)
-m:ZooKeeper选举端口号(可选,默认为3888,多个端口以英文逗号分隔,且与IP地址一一对应)
举例说明(可以通过该脚本部署如下四个场景的zookeeper服务环境,安装后zookeeper服务默认启动)
[root@bobo zookeeper]# pwd
/usr/local/src/zookeeper
[root@bobo zookeeper]# ll
total 21760
-rwxr-xr-x 1 root root 10711 Nov 13 16:45 install_zookeeper.sh
-rw-r--r-- 1 root root 22264081 Jun 12 15:44 zookeeper-3.4.8.tar.gz
-rw-r--r-- 1 root root 33 Nov 13 16:46 zookeeper-3.4.8.tar.gz.md5 [root@bobo zookeeper]# md5sum zookeeper-3.4.8.tar.gz
81adbad1f9f2f3c1061f19c26bff9ce4 zookeeper-3.4.8.tar.gz [root@bobo zookeeper]# cat zookeeper-3.4.8.tar.gz.md5
81adbad1f9f2f3c1061f19c26bff9ce4 该脚本执行的前提是:
1. 脚本中已经定义了zookeep安装包存放位置和安装包名,这些要提前准备好
#zookeep安装包存放位置
ZKSAVDIR="/usr/local/src/zookeeper"
#zookeeper安装包名(不带扩展名)
ZKNAME="zookeeper-3.4.8" zookeeper的安装包要和部署脚本在同一个目录路径下(比如这里都放在脚本定义的/usr/local/src/zookeeper目录下)
检查zookeeper的tar包的md5值,这里是zookeeper-3.4.8.tar.gz.md5 2. webapp用户要存在(这个可以根据自己机器的实际情况进行修改) ======================================================================================================================
举例如下: 1)在172.16.60.210,172.16.60.211,172.16.60.212 三台服务器上为项目编码为test的应用安装zookeeper,端口默认。(三台机器上都执行下面命令)
[root@bobo zookeeper]# bash install_zookeeper.sh -a test -l "172.16.60.210,172.16.60.211,172.16.60.212" 2)在172.16.60.210,172.16.60.211,172.16.60.212,172.16.60.213,172.16.60.214五台服务器上为项目编码为ketest的kemodu模块安装zookeeper,Client端口为3000。(五台机器上都执行下面命令)
[root@bobo zookeeper]# bash install_zookeeper.sh -a ketest -b kemodu -n 5 -l "172.16.60.210,172.16.60.211,172.16.60.212,172.16.60.213,172.16.60.214" -c 3000 3)在172.16.60.210上为项目编码为test的应用安装zookeeper,模式为standalone,端口为22281。(172.16.60.210机器上执行下面命令)
[root@bobo zookeeper]# bash install_zookeeper.sh -a test -n 1 -l "172.16.60.210" -c 22281 4)在172.16.60.210上为项目编码为test的应用安装zookeeper伪集群,客户端口为2181,2281,2381, 通信端口为2188,2288,2388,选举端口为3181,3281,3381。(172.16.60.210机器上执行下面命令)
[root@bobo zookeeper]# bash install_zookeeper.sh -a test -n 3 -l "172.16.60.210,172.16.60.210,172.16.60.210" -c"2181,2281,2381" -f "2188,2288,2388" -m "3181,3281,3381" ======================================================================================================================= 注意:
1. 在单台机器上部署伪静态集群时,参数要写全,即-a、-n、-l、-c、-f、-m都要在命令中写上,否则会报错如下:
"IP list and server num do not match,exit"!! 2. 如果部署后发现zookeeper服务没有起来,可以查看日志,日志路径在zoo.cfg文件里配置。如下: [root@bobo conf]# cat zoo.cfg |grep dataLogDir
dataLogDir=/var/log/test/zookeeper_2181 [root@bobo conf]# cat /var/log/test/zookeeper_2181/zookeeper.out
Unrecognized VM option 'MetaspaceSize=256m'
Could not create the Java virtual machine. 有上面日志可以看出,zookeeper一键安装后,服务没有起来的原因是:jdk版本问题
将当前jdk版本调整到jdk1.8即可! 解决办法:
[root@bobo conf]# java -version
java version "1.6.0_41"
OpenJDK Runtime Environment (IcedTea6 1.13.13) (rhel-1.13.13.1.el7_3-x86_64)
OpenJDK 64-Bit Server VM (build 23.41-b41, mixed mode) [root@bobo conf]# rpm -qa|grep jdk
java-1.6.0-openjdk-1.6.0.41-1.13.13.1.el7_3.x86_64
java-1.6.0-openjdk-demo-1.6.0.41-1.13.13.1.el7_3.x86_64
java-1.6.0-openjdk-devel-1.6.0.41-1.13.13.1.el7_3.x86_64
java-1.6.0-openjdk-javadoc-1.6.0.41-1.13.13.1.el7_3.x86_64
java-1.6.0-openjdk-src-1.6.0.41-1.13.13.1.el7_3.x86_64 [root@bobo conf]# yum -y remove java-1.6.0-openjdk*
[root@bobo conf]# yum -y remove tzdata-java.noarch [root@bobo conf]# java -version
-bash: /usr/bin/java: No such file or directory [root@bobo conf]# yum -y install java-1.8.0-openjdk* [root@bobo conf]# java -version
openjdk version "1.8.0_232"
OpenJDK Runtime Environment (build 1.8.0_232-b09)
OpenJDK 64-Bit Server VM (build 25.232-b09, mixed mode) 再次启动zookeeper服务就OK了!
三、集成多个中间件服务的一键部署脚本 [这里只列举了nginx、apache和mysql一键部署,如有其他中间件部署需求,可自行添加进去]
#!/bin/bash
# Date: 2018-09-08
# Mail: kevin@163.com
# Founder: kevin
# Describe: This is a one - button installation service script
function CDAN(){
cat << One_button_install
+------------------------------------------------+
| |
| _o0o_ 1. 安装Nginx |
| 08880 2. 安装Apache |
| 88"."88 3. 安装MySQL |
| (|-_-|) 4. 安装PHP |
| 0\=/0 5. 部署LNMP环境 |
| __/ \__ 6. 安装zabbix监控 |
| ‘\ ///‘ 7. 退出此管理程序 |
| / Linux一键 \ 8. 关闭计算机 |
| || Server || ================================|
| \ //// 一键安装服务 |
| ||| i i i ||| by Kevin |
| ___ ___ ================================|
|___‘. /--.--\ .‘___ |
+------------------------------------------------+
One_button_install
}
CDAN source /etc/init.d/functions
BASE_DIR=/usr/local/src
read -p "请您输入1-8任意字符:" NUM
expr $NUM + 1 >/dev/null 2>&1
if [ "$?" -ne 0 ]
then
echo "请您输入{1|2|3|4|5|6|7|8}"
exit 1
fi function Nginx_server (){
echo "开始安装Nginx,请喝杯咖啡,耐心等待一段时间...."
yum install -y gcc gcc-c++ pcre-devel zlib-devel openssl-devel >/dev/null 2>&1
cd $BASE_DIR
wget http://nginx.org/download/nginx-1.12.2.tar.gz >/dev/null 2>&1
useradd -M -s /sbin/nologin nginx
tar -zvxf nginx-1.12.2.tar.gz >/dev/null 2>&1
cd $BASE_DIR/nginx-1.12.2/
./configure --prefix=/usr/local/nginx --with-http_dav_module --with-http_stub_status_module --with-http_addition_module --with-http_sub_module --with-http_flv_module --with-http_mp4_module --with-pcre --with-http_ssl_module --with-http_gzip_static_module --user=nginx --group=nginx >/dev/null 2>&1 if [ "$?" -eq 0 ];then
make && make install >/dev/null 2>&1
fi if [ -f /usr/local/nginx/sbin/nginx ];then
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin
/usr/local/nginx/sbin/nginx
echo "恭喜您! Nginx安装成功!"
fi
} function Apache_server (){
echo "开始安装Apache,请喝杯咖啡,耐心等待一段时间...."
yum install httpd -y >/dev/null 2>&1
if [ "$?" -eq 0 ]
then
echo "恭喜您! Apache安装成功!"
else
echo "很抱歉, Apache安装失败! 请仔细检查安装脚本,可能有点问题."
fi
} function Mysql_server (){
echo "开始安装Mysql,请喝杯咖啡,耐心等待一段时间...."
rpm -e $(/bin/rpm -qa | grep mysql|xargs) --nodeps >/dev/null 2>&1
rpm -e $(/bin/rpm -qa | grep mariadb|xargs) --nodeps >/dev/null 2>&1 yum -y install make gcc-c++ cmake bison-devel ncurses-devel >/dev/null 2>&1
mkdir -p /usr/local/boost && cd /usr/local/boost
wget http://www.sourceforge.net/projects/boost/files/boost/1.59.0/boost_1_59_0.tar.gz >/dev/null 2>&1
tar -zvxf boost_1_59_0.tar.gz >/dev/null 2>&1 /usr/sbin/groupadd mysql
/usr/sbin/useradd -g mysql mysql -M -s /sbin/nologin
mkdir -p /data/mysql/data cd $BASE_DIR
wget -c http://ftp.ntu.edu.tw/MySQL/Downloads/MySQL-5.7/mysql-5.7.28.tar.gz >/dev/null 2>&1
tar -zxvf mysql-5.7.28.tar.gz >/dev/null 2>&1
cd mysql-5.7.28/
#mysql安装目录和数据目录最好分开,配置文件为/usr/local/mysql/my.cnf
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/data/mysql/data -DSYSCONFDIR=/usr/local/mysql -DWITH_MYISAM_STORAGE_ENGINE=1 -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_MEMORY_STORAGE_ENGINE=1 -DWITH_READLINE=1 -DMYSQL_UNIX_ADDR=/var/lib/mysql/mysql.sock -DMYSQL_TCP_PORT=3306 -DENABLED_LOCAL_INFILE=1 -DWITH_PARTITION_STORAGE_ENGINE=1 -DEXTRA_CHARSETS=all -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_BOOST=/usr/local/boost >/dev/null 2>&1 if [ "$?" -eq 0 ];then
make && make install >/dev/null 2>&1
fi chown -R mysql:mysql /usr/local/mysql
chown -R mysql:mysql /data/mysql
# 执行初始化配置脚本,创建系统自带的数据库和表
/usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/data/mysql/data --user=mysql --initialize >/dev/null 2>&1 ## 配置my.cnf, 注意下面EOF输入的内容需要顶格写,否则输入无效!
cat > /usr/local/mysql/my.cnf << EOF
[client]
port = 3306
socket = /usr/local/mysql/var/mysql.sock [mysqld]
port = 3306
socket = /usr/local/mysql/var/mysql.sock basedir = /usr/local/mysql/
datadir = /data/mysql/data
pid-file = /data/mysql/data/mysql.pid
user = mysql
bind-address = 0.0.0.0
server-id = 1
sync_binlog=1
log_bin = mysql-bin skip-name-resolve
#skip-networking
back_log = 600 max_connections = 3000
max_connect_errors = 3000
##open_files_limit = 65535
table_open_cache = 512
max_allowed_packet = 16M
binlog_cache_size = 16M
max_heap_table_size = 16M
tmp_table_size = 256M read_buffer_size = 1024M
read_rnd_buffer_size = 1024M
sort_buffer_size = 1024M
join_buffer_size = 1024M
key_buffer_size = 8192M thread_cache_size = 8 query_cache_size = 512M
query_cache_limit = 1024M ft_min_word_len = 4 binlog_format = mixed
expire_logs_days = 30 log_error = /data/mysql/data/mysql-error.log
slow_query_log = 1
long_query_time = 1
slow_query_log_file = /data/mysql/data/mysql-slow.log performance_schema = 0
explicit_defaults_for_timestamp ##lower_case_table_names = 1
skip-external-locking default_storage_engine = InnoDB
##default-storage-engine = MyISAM
innodb_file_per_table = 1
innodb_open_files = 500
innodb_buffer_pool_size = 40960M
innodb_write_io_threads = 1000
innodb_read_io_threads = 1000
innodb_thread_concurrency = 8
innodb_purge_threads = 1
innodb_flush_log_at_trx_commit = 2
innodb_log_buffer_size = 4M
innodb_log_file_size = 32M
innodb_log_files_in_group = 3
innodb_max_dirty_pages_pct = 90
innodb_lock_wait_timeout = 120 bulk_insert_buffer_size = 8M
#myisam_sort_buffer_size = 8M
#myisam_max_sort_file_size = 1G
#myisam_repair_threads = 1 interactive_timeout = 28800
wait_timeout = 28800 [mysqldump]
quick
max_allowed_packet = 16M [myisamchk]
key_buffer_size = 8M
sort_buffer_size = 8M
read_buffer = 4M
write_buffer = 4M sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
port = 3306
EOF #启动mysql服务
cd /usr/local/mysql && mkdir var
chown -R mysql.mysql var
cp support-files/mysql.server /etc/init.d/mysql
chmod 755 /etc/init.d/mysql
#由于是拷贝到/etc/init.d下的启动脚本,这里不管是centos6或centos6都使用chkconfig添加开机启动
chkconfig mysql on
service mysql start >/dev/null 2>&1 #设置环境变量
echo "export PATH=$PATH:/usr/local/mysql/bin" >> /etc/profile
source /etc/profile mkdir -p /var/lib/mysql
ln -s /usr/local/mysql/var/mysql.sock /var/lib/mysql/mysql.sock
chown -R mysql:mysql /var/lib/mysql #设置初始密码为"mysql@123"
sed -i '/\[mysqld]/a\skip-grant-tables' /usr/local/mysql/my.cnf
service mysql restart >/dev/null 2>&1
#mysql无密码登陆,可以使用mysql -p" "直接登陆(即密码为空)。如果直接使用mysql -p回车,然后无密码,但还是需要触发一次回车。
/usr/local/mysql/bin/mysql -p" " -e "update mysql.user set authentication_string=password('mysql@123') where user='root';" -e "flush privileges;" sed -i '/skip-grant-tables/d' /usr/local/mysql/my.cnf
MYSQL_VERSION=$(basename $(ls $BASE_DIR/mysql-*.tar.gz)|cut -d"-" -f2|awk -F".tar" '{print $1}') chown -R mysql:mysql /usr/local/mysql
chown -R mysql:mysql /data/mysql service mysql restart >/dev/null 2>&1
if [ "$?" -eq 0 ];then
echo "恭喜您! Mysql${MYSQL_VERSION}安装成功!目前Mysql服务已启动,初始密码为mysql@123"
fi
} case $NUM in
1)
Nginx_server
;;
2)
Apache_server
;;
3)
Mysql_server
;;
esac
执行脚本
需要注意:
上面One_button_install.sh一键部署脚本中涉及服务安装包的下载,考虑到网络因素,可以提前将包下载下来放到指定的${BASE_DIR}目录下,这样有利于提高脚本执行效率。 执行脚本,必须选择安装mysql
[root@localhost ~]# chmod 755 One_button_install.sh
[root@localhost ~]# sh One_button_install.sh
+------------------------------------------------+
| |
| _o0o_ 1. 安装Nginx |
| 08880 2. 安装Apache |
| 88"."88 3. 安装MySQL |
| (|-_-|) 4. 安装PHP |
| 0\=/0 5. 部署LNMP环境 |
| __/ \__ 6. 安装zabbix监控 |
| ‘\ ///‘ 7. 退出此管理程序 |
| / Linux一键 \ 8. 关闭计算机 |
| || Server || ================================|
| \ //// 一键安装服务 |
| ||| i i i ||| by Kevin |
| ___ ___ ================================|
|___‘. /--.--\ .‘___ |
+------------------------------------------------+
请您输入1-8任意字符:3
开始安装Mysql,请喝杯咖啡,耐心等待一段时间.... 接着就是耐心等待就好了,本脚本经过线上测试可用。
分享一例测试环境下nginx+tomcat的视频业务部署记录的更多相关文章
- windows 环境下nginx + tomcat群 + redis 实现session共享
nginx作为负载均衡根据定义将不同的用户请求分发到不同的服务器,同时也解决了因单点部署服务器故障导致的整个应用不能访问的问题 在加入nginx之后,如果多个服务器中的一个或多个(不是全部)发生故障, ...
- windows下nginx+tomcat分布式集群部署
首先官网下载 http://nginx.org/en/download.html,我的本地环境为 实现的架构: 从图上可以看出,nginx作为负载均衡请求分发器,当请求A应用时候,分发到A集群,同理 ...
- Nginx--Windows环境下Nginx+tomcat配置(包括动静分离)
前提条件: (1)已安装好tomcat,且能成功启动 (2)已安装好Nginx,且能成功启动 接下来进行配置: (1)在Nginx的conf文件夹中新增两个文件,分别如下:(新建文件后,直接复制代码即 ...
- Tomcat:云环境下的Tomcat设计思路——Tomcat的多实例安装
Cloud现在是一个热门的技术,Tomcat是学习Java的人一般都会接触的Web服务器,如果在Cloud环境下使用Tomcat,又当如何呢?不可避免的,要安装多个Tomcat了,这里称之为Tomca ...
- 搭建windows环境下(nginx+mysql+php)开发环境
搭建windows环境下(nginx+mysql+php)开发环境 1. 所需准备应用程序包 1.1 nginx 程序包nginx-1.0.4.zip或其他版本(下载地址: http ...
- macOS Sierra Version 10.12.6 环境下Tomcat的下载与安装以及InterlliJ IDEA 2017.2 环境下配置Tomcat 与创建Web项目
一.Tomcat的下载与安装 1.官网(http://tomcat.apache.org/)下载Tomcat 9.0 Core:zip包: 2.解压到指定的文件夹即可安装完成: 3.测试是否安装成功 ...
- Windows10环境下 Nginx+ffmpeg自搭服务器制作RTMP直播流
Windows10环境下 Nginx+ffmpeg自搭服务器制作RTMP直播流学习笔记 所需条件: nginx-rtmp-module(带rtmp模块) ,链接:https://link.jiansh ...
- 测试环境下将centos6.8升级到centos7的操作记录(转)
在测试环境下安装openstack,由于在centos6下安装openstack,针对源的问题有很多,安装起来很不顺利! 但是在centos7下安装却很顺利,所以考虑将服务器由centos6升级到ce ...
- Linux环境下在Tomcat上部署JavaWeb工程
本文讲解如何将我们已经编译好的JavaWeb工程在Linux环境下的Tomcat上进行部署,总体上的思路是和Windows下JavaWeb项目部署到tomcat差不多,具体步骤和命令如下. 注:部署之 ...
随机推荐
- Android 隐式意图和显示意图的使用场景
本文实现一个隐式意图的应用,激活短信应用 public void click4(View view) { Intent intent = new Intent(); intent.setAction( ...
- iOS-RunTime
原帖:http://www.cnblogs.com/Mike-zh/p/4557014.html 1.Runtime简介 因为Objc是一门动态语言,所以它总是想办法把一些决定工作从编译连接推迟到运行 ...
- OC NSNumber NSValue
OC NSNumber NSValue iOS的集合对象不可以存储C语言基本类型,所有可以进行装箱和拆箱,来进行OC对象操作. NSNumber包装类 普通初始化 NSNumber * num1 = ...
- 转载:设置html页面不让浏览器缓存的方法
本文是转载文章,只是方便自己记录. 在html页面head标签之间添加以下标识可以避免大多数浏览器缓存: <meta http-equiv="Pragma" content= ...
- MongoDB使用汇总贴
金天:学习一个新东西,就要持有拥抱的心态,如果固守在自己先前的概念体系,就会有举步维艰的感觉.应用mongodb(NoSQL)开发,首先要打破原先的关系思维.范式思维. 本文作为使用mongodb一路 ...
- SQL挑战——如何高效生成编码
有这样一个需求:需要根据输入的编码(这个编码值来自于数据库的一个表)生成下一个编码,编码规则如下所示(我们暂且不关心这个逻辑是否合理,只关心如何实现): 1: 最小值为A0000, 最大值为ZZZZZ ...
- 编译hadoop2.6.0
具体情况比较曲折:hadoop2.6.0编译不过 错误如下: 这个kms模块始终编译不过,最后得出结论国内的aliyun maven仓库有问题, 在编译hadoop2.2.0 可以通过,因为这个版本的 ...
- FP并行算法的几个相关方向
1 集群系统中的 FP-tree 并行算法(many for one一个任务 还是 云计算one for many多个任务?) 计算机集群系统利用网络把一组具有高性能的工作站或者 PC 机按一定的结构 ...
- Solr术语介绍:SolrCloud,单机Solr,Collection,Shard,Replica,Core之间的关系
Solr有一堆让人发晕的术语如:collections,shards,replicas,cores,config sets. 在了解这些术语之前需要先做做如下功课: 1)什么是倒排索引? 2)搜索引擎 ...
- Linux命令中使用正则表达式
在使用grep.awk和sed命令时,需要使用正则表达式.比如我通过grep找代码编译结果中是否有错误.或者是否有我代码的错误.这里说下正则表达式基本的应用: • 匹配行首与行尾.• 匹配数据集.• ...