微服务blog传统部署文档
一、环境准备
1.服务器准备
| 序号 | ip | 系统版本 | 硬件配置 |
|---|---|---|---|
| 1 | 192.168.17.x | centos7 | 2CPU/4G内存/30G存储 |
2.初始化系统
如果系统未做初始化请做初始化vim init.sh 将以下脚本写入到init.sh里面
#!/bin/bash
# 交互式网络配置脚本
echo "======================= 系统初始化配置 ======================="
# 函数:获取用户输入
get_input() {
local prompt="$1"
local default_value="$2"
local user_input
if [ -n "$default_value" ]; then
read -p "$prompt (默认: $default_value): " user_input
if [ -z "$user_input" ]; then
user_input="$default_value"
fi
else
read -p "$prompt: " user_input
fi
echo "$user_input"
}
# 函数:验证IP地址格式
validate_ip() {
local ip="$1"
local regex="^([0-9]{1,3}\.){3}[0-9]{1,3}$"
if [[ $ip =~ $regex ]]; then
IFS='.' read -r -a octets <<< "$ip"
for octet in "${octets[@]}"; do
if (( octet < 0 || octet > 255 )); then
return 1
fi
done
return 0
else
return 1
fi
}
# 函数:验证子网掩码格式
validate_netmask() {
local mask="$1"
local regex="^255\.255\.255\.[0-9]+$"
if [[ $mask =~ $regex ]] || [[ "$mask" =~ ^[0-9]{1,2}$ ]]; then
return 0
else
return 1
fi
}
# 显示当前网络接口信息
echo "当前网络接口信息:"
echo "---------------------------------------------------"
ip addr show | grep -E "^[0-9]+:|inet " | grep -v "127.0.0.1"
echo "---------------------------------------------------"
# 设置要分配的IP地址、子网掩码和默认网关
echo "正在配置网络参数..."
echo ""
# 获取网卡名称
interface_list=$(ls /etc/sysconfig/network-scripts/ifcfg-* 2>/dev/null | xargs -n1 basename | sed 's/ifcfg-//' | tr '\n' ' ')
default_interface=""
if [ -n "$interface_list" ]; then
default_interface=$(echo "$interface_list" | awk '{print $1}')
fi
# 交互式输入网络参数
while true; do
network_interface=$(get_input "请输入网卡名称" "$default_interface")
if [ -n "$network_interface" ]; then
break
fi
echo "错误: 网卡名称不能为空!"
done
# 检查是否有现有配置
networkfile="/etc/sysconfig/network-scripts/ifcfg-$network_interface"
if [ -f "$networkfile" ]; then
echo ""
echo "发现现有网络配置:"
echo "---------------------------------------------------"
grep -E "^(IPADDR|NETMASK|GATEWAY|DNS|BOOTPROTO)=" "$networkfile" 2>/dev/null || echo "(无配置)"
echo "---------------------------------------------------"
read -p "是否覆盖现有配置? (y/n, 默认: n): " overwrite
if [[ ! "$overwrite" =~ ^[Yy]$ ]]; then
echo "已取消配置,使用现有配置。"
else
# 备份原配置文件
backup_file="${networkfile}.backup.$(date +%Y%m%d%H%M%S)"
cp "$networkfile" "$backup_file"
echo "已备份原配置文件到: $backup_file"
fi
fi
# 获取IP地址
while true; do
ip_address=$(get_input "请输入IP地址" "192.168.137.140")
if validate_ip "$ip_address"; then
break
else
echo "错误: IP地址格式不正确! 请重新输入。"
fi
done
# 获取子网掩码
while true; do
subnet_mask=$(get_input "请输入子网掩码 (格式: 255.255.255.0 或 CIDR如 24)" "255.255.255.0")
if validate_netmask "$subnet_mask"; then
break
else
echo "错误: 子网掩码格式不正确! 请重新输入。"
fi
done
# 获取默认网关
while true; do
# 自动生成默认网关建议(通常是IP地址的第一个可用地址)
suggested_gateway=$(echo "$ip_address" | sed 's/[0-9]*$/2/')
default_gateway=$(get_input "请输入默认网关" "$suggested_gateway")
if validate_ip "$default_gateway"; then
break
else
echo "错误: 网关地址格式不正确! 请重新输入。"
fi
done
# 获取DNS服务器
dns1=$(get_input "请输入主DNS服务器" "114.114.114.114")
dns2=$(get_input "请输入备DNS服务器" "223.5.5.5")
# 确认配置
echo ""
echo "=============== 请确认以下网络配置 ==============="
echo "网卡名称: $network_interface"
echo "IP地址: $ip_address"
echo "子网掩码: $subnet_mask"
echo "默认网关: $default_gateway"
echo "主DNS: $dns1"
echo "备DNS: $dns2"
echo "=================================================="
echo ""
read -p "确认应用以上配置? (y/n, 默认: n): " confirm
if [[ ! "$confirm" =~ ^[Yy]$ ]]; then
echo "配置已取消!"
exit 1
fi
# 关闭防火墙
echo "正在关闭防火墙..."
systemctl stop firewalld 2>/dev/null && systemctl disable firewalld 2>/dev/null && echo "防火墙已关闭" || echo "警告: 防火墙关闭失败或未安装"
# 关闭NetworkManager
echo "正在关闭NetworkManager..."
systemctl stop NetworkManager 2>/dev/null && systemctl disable NetworkManager 2>/dev/null && echo "NetworkManager已关闭" || echo "警告: NetworkManager关闭失败或未安装"
# 关闭SELinux
echo "正在关闭SELinux..."
setenforce 0 2>/dev/null
if [ -f /etc/selinux/config ]; then
sed -i 's/^SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
sed -i 's/^SELINUX=permissive/SELINUX=disabled/g' /etc/selinux/config
echo "SELinux已禁用"
else
echo "SELinux配置文件不存在,跳过"
fi
# 关闭SSHD的DNS验证
echo "正在关闭SSHD的DNS验证..."
if [ -f /etc/ssh/sshd_config ]; then
# 备份原配置文件
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.backup.$(date +%Y%m%d%H%M%S)
# 修改配置
sed -i 's/^#UseDNS yes/UseDNS no/' /etc/ssh/sshd_config
sed -i 's/^UseDNS yes/UseDNS no/' /etc/ssh/sshd_config
# 添加配置项(如果不存在)
if ! grep -q '^UseDNS' /etc/ssh/sshd_config; then
echo "UseDNS no" >> /etc/ssh/sshd_config
fi
# 重启服务
systemctl restart sshd 2>/dev/null && echo "SSHD配置已更新" || echo "警告: SSHD服务重启失败"
else
echo "警告: SSH配置文件不存在,跳过配置"
fi
# 配置Yum源
echo "正在配置Yum源..."
# 备份原有源
mkdir -p /etc/yum.repos.d/backup
mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/backup/ 2>/dev/null
# 下载阿里云CentOS源
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo 2>/dev/null
if [ $? -eq 0 ]; then
echo "CentOS-Base.repo下载成功"
else
echo "警告: CentOS-Base.repo下载失败,请检查网络连接"
fi
# 下载阿里云EPEL源
curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo 2>/dev/null
if [ $? -eq 0 ]; then
echo "epel.repo下载成功"
else
echo "警告: epel.repo下载失败,请检查网络连接"
fi
# 清理缓存并生成新缓存
yum clean all 2>/dev/null
yum makecache 2>/dev/null && echo "Yum缓存已更新" || echo "警告: Yum缓存更新失败"
# 配置网卡
echo "正在配置网卡 $network_interface ..."
# 检查并获取UUID
uuid_line=""
if [ -f "$networkfile" ]; then
uuid_line=$(grep '^UUID=' "$networkfile")
fi
# 如果没有找到UUID,则生成一个新的
if [ -z "$uuid_line" ]; then
uuid_line="UUID=\"$(uuidgen)\""
fi
# 清空现有配置文件
> "$networkfile"
# 编写ifcfg文件
cat >> "$networkfile" <<EOF
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="static"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="yes"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="$network_interface"
$uuid_line
DEVICE="$network_interface"
ONBOOT="yes"
IPADDR=$ip_address
NETMASK=$subnet_mask
GATEWAY=$default_gateway
DNS1=$dns1
DNS2=$dns2
EOF
echo "网络配置文件已生成: $networkfile"
echo ""
# 安装基础软件包
echo "正在安装基础软件包..."
yum -y install wget lrzsz unzip gzip telnet vim 2>/dev/null || echo "警告: 软件包安装失败,请检查yum源配置"
# 配置基础环境变量
echo "配置基础环境变量..."
# 备份原配置文件
cp /etc/profile /etc/profile.backup.$(date +%Y%m%d%H%M%S) 2>/dev/null
cp ~/.vimrc ~/.vimrc.backup.$(date +%Y%m%d%H%M%S) 2>/dev/null 2>/dev/null
# 追加环境变量配置
if ! grep -q "if \[ \$(id -u) == 0 \]; then" /etc/profile; then
cat >> /etc/profile <<EOF
if [ \$(id -u) == 0 ]; then
export PS1='[\033[31;1m\]\u\[\033[m\]@\h \w]# '
else
export PS1='[\033[34;1m\]\u\[\033[m\]@\h \w]\$ '
fi
alias ll='ls -lh --color=auto'
alias grep='grep --color'
alias free='free -m'
alias df='df -h'
alias du='du -h'
alias vi='vim'
EOF
fi
# 配置vimrc
cat > ~/.vimrc <<EOF
"设置高亮
syntax on
"显示行号
set number
"自动缩进功能
set autoindent
"启用鼠标支持
"set mouse=a
"vim新打开.sh文件自动添加一下内容
autocmd BufNewFile *.sh exec ":call SetComment()"
func SetComment()
if expand("%:e")=='sh'
call setline(1,'#!/bin/bash')
call setline(2,'#Author: xxx')
call setline(3,'#Create time:'.strftime("%Y-%m-%d"))
endif
endfunc
EOF
# 应用环境变量
source /etc/profile 2>/dev/null
# 重启网络服务
echo "正在重启网络服务..."
if systemctl restart network 2>/dev/null; then
echo "网络服务重启成功!"
else
echo "尝试使用其他方式重启网络..."
ifdown "$network_interface" 2>/dev/null && ifup "$network_interface" 2>/dev/null || echo "网络重启失败,请手动检查"
fi
echo ""
echo "======================= 配置完成 ======================="
echo "网络配置摘要:"
echo "IP地址: $ip_address"
echo "子网掩码: $subnet_mask"
echo "默认网关: $default_gateway"
echo "DNS服务器: $dns1, $dns2"
echo "配置文件: $networkfile"
echo ""
echo "当前网络状态:"
echo "---------------------------------------------------"
ip addr show "$network_interface" 2>/dev/null | grep "inet " || echo "警告: 无法获取IP地址,请检查配置"
echo "---------------------------------------------------"
echo ""
echo "请使用以下命令测试网络连接:"
echo "1. ping $default_gateway"
echo "2. ping 114.114.114.114"
echo "3. ping www.baidu.com"
echo ""
echo "脚本执行完毕!"
给脚本执行权限
chmod +x init.sh
#运行脚本
./init.sh
二、项目解析
blog项目是使用Java开发,使用了前后端分离,前端使用vue,后端使用springcloud微服务框架进行开发
项目部署环境:jdk8+mysql5.7+redis5.0+nacos。注意:如果部署项目中,需要mysql数据库或者其他数据如redis等中间件时,我们应该优先运行中间件
三、数据库的部署
1.下载rpm包
手动下载包或者上传已经下载好的包:此处我直接上传下载好的包
mkdir /opt/soft/mysql -p && cd /opt/soft/mysql
wget https://mirrors.aliyun.com/mysql/MySQL-5.7/mysql-community-client-5.7.36-1.el7.x86_64.rpm
wget https://mirrors.aliyun.com/mysql/MySQL-5.7/mysql-community-common-5.7.36-1.el7.x86_64.rpm
wget https://mirrors.aliyun.com/mysql/MySQL-5.7/mysql-community-devel-5.7.36-1.el7.x86_64.rpm
wget https://mirrors.aliyun.com/mysql/MySQL-5.7/mysql-community-libs-5.7.36-1.el7.x86_64.rpm
wget https://mirrors.aliyun.com/mysql/MySQL-5.7/mysql-community-libs-compat-5.7.36-1.el7.x86_64.rpm
wget https://mirrors.aliyun.com/mysql/MySQL-5.7/mysql-community-server-5.7.36-1.el7.x86_64.rpm
2.执行自动化安装脚本
将以下脚本写入到install-mysql.sh中
#!/bin/bash
# MySQL手动安装配置脚本
# 用法:sudo ./install_mysql.sh
# 注意:需要先将MySQL RPM包上传到/opt/soft/mysql目录
# 此版本不包含自动密码修改功能
set -e # 遇到错误时退出脚本
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# 变量定义
MYSQL_DIR="/opt/soft/mysql"
MYSQL_PORT="3306"
# 日志函数
log_info() {
echo -e "${GREEN}[INFO]${NC} $1"
}
log_warn() {
echo -e "${YELLOW}[WARN]${NC} $1"
}
log_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
log_step() {
echo -e "${BLUE}[STEP]${NC} $1"
}
# 检查是否以root用户运行
check_root() {
if [[ $EUID -ne 0 ]]; then
log_error "此脚本必须以root权限运行"
exit 1
fi
}
# 检查MySQL包是否存在
check_mysql_packages() {
log_step "检查MySQL安装包..."
if [[ ! -d "$MYSQL_DIR" ]]; then
log_error "MySQL安装包目录不存在: $MYSQL_DIR"
echo "请执行以下步骤:"
echo "1. mkdir -p /opt/soft/mysql"
echo "2. cd /opt/soft/mysql"
echo "3. 上传MySQL RPM包到该目录"
exit 1
fi
cd "$MYSQL_DIR"
# 检查目录中是否有RPM文件
if ls *.rpm 1>/dev/null 2>&1; then
log_info "找到以下RPM包:"
ls -la *.rpm
echo ""
else
log_error "在 $MYSQL_DIR 目录中未找到RPM包"
echo "请将MySQL RPM包上传到该目录,然后重新运行脚本"
exit 1
fi
}
# 检查是否已安装MySQL
check_existing_mysql() {
log_step "检查已安装的MySQL组件..."
if rpm -qa | grep -q mysql; then
log_warn "检测到已安装的MySQL组件:"
rpm -qa | grep mysql
read -p "是否继续安装?(y/n): " -n 1 -r
echo
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
log_info "安装已取消"
exit 0
fi
else
log_info "未检测到已安装的MySQL组件"
fi
}
# 安装MySQL依赖
install_dependencies() {
log_step "安装必要的依赖包..."
yum -y install perl net-tools libaio numactl
if [[ $? -ne 0 ]]; then
log_warn "部分依赖包安装失败,但将继续尝试安装MySQL"
else
log_info "依赖包安装完成"
fi
}
# 安装MySQL RPM包
install_mysql_rpms() {
log_step "安装MySQL RPM包..."
cd "$MYSQL_DIR"
# 先安装common和libs包
for package_pattern in "*common*" "*libs*" "*client*" "*server*"; do
for rpm_file in $package_pattern; do
if [[ -f "$rpm_file" ]]; then
log_info "安装: $rpm_file"
rpm -ivh "$rpm_file" 2>/dev/null || {
# 如果安装失败,尝试使用--force选项
log_warn "尝试强制安装: $rpm_file"
rpm -ivh --force --nodeps "$rpm_file" 2>/dev/null || true
}
fi
done
done
# 安装剩余的所有RPM包
for rpm_file in *.rpm; do
if [[ -f "$rpm_file" ]] && ! rpm -q $(rpm -qp --queryformat '%{NAME}' "$rpm_file" 2>/dev/null) >/dev/null 2>&1; then
log_info "安装: $rpm_file"
rpm -ivh "$rpm_file" 2>/dev/null || {
log_warn "尝试强制安装: $rpm_file"
rpm -ivh --force --nodeps "$rpm_file" 2>/dev/null || true
}
fi
done
# 验证安装
if rpm -qa | grep -q mysql-community-server; then
log_info "MySQL安装成功"
else
log_error "MySQL安装失败,请检查RPM包是否正确"
exit 1
fi
}
# 配置MySQL
configure_mysql() {
log_step "配置MySQL..."
# 备份原始配置文件
if [[ -f /etc/my.cnf ]]; then
mv /etc/my.cnf /etc/my.cnf.bak
log_info "已备份原始配置文件: /etc/my.cnf.bak"
fi
# 创建新的配置文件
cat > /etc/my.cnf << EOF
[client]
port=$MYSQL_PORT
socket=/var/lib/mysql/mysql.sock
[mysqld]
port=$MYSQL_PORT
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
server-id=1
log-bin=mysql-bin
symbolic-links=0
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
character_set_server=utf8mb4
collation_server=utf8mb4_general_ci
max_connections=1000
query_cache_size=64M
slow_query_log=1
slow_query_log_file=/var/log/mysql-slow.log
long_query_time=2
binlog_format=ROW
default-storage-engine=INNODB
innodb_buffer_pool_size=256M
innodb_log_file_size=128M
innodb_flush_log_at_trx_commit=1
innodb_lock_wait_timeout=50
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
EOF
log_info "MySQL配置文件已创建"
}
# 初始化数据目录
initialize_mysql() {
log_step "初始化MySQL数据目录..."
# 检查数据目录是否已存在
if [[ -d /var/lib/mysql ]] && [[ "$(ls -A /var/lib/mysql 2>/dev/null)" ]]; then
log_warn "MySQL数据目录已存在且不为空"
read -p "是否删除现有数据并重新初始化?(y/n): " -n 1 -r
echo
if [[ $REPLY =~ ^[Yy]$ ]]; then
systemctl stop mysqld 2>/dev/null || true
rm -rf /var/lib/mysql/*
log_info "已清空数据目录"
fi
fi
}
# 启动MySQL服务
start_mysql_service() {
log_step "启动MySQL服务..."
# 设置开机自启
systemctl enable mysqld
if [[ $? -ne 0 ]]; then
log_warn "设置开机自启失败,但将继续尝试启动"
fi
# 启动服务
systemctl start mysqld
# 检查服务状态
local max_retries=10
local retry_count=0
while [[ $retry_count -lt $max_retries ]]; do
if systemctl is-active --quiet mysqld; then
log_info "MySQL服务启动成功"
return 0
fi
log_info "等待MySQL服务启动... ($((retry_count+1))/$max_retries)"
sleep 3
((retry_count++))
done
log_error "MySQL服务启动失败"
systemctl status mysqld
journalctl -xe --no-pager | tail -50
return 1
}
# 获取临时密码
get_temp_password() {
log_step "获取MySQL临时密码..."
# 等待MySQL日志文件生成
local max_retries=20
local retry_count=0
while [[ $retry_count -lt $max_retries ]]; do
if [[ -f /var/log/mysqld.log ]] && [[ -s /var/log/mysqld.log ]]; then
# 从日志中查找临时密码
local temp_password=$(grep 'temporary password' /var/log/mysqld.log | tail -1 | awk -F': ' '{print $NF}')
if [[ -n "$temp_password" ]]; then
echo "$temp_password"
return 0
fi
fi
if [[ $retry_count -eq 5 ]]; then
log_info "等待MySQL生成临时密码..."
fi
sleep 2
((retry_count++))
done
log_warn "在日志中未找到临时密码"
return 1
}
# 显示安装摘要
show_summary() {
log_step "=== MySQL安装完成 ==="
echo ""
echo "安装信息摘要:"
echo "├─ MySQL状态: $(systemctl is-active mysqld 2>/dev/null || echo '未知')"
echo "├─ 服务端口: ${MYSQL_PORT}"
echo "├─ 数据目录: /var/lib/mysql"
echo "├─ 配置文件: /etc/my.cnf (原始配置备份: /etc/my.cnf.bak)"
echo "├─ 日志文件: /var/log/mysqld.log"
echo "├─ 字符集: utf8mb4"
echo "└─ 安装目录: ${MYSQL_DIR}"
echo ""
echo "=== 重要: 请手动完成以下步骤 ==="
echo ""
echo "1. 获取临时密码:"
echo " grep 'temporary password' /var/log/mysqld.log"
echo ""
echo "2. 使用临时密码登录MySQL:"
echo " mysql -uroot -p'临时密码'"
echo ""
echo "3. 修改root密码:"
echo " ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';"
echo ""
echo "5. 启用远程访问(可选):"
echo " CREATE USER '用户名'@'%' IDENTIFIED BY '密码';"
echo " GRANT ALL PRIVILEGES ON *.* TO '用户名'@'%';"
echo " FLUSH PRIVILEGES;"
echo ""
echo "6. 如果忘记临时密码,可重置密码:"
echo " a. 停止MySQL: systemctl stop mysqld"
echo " b. 编辑配置文件: vi /etc/my.cnf"
echo " c. 在[mysqld]段添加: skip-grant-tables"
echo " d. 启动MySQL: systemctl start mysqld"
echo " e. 无密码登录: mysql -uroot"
echo " f. 执行: UPDATE mysql.user SET authentication_string=PASSWORD('新密码') WHERE User='root';"
echo " g. 执行: FLUSH PRIVILEGES;"
echo " h. 退出MySQL并编辑配置文件删除skip-grant-tables"
echo " i. 重启MySQL: systemctl restart mysqld"
echo ""
echo "常用命令:"
echo "├─ 启动服务: systemctl start mysqld"
echo "├─ 停止服务: systemctl stop mysqld"
echo "├─ 重启服务: systemctl restart mysqld"
echo "├─ 查看状态: systemctl status mysqld"
echo "├─ 查看日志: tail -f /var/log/mysqld.log"
echo "└─ 设置开机启动: systemctl enable mysqld"
echo ""
# 显示当前MySQL版本
if command -v mysql &> /dev/null; then
echo "MySQL版本信息:"
mysql --version
fi
# 获取并显示临时密码
TEMP_PASSWORD=$(get_temp_password)
if [[ -n "$TEMP_PASSWORD" ]]; then
echo ""
echo "检测到的临时密码: $TEMP_PASSWORD"
echo "登录命令: mysql -uroot -p'$TEMP_PASSWORD'"
else
echo ""
echo "未找到临时密码,请检查日志文件: /var/log/mysqld.log"
fi
echo ""
echo "安全建议:"
echo "1. 安装后立即修改root密码"
echo "2. 为应用创建专用用户,避免使用root用户"
echo "3. 定期备份数据库"
echo "4. 配置适当的防火墙规则"
echo ""
}
# 主函数
main() {
log_step "开始MySQL手动安装配置"
echo "========================================"
echo "MySQL安装目录: ${MYSQL_DIR}"
echo "MySQL 端口: ${MYSQL_PORT}"
echo "========================================"
echo "注意: 此脚本不包含自动修改密码功能"
echo "安装后请手动修改MySQL root密码"
echo "========================================"
echo ""
# 检查root权限
check_root
# 检查MySQL包
check_mysql_packages
# 检查已安装的MySQL
check_existing_mysql
# 安装依赖
install_dependencies
# 安装MySQL RPM包
install_mysql_rpms
# 初始化数据目录
initialize_mysql
# 配置MySQL
configure_mysql
# 启动MySQL服务
if ! start_mysql_service; then
log_error "MySQL服务启动失败,请检查以上错误信息"
exit 1
fi
# 等待MySQL完全启动
sleep 5
# 显示摘要
show_summary
log_info "脚本执行完成!"
echo ""
echo "下一步操作:"
echo "1. 获取临时密码: grep 'temporary password' /var/log/mysqld.log"
echo "2. 使用临时密码登录MySQL"
echo "3. 修改root密码"
echo "4. 配置其他用户和权限"
echo ""
}
# 执行主函数
main "$@"
3.修改密码和授权
密码修改
#查看临时密码
grep 'password' /var/log/mysqld.log
#修改mysql密码
mysqladmin -uroot -p'临时密码' password '需要修改的密码'
mysqladmin -uroot -p'o?=RfHasu7Cg' password 'Admin123.'
授权
mysql -uroot -p
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'IDENTIFIED BY 'Admin123.' WITH GRANT OPTION;
-- 最后刷新
FLUSH PRIVILEGES;
四、jdk部署
创建文件夹,上传jdk
mkdir /opt/soft/jdk && cd /opt/soft/jdk
#上传jdk后解压
unzip jdk1.8.0_121.zip
执行以下脚本,vim install-jdk.sh
#!/bin/bash
# JDK 自动化安装脚本
# 使用说明:以root用户运行此脚本
set -e # 遇到错误时退出脚本
# 定义颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # 恢复默认颜色
echo -e "${GREEN}开始安装JDK 1.8.0_121...${NC}"
# 检查当前目录
CURRENT_DIR=$(pwd)
echo -e "${YELLOW}当前目录: ${CURRENT_DIR}${NC}"
# 检查JDK目录是否存在
if [ ! -d "jdk1.8.0_121" ]; then
echo -e "${RED}错误: 在当前目录未找到 jdk1.8.0_121 目录${NC}"
echo "请确保在 /opt/soft/jdk 目录下存在解压后的 jdk1.8.0_121 目录"
exit 1
fi
# 创建目标目录
echo -e "${YELLOW}创建 /usr/local/java 目录...${NC}"
mkdir -p /usr/local/java
# 移动JDK
echo -e "${YELLOW}移动JDK到 /usr/local/java...${NC}"
mv jdk1.8.0_121 /usr/local/java/
# 设置权限
echo -e "${YELLOW}设置可执行权限...${NC}"
chmod +x /usr/local/java/jdk1.8.0_121/bin/*
chmod +x /usr/local/java/jdk1.8.0_121/jre/bin/*
# 备份原有的环境变量文件
echo -e "${YELLOW}备份 /etc/profile 文件...${NC}"
cp /etc/profile /etc/profile.bak.$(date +%Y%m%d%H%M%S)
# 追加环境变量配置
echo -e "${YELLOW}配置环境变量...${NC}"
# 检查是否已配置JAVA_HOME
if grep -q "JAVA_HOME=/usr/local/java/jdk1.8.0_121" /etc/profile; then
echo -e "${YELLOW}环境变量已存在,跳过配置${NC}"
else
cat >> /etc/profile << 'EOF'
# Java Environment Variables
export JAVA_HOME=/usr/local/java/jdk1.8.0_121
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=$JAVA_HOME/lib:${JRE_HOME}/lib:$CLASSPATH
export JAVA_PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin
export PATH=$PATH:$HOME/bin:$JAVA_HOME/bin
EOF
echo -e "${GREEN}环境变量配置完成${NC}"
fi
# 创建符号链接(可选,兼容某些应用)
echo -e "${YELLOW}创建Java符号链接...${NC}"
ln -sf /usr/local/java/jdk1.8.0_121 /usr/local/java/default
# 刷新环境变量
echo -e "${YELLOW}刷新环境变量...${NC}"
source /etc/profile
# 验证安装
echo -e "${YELLOW}验证Java安装...${NC}"
java -version
if [ $? -eq 0 ]; then
echo -e "${GREEN}========================================${NC}"
echo -e "${GREEN}JDK 安装成功!${NC}"
echo -e "${GREEN}Java 已安装到: /usr/local/java/jdk1.8.0_121${NC}"
echo -e "${GREEN}========================================${NC}"
# 显示Java信息
echo -e "${YELLOW}Java 详细信息:${NC}"
/usr/local/java/jdk1.8.0_121/bin/java -version
else
echo -e "${RED}JDK 安装失败,请检查错误信息${NC}"
exit 1
fi
# 设置用户级别的环境变量(可选)
echo -e "${YELLOW}是否要为当前用户设置环境变量?(y/n)${NC}"
read -r response
if [[ "$response" =~ ^([yY][eE][sS]|[yY])$ ]]; then
USER_HOME=$HOME
if [ -f "$USER_HOME/.bashrc" ]; then
echo -e "${YELLOW}在 ~/.bashrc 中添加环境变量...${NC}"
cat >> $USER_HOME/.bashrc << 'EOF'
# Java Environment Variables
export JAVA_HOME=/usr/local/java/jdk1.8.0_121
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=$JAVA_HOME/lib:${JRE_HOME}/lib:$CLASSPATH
export JAVA_PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin
export PATH=$PATH:$HOME/bin:$JAVA_HOME/bin
EOF
source $USER_HOME/.bashrc
echo -e "${GREEN}用户环境变量已设置${NC}"
fi
fi
echo -e "${GREEN}安装完成!${NC}"
五、nacos部署
Nacos 是一个动态服务发现、配置管理和服务管理平台,由阿里巴巴开源并贡献给 Apache 基金会,现在是 Apache 顶级项目。
1.下载nacos
#创建目录
mkdir -p /opt/soft/nacos && cd /opt/soft/nacos
#下载
wget https://github.com/alibaba/nacos/releases/download/2.0.2/nacos-server-2.0.2.tar.gz
#解压
tar -zxf nacos-server-2.0.2.tar.gz
#移动包
mv /opt/soft/nacos/nacos /usr/local/
2.修改配置文件
vim /usr/local/nacos/conf/application.properties
#找到数据库连接,取消注释修改为自己的
# db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
# db.user.0=nacos
# db.password.0=nacos
3.创建数据库导入数据
创建nacos数据库,将解压的包里面的conf目录中nacos-mysql.sql导入到数据库中
4.启动nacos
cd /usr/local/nacos/bin
./startup.sh -m standalone
#打开浏览器
http://ip:8848/nacos/
默认用户名密码:nacos/nacos
六、前端部署
1.nginx安装
mkdir -p /opt/soft/nginx
vim install-nginx.sh
执行以下脚本
#!/bin/bash
# Nginx 安装脚本
# 版本: 1.0
# 描述: 自动安装 Nginx 1.18.0 版本
set -e # 遇到错误时退出脚本
set -u # 使用未初始化的变量时报错
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
# 日志函数
log_info() {
echo -e "${GREEN}[INFO]${NC} $(date '+%Y-%m-%d %H:%M:%S') - $1"
}
log_warn() {
echo -e "${YELLOW}[WARN]${NC} $(date '+%Y-%m-%d %H:%M:%S') - $1"
}
log_error() {
echo -e "${RED}[ERROR]${NC} $(date '+%Y-%m-%d %H:%M:%S') - $1"
}
# 检查是否以root用户运行
check_root() {
if [[ $EUID -ne 0 ]]; then
log_error "此脚本必须以root权限运行"
exit 1
fi
log_info "root权限检查通过"
}
# 安装依赖
install_dependencies() {
log_info "开始安装系统依赖..."
# 更新yum缓存
yum makecache fast
# 安装依赖包
yum -y install gcc gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel wget tar
if [[ $? -eq 0 ]]; then
log_info "系统依赖安装完成"
else
log_error "系统依赖安装失败"
exit 1
fi
}
# 创建目录
create_directories() {
log_info "创建Nginx安装目录..."
# 创建安装目录
mkdir -p /usr/local/nginx
# 创建软件包存放目录
mkdir -p /opt/soft/nginx
log_info "目录创建完成"
}
# 下载Nginx源码
download_nginx() {
log_info "开始下载Nginx源码包..."
cd /opt/soft/nginx || exit 1
local nginx_version="1.18.0"
local nginx_file="nginx-${nginx_version}.tar.gz"
local nginx_url="https://nginx.org/download/nginx-${nginx_version}.tar.gz"
# 检查是否已存在源码包
if [[ -f "$nginx_file" ]]; then
log_warn "Nginx源码包已存在,跳过下载"
else
wget "$nginx_url"
if [[ $? -ne 0 ]]; then
log_error "下载Nginx源码包失败"
exit 1
fi
log_info "Nginx源码包下载完成"
fi
}
# 解压源码包
extract_nginx() {
log_info "解压Nginx源码包..."
cd /opt/soft/nginx || exit 1
local nginx_version="1.18.0"
local nginx_file="nginx-${nginx_version}.tar.gz"
if [[ ! -f "$nginx_file" ]]; then
log_error "Nginx源码包不存在: $nginx_file"
exit 1
fi
tar -zxvf "$nginx_file"
if [[ $? -eq 0 ]]; then
log_info "Nginx源码包解压完成"
else
log_error "Nginx源码包解压失败"
exit 1
fi
}
# 编译安装Nginx
compile_install_nginx() {
log_info "开始编译安装Nginx..."
cd "/opt/soft/nginx/nginx-1.18.0" || exit 1
# 配置编译参数
log_info "配置编译参数..."
./configure --user=root \
--group=root \
--prefix=/usr/local/nginx \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-http_sub_module \
--with-stream \
--with-stream_ssl_module \
--with-openssl-opt=enable-weak-ssl-ciphers
if [[ $? -ne 0 ]]; then
log_error "配置阶段失败"
exit 1
fi
# 编译
log_info "开始编译..."
make
if [[ $? -ne 0 ]]; then
log_error "编译失败"
exit 1
fi
# 安装
log_info "开始安装..."
make install
if [[ $? -eq 0 ]]; then
log_info "Nginx安装完成"
else
log_error "安装失败"
exit 1
fi
}
# 显示安装信息
show_installation_info() {
log_info "========== Nginx 安装完成 =========="
log_info "安装目录: /usr/local/nginx"
log_info "配置文件: /usr/local/nginx/conf/nginx.conf"
log_info "启动命令: /usr/local/nginx/sbin/nginx"
log_info "停止命令: /usr/local/nginx/sbin/nginx -s stop"
log_info "重启命令: /usr/local/nginx/sbin/nginx -s reload"
log_info "测试配置: /usr/local/nginx/sbin/nginx -t"
log_info "版本检查: /usr/local/nginx/sbin/nginx -v"
log_info "===================================="
echo ""
echo -e "${GREEN}安装完成!请执行以下命令启动Nginx:${NC}"
echo -e "${YELLOW}/usr/local/nginx/sbin/nginx${NC}"
echo ""
echo -e "${GREEN}验证安装:${NC}"
echo -e "${YELLOW}/usr/local/nginx/sbin/nginx -v${NC}"
echo ""
echo -e "${GREEN}测试配置文件:${NC}"
echo -e "${YELLOW}/usr/local/nginx/sbin/nginx -t${NC}"
}
# 主函数
main() {
clear
echo "=========================================="
echo " Nginx 自动安装脚本 "
echo "=========================================="
echo ""
# 检查root权限
check_root
# 执行安装步骤
install_dependencies
create_directories
download_nginx
extract_nginx
compile_install_nginx
show_installation_info
}
# 执行主函数
main "$@"
2.上传前端项目
直接删除nginx默认的页面或者备份
rm -f /usr/local/nginx/html/*
#上传前端到
/usr/local/nginx/html/
3.nginx配置文件
将原来的配置文件替换成下面的
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
server {
listen 80;
server_name localhost;
# 前端静态资源
location / {
root /usr/local/nginx/html;
index index.html;
try_files $uri $uri/ /index.html;
}
# API反向代理到后端网关
location /api/ {
proxy_pass http://localhost:8080/api/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# 跨域配置
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Methods 'GET, POST, PUT, DELETE, OPTIONS';
add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';
add_header Access-Control-Expose-Headers 'Authorization';
if ($request_method = 'OPTIONS') {
return 204;
}
}
# 文件上传路径代理
location /uploads/ {
proxy_pass http://localhost:8080/uploads/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
# Gzip压缩
gzip on;
gzip_min_length 1k;
gzip_comp_level 6;
gzip_types text/plain text/css text/javascript application/json application/javascript application/x-javascript application/xml;
gzip_vary on;
}
}
4.启动nginx
#启动nginx后浏览器访问,此时前端部署好了,但是没有数据
http://ip
七、redis部署
1.创建目录上传包
mkdir -p /opt/soft/redis && cd /opt/soft/redis
执行以下脚本vim install-redis.sh
#!/bin/bash
# Redis安装脚本
# 版本:5.0.13
# 安装路径:/usr/local/redis
set -e # 遇到错误立即退出
# 定义变量
REDIS_VERSION="5.0.13"
REDIS_SOURCE_DIR="/opt/soft/redis"
REDIS_TARBALL="redis-${REDIS_VERSION}.tar.gz"
REDIS_SOURCE_PATH="${REDIS_SOURCE_DIR}/${REDIS_TARBALL}"
REDIS_EXTRACT_DIR="${REDIS_SOURCE_DIR}/redis-${REDIS_VERSION}"
REDIS_INSTALL_DIR="/usr/local/redis"
REDIS_CONF_DIR="${REDIS_INSTALL_DIR}/conf"
REDIS_CONF_FILE="${REDIS_CONF_DIR}/redis.conf"
# 检查源码包是否存在
if [ ! -f "${REDIS_SOURCE_PATH}" ]; then
echo "错误: Redis源码包 ${REDIS_TARBALL} 不存在于 ${REDIS_SOURCE_DIR}"
exit 1
fi
# 步骤1: 安装编译依赖
echo "正在安装编译依赖..."
if yum -y install gcc-c++; then
echo "编译依赖安装成功"
else
echo "错误: 编译依赖安装失败"
exit 1
fi
# 步骤2: 解压源码包
echo "正在解压Redis源码包..."
cd "${REDIS_SOURCE_DIR}"
if [ -d "${REDIS_EXTRACT_DIR}" ]; then
echo "检测到已存在的源码目录,跳过解压"
else
tar -zxvf "${REDIS_TARBALL}"
echo "Redis源码解压完成"
fi
# 步骤3: 创建安装目录
echo "正在创建安装目录..."
mkdir -p "${REDIS_INSTALL_DIR}/conf"
echo "安装目录创建完成: ${REDIS_INSTALL_DIR}"
# 步骤4: 编译安装
echo "正在编译安装Redis..."
cd "${REDIS_EXTRACT_DIR}"
make PREFIX="${REDIS_INSTALL_DIR}" install
if [ $? -eq 0 ]; then
echo "Redis编译安装成功"
else
echo "错误: Redis编译安装失败"
exit 1
fi
# 步骤5: 复制配置文件
echo "正在复制配置文件..."
cp "${REDIS_EXTRACT_DIR}/redis.conf" "${REDIS_CONF_FILE}"
echo "配置文件已复制到: ${REDIS_CONF_FILE}"
# 步骤6: 配置Redis
echo "正在配置Redis..."
# 备份原始配置文件
cp "${REDIS_CONF_FILE}" "${REDIS_CONF_FILE}.bak"
# 使用sed修改配置文件
sed -i 's/^bind.*/bind 0.0.0.0/' "${REDIS_CONF_FILE}" # 允许所有IP连接
sed -i 's/^protected-mode.*/protected-mode yes/' "${REDIS_CONF_FILE}"
sed -i 's/^port.*/port 6379/' "${REDIS_CONF_FILE}"
sed -i 's/^daemonize.*/daemonize yes/' "${REDIS_CONF_FILE}" # 后台运行
sed -i 's/^pidfile.*/pidfile \/var\/run\/redis_6379.pid/' "${REDIS_CONF_FILE}"
sed -i 's/^dir.*/dir .\//' "${REDIS_CONF_FILE}" # 数据保存路径
sed -i 's/^appendonly.*/appendonly no/' "${REDIS_CONF_FILE}"
echo "Redis配置完成"
# 步骤7: 显示安装信息
echo -e "\n==================== Redis安装完成 ===================="
echo "安装目录: ${REDIS_INSTALL_DIR}"
echo "配置文件: ${REDIS_CONF_FILE}"
echo "二进制文件位置: ${REDIS_INSTALL_DIR}/bin/"
echo "数据目录: ${REDIS_INSTALL_DIR}"
echo "======================================================"
echo -e "\n启动Redis命令:"
echo "${REDIS_INSTALL_DIR}/bin/redis-server ${REDIS_CONF_FILE}"
echo -e "\n连接Redis命令:"
echo "${REDIS_INSTALL_DIR}/bin/redis-cli -h 127.0.0.1 -p 6379"
八、后端部署
1.创建数据库导入数据
创建blog数据库,把数据导入到数据库中
2.项目上传
mkdir -p /opt/web/{blog-gateway,blog-home,blog-admin}
#切换到对应目录上传对应的包
3.修改配置文件
1.修改gateway配置文件
#vim bootstrap.yml
spring:
application:
name: blog-gateway
cloud:
nacos:
discovery:
server-addr: localhost:8848 #修改
username: nacos #修改
password: nacos #修改
namespace: public
group: DEFAULT_GROUP
service: ${spring.application.name}
config:
server-addr: localhost:8848 #修改
username: nacos #修改
password: nacos #修改
namespace: public
group: DEFAULT_GROUP
file-extension: yml
shared-configs:
- data-id: common.yml
group: DEFAULT_GROUP
refresh: true
#vim application.yml
server:
port: 8080
spring:
application:
name: blog-gateway
cloud:
nacos:
discovery:
server-addr: localhost:8848 #修改
username: nacos #修改
password: nacos #修改
group: DEFAULT_GROUP
namespace: public
cluster-name: DEFAULT
gateway:
globalcors:
cors-configurations:
'[/**]':
allowedOriginPatterns: "*"
allowedMethods:
- GET
- POST
- PUT
- DELETE
- OPTIONS
allowedHeaders: "*"
allowCredentials: true
maxAge: 3600
routes:
# Blog Home 路由配置
- id: blog-home
uri: lb://blog-home
predicates:
- Path=/api/home/**
filters:
- StripPrefix=2 # 去掉 /api/home 两层路径
# Blog Admin 路由配置
- id: blog-admin
uri: lb://blog-admin
predicates:
- Path=/api/admin/**
filters:
- StripPrefix=2 # 去掉 /api/admin 两层路径
# 日志配置
logging:
level:
root: INFO
org.springframework.cloud.gateway: DEBUG
# Actuator 配置
management:
endpoints:
web:
exposure:
include: '*'
endpoint:
health:
show-details: always
2.修改blog-home
#vim application.yml
server:
port: 8081
spring:
application:
name: blog-home
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/blog?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai #修改
username: root #修改
password: Admin123. #修改
cloud:
nacos:
discovery:
server-addr: localhost:8848 #修改
username: nacos #修改
password: nacos #修改
group: DEFAULT_GROUP
namespace: public
cluster-name: DEFAULT
redis:
host: localhost #修改
port: 6379
password:
database: 0
mybatis-plus:
mapper-locations: classpath*:/mapper/**/*.xml
type-aliases-package: com.homeservice.entity
global-config:
db-config:
id-type: auto
logic-delete-field: deleted
logic-delete-value: 1
logic-not-delete-value: 0
configuration:
map-underscore-to-camel-case: true
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
# JWT配置
jwt:
secret: blog-secret-key-for-jwt-token-generation-must-be-at-least-256-bits
expiration: 86400000
header: Authorization
# 日志配置
logging:
level:
root: INFO
com.homeservice: DEBUG
com.baomidou: DEBUG
org.springframework.jdbc: DEBUG
java.sql: DEBUG
org.springframework.boot.autoconfigure.jdbc: DEBUG
com.zaxxer.hikari: DEBUG
# Actuator配置
management:
endpoints:
web:
exposure:
include: '*'
endpoint:
health:
show-details: always
3.修改blog-admin
#vim application.yml
server:
port: 8082
spring:
application:
name: blog-admin
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/blog?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai #修改
username: root #修改
password: Admin123. #修改
cloud:
nacos:
discovery:
server-addr: localhost:8848 #修改
username: nacos #修改
password: nacos #修改
group: DEFAULT_GROUP
namespace: public
cluster-name: DEFAULT
redis:
host: localhost #修改
port: 6379
password:
database: 0
servlet:
multipart:
enabled: true
max-file-size: 20MB
max-request-size: 20MB
mybatis-plus:
mapper-locations: classpath*:/mapper/**/*.xml
type-aliases-package: com.adminservice.entity
global-config:
db-config:
id-type: auto
logic-delete-field: deleted
logic-delete-value: 1
logic-not-delete-value: 0
configuration:
map-underscore-to-camel-case: true
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
# JWT配置
jwt:
secret: blog-secret-key-for-jwt-token-generation-must-be-at-least-256-bits
expiration: 86400000
header: Authorization
# 文件上传配置
upload:
path: D:/blog-uploads
url-prefix: http://localhost:8080/uploads
# 日志配置
logging:
level:
root: INFO
com.adminservice: DEBUG
com.baomidou: DEBUG
org.springframework.jdbc: DEBUG
java.sql: DEBUG
org.springframework.boot.autoconfigure.jdbc: DEBUG
com.zaxxer.hikari: DEBUG
# Actuator配置
management:
endpoints:
web:
exposure:
include: '*'
endpoint:
health:
show-details: always
4.启动项目
java -jar xxx.jar
#或脚本
5.接口验证
1.前台页面blog数据
#get方法
http://ip:8080/api/home/articles