每次项目部署到内网服务器时,都需要自己手动操作解压tar包、创建目录等等,所以自己写了一个脚本,直接一键部署。如果是公网环境则直接用docker最简单,就不需要传包啥的到服务器。
我用的环境包网盘地址:链接:https://pan.baidu.com/s/1ZeWYw4rAwu4RpO-_i6bRWA
提取码:2001
–来自百度网盘超级会员V4的分享
脚本如下:
1.将提供的目录都copy到虚拟机上的某个目录下
2.移动到copy的工作目录下,在目录下执行 chmod +x 1.sh,然后 ./1.sh运行即可自动安装环境
3.脚本执行结束后,手动刷新全局变量,不然会导致当前shell无法使用java、mysql命令,因为更改只会影响到当前运行脚本的 Shell 进程以及它所创建的任何子进程,所以执行. /etc/profile
和 . /etc/profile.d/lamp.sh
#!/bin/bash
#工作目录,即上传的文件所属目录
workDir=`pwd`
#脚本产生日志的目录
LOG_DIR="/tmp"
#依赖目录路径 写成你上传到服务器上的依赖目录
RELY_ON_DIR="/tmp/environment/rely_on"
#jar包全路径(包含文件名) 写成你上传到服务器上的jar包路径
JDK_DIR="/tmp/environment/jdk-8u221-linux-x64.tar.gz"
#redis包全路径 写成你上传到服务器上的redis包路径
REDIS_DIR="/tmp/environment/redis-7.0.15.tar.gz"
#redis密码 ,如果为空则不设置密码
REDIS_PWD="123456"
#Nginx包全路径(包含文件名) 写成你上传到服务器上的Nginx包路径
NGINX_DIR="/tmp/environment/nginx-1.18.0.tar.gz"
#mysql
#安装到哪个目录
SRC_DIR=/usr/local/src
#安装包路径全路径(包含文件名) 写成你上传到服务器上的mysql包路径
MYSQL='/tmp/environment/mysql-5.7.43-linux-glibc2.12-x86_64.tar.gz'
#数据库密码
MYSQL_ROOT_PASSWORD=123456
# 检查防火墙状态
firewall_status=$(systemctl is-active firewalld)
if [ "$firewall_status" = "active" ]; then
echo "防火墙已启用,无需操作。"
else
# 启用防火墙
echo "防火墙未启用,正在启用..."
systemctl start firewalld
systemctl enable firewalld
echo "防火墙已成功启用。"
fi
if [ ! -d "jdk" ]; then
echo "====依赖安装开始===="
rpm -Uvh $RELY_ON_DIR/*.rpm --nodeps --force
echo "====依赖安装完成===="
else
echo "依赖包目录 $RELY_ON_DIR 不存在"
fi
# 检查压缩包是否存在
if [ -f "$JDK_DIR" ]; then
echo "===================="
echo "======JDK安装========="
echo "===================="
{
if [ ! -d "jdk" ]; then
mkdir jdk
fi
if [ ! -d "/usr/local/jdk" ]; then
mkdir /usr/local/jdk/
fi
tar -zxvf $JDK_DIR -C jdk/
mv jdk/$(tar tf $JDK_DIR | head -n 1)* /usr/local/jdk/
rm -rf jdk
#添加环境变量
echo "JAVA_HOME=/usr/local/jdk" >> /etc/profile
echo "PATH=\$JAVA_HOME/bin:\$PATH" >> /etc/profile
#刷新
source /etc/profile
cd $workDir
} 2>&1 >> $LOG_DIR/jdk_install.log
#查看版本,安装成功会显示版本号
echo "java版本号"
java -version
echo "===================="
echo "======JDK安装完成========="
echo "===================="
else
echo "jdk压缩包 $JDK_DIR 不存在"
fi
# 检查压缩包是否存在
if [ -f "$REDIS_DIR" ]; then
echo "===================="
echo "======redis安装========="
echo "===================="
{
if [ ! -d "/usr/local/redis" ]; then
mkdir /usr/local/redis
fi
tar -zxvf $REDIS_DIR -C /usr/local/
mv /usr/local/$(tar tf $REDIS_DIR | head -n 1)* /usr/local/redis
rm -rf /usr/local/$(tar tf $REDIS_DIR | head -n 1)
cd /usr/local/redis
make > /dev/null 2>&1
make install > /dev/null 2>&1
#让redis后台运行
sed -i 's/daemonize no/daemonize yes/g' /usr/local/redis/redis.conf
#修改端口号(可以不修改)
#sed -i 's/port 6379/port 指定端口/g' /usr/local/redis/redis.conf
#可以设置redis密码,文件中默认是注释的,所以我们直接追加也行
# 检查redisPwd是否为空
if [ -n "$REDIS_PWD" ]; then
echo "requirepass \"$REDIS_PWD\"" >> /usr/local/redis/redis.conf
echo "密码已添加到redis.conf文件中。"
else
echo "redisPwd变量为空,未添加密码到redis.conf文件。"
fi
#设置redis可以被远程访问,如果不注释则redis只能本机访问
sed -i -e 's/^bind 127.0.0.1/#bind 127.0.0.1/' /usr/local/redis/redis.conf
echo 'protected-mode "no"' >> ../redis.conf
#开启防火墙指定端口
firewall-cmd --zone=public --add-port=6379/tcp --permanent
firewall-cmd --reload
#运行redis 指定配置文件,在后台运行,如果没改端口号则默认6379
cd /usr/local/redis/src
#添加到服务
echo "[Unit]" > /etc/systemd/system/redis.service
echo "Description=redis-server" >> /etc/systemd/system/redis.service
echo "After=network.target" >> /etc/systemd/system/redis.service
echo "" >> /etc/systemd/system/redis.service
echo "[Service]" >> /etc/systemd/system/redis.service
echo "Type=forking" >> /etc/systemd/system/redis.service
echo "ExecStart= /usr/local/bin/redis-server /usr/local/redis/redis.conf" >> /etc/systemd/system/redis.service
echo "PrivateTmp=true" >> /etc/systemd/system/redis.service
echo "" >> /etc/systemd/system/redis.service
echo "[Install]" >> /etc/systemd/system/redis.service
echo "WantedBy=multi-user.target" >> /etc/systemd/system/redis.service
systemctl daemon-reload
systemctl start redis
#开机自启动
systemctl enable redis
#全局使用
echo 'PATH=/usr/local/bin/:$PATH' >> /etc/profile.d/lamp.sh
. /etc/profile.d/lamp.sh
cd $workDir
} 2>&1 >> $LOG_DIR/redis_install.log
echo "redis版本号:"
redis-server --version
echo "===================="
echo "======redis安装完成========="
echo "===================="
else
echo "redis压缩包 $REDIS_DIR 不存在"
fi
# 检查压缩包是否存在
if [ -f "$NGINX_DIR" ]; then
echo "===================="
echo "======nginx安装开始========="
echo "===================="
{
if [ ! -d "nginx" ]; then
mkdir nginx
fi
if [ ! -d "/usr/local/nginx" ]; then
mkdir /usr/local/nginx/
fi
#编译nginx
tar -zxvf $NGINX_DIR -C nginx/
mv nginx/$(tar tf $NGINX_DIR | head -n 1)* /usr/local/nginx/
rm -rf nginx
cd /usr/local/nginx
./configure --prefix=/usr/local/nginx
make > /dev/null 2>&1
make install > /dev/null 2>&1
cd /usr/local/nginx/sbin/
mkdir -p /usr/local/nginx/logs
#放行80端口
sudo firewall-cmd --zone=public --add-port=80/tcp --permanent
#重新加载防火墙
sudo firewall-cmd --reload
#添加到服务
echo "[Unit]" > /etc/systemd/system/nginx.service
echo "Description=nginx-server" >> /etc/systemd/system/nginx.service
echo "After=network.target" >> /etc/systemd/system/nginx.service
echo "" >> /etc/systemd/system/nginx.service
echo "[Service]" >> /etc/systemd/system/nginx.service
echo "Type=forking" >> /etc/systemd/system/nginx.service
echo "ExecStart= /usr/local/nginx/sbin/nginx" >> /etc/systemd/system/nginx.service
echo "ExecReload= /usr/local/nginx/sbin/nginx" >> /etc/systemd/system/nginx.service
echo "ExecStop= /usr/local/nginx/sbin/nginx" >> /etc/systemd/system/nginx.service
echo "PrivateTmp=true" >> /etc/systemd/system/nginx.service
echo "" >> /etc/systemd/system/nginx.service
echo "[Install]" >> /etc/systemd/system/nginx.service
echo "WantedBy=multi-user.target" >> /etc/systemd/system/nginx.service
systemctl daemon-reload
systemctl start nginx
#开机自启动
systemctl enable nginx
#全局使用
echo 'PATH=/usr/local/nginx/sbin/:$PATH' >> /etc/profile.d/lamp.sh
. /etc/profile.d/lamp.sh
cd $workDir
} 2>&1 >> $LOG_DIR/nginx_install.log
echo "nginx版本号:"
nginx -v
echo "===================="
echo "======nginx安装结束========="
echo "===================="
else
echo "nginx压缩包 $NGINX_DIR 不存在"
fi
# 检查压缩包是否存在
if [ -f "$MYSQL" ]; then
echo "===================="
echo "======mysql安装开始========="
echo "===================="
if [ ! -e ${MYSQL} ];then
echo "数据库压缩包不存在"
exit
fi
tar xf ${MYSQL} -C /usr/local/
if [ -e /usr/local/mysql ];then
echo "数据库已存在,安装失败"
exit
fi
{
cd ${SRC_DIR}
# 检查MYSQL变量是否包含斜杠
if [[ $MYSQL == *"/"* ]]; then
# 如果包含斜杠,则提取出最后一个斜杠后面的值
FILENAME=$(basename $MYSQL)
else
# 如果不包含斜杠,则直接使用MYSQL变量的值
FILENAME=$MYSQL
fi
# 使用sed命令提取最后一个数字之前的部分
MYSQL_DIR=$(echo $FILENAME | sed -nr 's/^(.*[0-9]).*/\1/p')
ln -s /usr/local/${MYSQL_DIR} /usr/local/mysql
chown -R root.root /usr/local/mysql/
id mysql &> /dev/null || { useradd -s /sbin/nologin -r mysql ; echo "创建mysql用户"; }
yum -y -q install numactl-libs libaio &> /dev/null
echo 'PATH=/usr/local/mysql/bin/:$PATH' > /etc/profile.d/lamp.sh
. /etc/profile.d/lamp.sh
cat > /etc/my.cnf <<-EOF
[mysqld]
server-id=1
datadir=/data/mysql
socket=/data/mysql/mysql.sock
log-error=/data/mysql/mysql.log
pid-file=/data/mysql/mysql.pid
[client]
socket=/data/mysql/mysql.sock
EOF
[ -d /data ] || mkdir /data
mysqld --initialize --user=mysql --datadir=/data/mysql
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
chkconfig --add mysqld
chkconfig mysqld on
service mysqld start
[ $? -ne 0 ] && { echo "数据库启动失败,退出!";exit; }
MYSQL_OLDPASSWORD=`awk '/A temporary password/{print $NF}' /data/mysql/mysql.log`
mysqladmin -uroot -p$MYSQL_OLDPASSWORD password $MYSQL_ROOT_PASSWORD &>/dev/null
# 更新MySQL用户的Host字段,使其允许远程连接
mysql -uroot -p"$MYSQL_ROOT_PASSWORD" -e "use mysql; update user set Host='%' where User='root'; flush privileges;"
# 开启防火墙指定端口
firewall-cmd --zone=public --add-port=3306/tcp --permanent
firewall-cmd --reload
cd $workDir
} 2>&1 >> $LOG_DIR/mysql_install.log
echo "===================="
echo "======mysql安装结束========="
echo "===================="
else
echo "mysql压缩包 $MYSQL 不存在"
fi
#重启防火墙,记录新的防火墙规则
systemctl restart firewalld