一、项目说明与考核标准
1. 服务器环境
部署节点:10.8.0.10(ERP 业务主节点,MySQL/Redis/JDK/Maven/Node/Nginx/ERP 后端 / Filebeat 全部部署于此) 日志存储检索节点:10.8.0.11(部署 Elasticsearch+Kibana,统一归集全量日志) 辅助节点:10.8.0.12、10.8.0.13(预留扩展,本次仅部署单机 ERP) 系统:CentOS 7.9 x86_64 资源:2 核 8G,磁盘 50G
2. 技术栈清单
- 后端:SpringBoot 2.0.0、JDK8、Maven3.8.6
- 数据库:MySQL8.0.46
- 缓存:Redis6.2.14(源码编译)
- 前端:Vue2、Node16.20.2、npm
- Web 反向代理:Nginx1.26.1
- 日志方案:Filebeat (采集) + Elasticsearch (存储) + Kibana (检索可视化)
二、第一部分:基础系统环境初始化(10.8.0.10 执行)
2.1 安装基础工具
bash
yum install -y wget git vim net-tools lrzsz tree unzip2.2 统一时区(Asia / 上海)
bash
timedatectl set-timezone Asia/Shanghai timedatectl2.3 防火墙放行 80 端口(仅对外端口)
bash
systemctl enable --now firewalld firewall-cmd --permanent --add-port=80/tcp # 日志节点开放ES/Kibana端口(10.8.0.11执行) firewall-cmd --permanent --add-port=9200/tcp firewall-cmd --permanent --add-port=5601/tcp firewall-cmd --reload firewall-cmd --list-all2.4 关闭 SELinux(实验环境)
bash
setenforce 0 sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config getenforce2.5 创建业务所需固定目录
bash
# ERP总目录 mkdir -p /usr/local/jsh-erp /usr/local/jsh-erp/web /usr/local/jsh-erp/logs # 应用上传/导出/临时目录 mkdir -p /opt/tmp/tomcat /opt/jshERP/upload /opt/jshERP/export # Redis、Maven、Node安装目录 mkdir -p /usr/local/redis /usr/local/maven /usr/local/node # 日志备份、数据库备份目录 mkdir -p /backup/mysql /usr/local/logs_all三、第二部分:ERP 系统部署
3.1 部署 MySQL 8.0
3.1.1 安装 MySQL 官方 YUM 源 + 修复 2023 公钥
bash
cd /usr/local/src wget https://dev.mysql.com/get/mysql80-community-release-el7-7.noarch.rpm rpm -ivh mysql80-community-release-el7-7.noarch.rpm # 导入新版GPG密钥 wget -O /etc/pki/rpm-gpg/RPM-GPG-KEY-mysql-2023 https://repo.mysql.com/RPM-GPG-KEY-mysql-2023 rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-mysql-2023 sed -i 's|gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql-2022|&\nfile:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql-2023|' /etc/yum.repos.d/mysql-community.repo # 安装MySQL服务端 yum install -y mysql-community-server systemctl enable --now mysqld mysql --version优先做标红部分
3.1.2 修改 Root 密码(分步兼容策略)
bash
# 查看临时密码 grep 'temporary password' /var/log/mysqld.log # 登录,替换临时密码 mysql -uroot -p'临时密码' --connect-expired-password # 执行SQL ALTER USER 'root'@'localhost' IDENTIFIED BY 'Aa123qwe!'; SET GLOBAL validate_password.policy=LOW; SET GLOBAL validate_password.length=6; ALTER USER 'root'@'localhost' IDENTIFIED BY '123456'; FLUSH PRIVILEGES; exit;3.1.3 验证 MySQL 连通性
bash
mysqladmin -uroot -p123456 ping mysql -uroot -p123456 -h127.0.0.1 -e "SELECT VERSION();"3.2 编译部署 Redis 6.2.14
3.2.1 安装高版本 GCC 编译环境
bash
yum install -y centos-release-scl # 替换SCL源为阿里云vault镜像 sed -i 's|^mirrorlist=http://mirrorlist.centos.org|#&|' /etc/yum.repos.d/CentOS-SCLo-scl.repo /etc/yum.repos.d/CentOS-SCLo-scl-rh.repo sed -i 's|^# *baseurl=http://mirror.centos.org/centos/7/sclo/$basearch/sclo/|baseurl=https://mirrors.aliyun.com/centos-vault/7.9.2009/sclo/$basearch/sclo/|' /etc/yum.repos.d/CentOS-SCLo-scl.repo sed -i 's|^# *baseurl=http://mirror.centos.org/centos/7/sclo/$basearch/rh/|baseurl=https://mirrors.aliyun.com/centos-vault/7.9.2009/sclo/$basearch/rh/|' /etc/yum.repos.d/CentOS-SCLo-scl-rh.repo yum clean all yum install -y devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils make3.2.2 下载编译 Redis
bash
cd /usr/local/src wget https://download.redis.io/releases/redis-6.2.14.tar.gz tar xzf redis-6.2.14.tar.gz cd redis-6.2.14 scl enable devtoolset-9 "make -j2" make install PREFIX=/usr/local/redis3.2.3 配置 redis.conf(仅本地访问 + 密码)
bash
mkdir -p /usr/local/redis/conf /var/log/redis /var/lib/redis cp /usr/local/src/redis-6.2.14/redis.conf /usr/local/redis/conf/redis.conf cd /usr/local/redis/conf sed -i 's/^# bind 127.0.0.1 -::1/bind 127.0.0.1/' redis.conf sed -i 's/^daemonize no/daemonize yes/' redis.conf sed -i 's|^logfile ""|logfile "/var/log/redis/redis.log"|' redis.conf sed -i 's|^dir ./|dir /var/lib/redis|' redis.conf sed -i 's/^# requirepass foobared/requirepass 1234abcd/' redis.conf3.2.4 配置 systemd 托管 Redis
bash
cat > /usr/lib/systemd/system/redis.service <<'EOF' [Unit] Description=Redis persistent key-value database After=network.target [Service] Type=forking ExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf ExecStop=/usr/local/redis/bin/redis-cli -a 1234abcd shutdown Restart=on-failure LimitNOFILE=65536 [Install] WantedBy=multi-user.target EOF systemctl daemon-reload systemctl enable --now redis # 验证 /usr/local/redis/bin/redis-cli -a 1234abcd ping ss -lntp | grep 63793.3 JDK8 + Maven3.8.6 安装
3.3.1 JDK8
bash
yum install -y java-1.8.0-openjdk-devel java -version # 写入全局环境变量 cat >> /etc/profile <<'EOF' export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk export PATH=$JAVA_HOME/bin:$PATH EOF source /etc/profile3.3.2 Maven3.8.6
bash
cd /usr/local/src wget https://mirrors.huaweicloud.com/apache/maven/maven-3/3.8.6/binaries/apache-maven-3.8.6-bin.tar.gz tar xzf apache-maven-3.8.6-bin.tar.gz -C /usr/local/ mv /usr/local/apache-maven-3.8.6 /usr/local/maven # 环境变量 cat >> /etc/profile <<'EOF' export MAVEN_HOME=/usr/local/maven export PATH=$MAVEN_HOME/bin:$PATH EOF source /etc/profile mvn -version # 配置阿里云Maven镜像 perl -0777 -pe 's| </mirrors>| <mirror>\n<id>aliyunmaven</id>\n<mirrorOf>*</mirrorOf>\n<name>aliyun public repo</name>\n<url>https://maven.aliyun.com/repository/public</url>\n</mirror>\n </mirrors>|' /usr/local/maven/conf/settings.xml > /tmp/settings_new.xml mv /tmp/settings_new.xml /usr/local/maven/conf/settings.xml3.4 拉取 ERP 源码并修改配置
3.4.1 浅克隆源码(避免 gitee 网络报错)
bash
git clone --depth 1 https://gitee.com/jishenghua/JSH_ERP.git /tmp/jsh_clone cp -a /tmp/jsh_clone/. /usr/local/jsh-erp/ ls /usr/local/jsh-erp/3.4.2 修改 application.yml 数据库连接参数
bash
cd /usr/local/jsh-erp/jshERP-boot/src/main/resources cp application.yml{,.bak} sed -i 's|useSSL=false$|useSSL=false\&serverTimezone=Asia/Shanghai\&allowPublicKeyRetrieval=true|' application.yml # 查看修改后的JDBC地址 grep 'url:' application.yml3.4.3 初始化 MySQL 业务库并导入 SQL
bash
mysql -uroot -p123456 -e "CREATE DATABASE IF NOT EXISTS jsh_erp DEFAULT CHARACTER SET utf8mb4;" mysql -uroot -p123456 jsh_erp < /usr/local/jsh-erp/jshERP-boot/docs/jsh_erp.sql # 验证表数量(预期32张) mysql -uroot -p123456 -e "SELECT COUNT(*) FROM information_schema.tables WHERE table_schema='jsh_erp';"3.5 SpringBoot 后端打包 + systemd 托管启动
3.5.1 Maven 打包(跳过测试)
bash
source /etc/profile cd /usr/local/jsh-erp/jshERP-boot mvn clean package -Dmaven.test.skip=true # 确认产物 ls -lh target/jshERP.jar3.5.2 创建后端服务单元
bash
cat > /usr/lib/systemd/system/jsh-erp.service <<'EOF' [Unit] Description=JSH ERP Spring Boot Service After=network.target mysqld.service redis.service [Service] Type=simple Environment=JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk WorkingDirectory=/usr/local/jsh-erp/jshERP-boot ExecStart=/usr/bin/java -jar /usr/local/jsh-erp/jshERP-boot/target/jshERP.jar Restart=on-failure RestartSec=5 SuccessExitStatus=143 [Install] WantedBy=multi-user.target EOF systemctl daemon-reload systemctl enable --now jsh-erp # 查看启动日志 journalctl -u jsh-erp -f # 验证端口9999监听 ss -lntp | grep 9999 # 接口访问测试 curl http://127.0.0.1:9999/jshERP-boot/doc.html3.6 前端 Vue 打包部署
3.6.1 安装 Node16.20.2(CentOS7 兼容版本)
bash
cd /usr/local/src wget https://cdn.npmmirror.com/binaries/node/v16.20.2/node-v16.20.2-linux-x64.tar.xz tar xJf node-v16.20.2-linux-x64.tar.xz -C /usr/local/ mv /usr/local/node-v16.20.2-linux-x64 /usr/local/node ln -sf /usr/local/node/bin/node /usr/bin/node ln -sf /usr/local/node/bin/npm /usr/bin/npm node -v npm config set registry https://registry.npmmirror.com3.6.2 安装依赖 + 构建 dist
bash
cd /usr/local/jsh-erp/jshERP-web npm install --legacy-peer-deps npm run build # 部署静态文件 cp -r dist/* /usr/local/jsh-erp/web/ chmod -R 755 /usr/local/jsh-erp/web四、第三部分:Nginx 反向代理配置
4.1 安装 Nginx 官方源
bash
cat > /etc/yum.repos.d/nginx.repo <<'EOF' [nginx-stable] name=nginx stable repo baseurl=https://nginx.org/packages/centos/$releasever/$basearch/ gpgcheck=1 enabled=1 gpgkey=https://nginx.org/keys/nginx_signing.key EOF yum install -y nginx nginx -v4.2 ERP 专属站点配置(/etc/nginx/conf.d/erp.conf)
bash
cat > /etc/nginx/conf.d/erp.conf <<'EOF' server { listen 80; server_name localhost; gzip on; gzip_min_length 100; gzip_types text/plain text/css application/xml application/javascript; gzip_vary on; # 前端静态页面 location / { root /usr/local/jsh-erp/web; index index.html index.htm; try_files $uri $uri/ /index.html; # 解决刷新404 } # 后端接口反向代理 location /jshERP-boot/ { proxy_pass http://127.0.0.1:9999/jshERP-boot/; proxy_set_header Host $host:$server_port; proxy_set_header X-Real-IP $remote_addr; } } EOF # 删除默认站点 rm -f /etc/nginx/conf.d/default.conf # 校验配置+启动 nginx -t systemctl enable --now nginx # 验证前端访问 curl http://127.0.0.1 # 验证代理接口 curl http://127.0.0.1/jshERP-boot/doc.html4.3 ERP 系统验收测试
浏览器访问http://10.8.0.10
- 登录页面正常加载
- 超管账号:
admin / 123456;租户账号:jsh / 123456 - 采购 / 销售 / 库存菜单正常打开,新增业务数据可保存入库
- 深层路由刷新无 404 报错
五、第四部分:统一日志收集 ELK 部署
架构说明
- 采集端(10.8.0.10):Filebeat,采集 MySQL/Redis/Nginx/ERP 后端日志
- 存储检索端(10.8.0.11):Elasticsearch7.17 + Kibana7.17,统一存储、关键字检索
5.1 日志服务端部署(10.8.0.11 执行)
5.1.1 安装 ES+Kibana
bash
# 导入ELK公钥 rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch cat > /etc/yum.repos.d/elastic.repo <<EOF [elastic-7.x] name=Elastic repository for 7.x packages baseurl=https://artifacts.elastic.co/packages/7.x/yum gpgcheck=1 gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch enabled=1 autorefresh=1 type=rpm-md EOF yum install -y elasticsearch kibana5.1.2 Elasticsearch 配置
bash
vim /etc/elasticsearch/elasticsearch.yml # 修改核心参数 network.host: 0.0.0.0 http.port: 9200 discovery.type: single-node # 调整内存(2G) vim /etc/elasticsearch/jvm.options -Xms2g -Xmx2g # 启动ES systemctl enable --now elasticsearch curl http://127.0.0.1:92005.1.3 Kibana 配置
bash
vim /etc/kibana/kibana.yml server.host: "0.0.0.0" elasticsearch.hosts: ["http://127.0.0.1:9200"] systemctl enable --now kibana # 访问地址:http://10.8.0.11:56015.2 采集端 Filebeat 部署(10.8.0.10 执行)
5.2.1 安装 Filebeat
bash
yum install -y filebeat5.2.2 完整采集配置 /etc/filebeat/filebeat.yml
yaml
filebeat.inputs: # 1. ERP SpringBoot后端日志 - type: log enabled: true paths: - /usr/local/jsh-erp/logs/jsh-erp.log tags: ["erp-backend"] fields: service: jsh-erp host_ip: 10.8.0.10 fields_under_root: true # 2. Nginx访问日志 - type: log enabled: true paths: - /var/log/nginx/access.log tags: ["nginx-access"] fields: service: nginx host_ip: 10.8.0.10 fields_under_root: true # 3. Nginx错误日志 - type: log enabled: true paths: - /var/log/nginx/error.log tags: ["nginx-error"] fields: service: nginx host_ip: 10.8.0.10 fields_under_root: true # 4. MySQL日志 - type: log enabled: true paths: - /var/log/mysqld.log tags: ["mysql"] fields: service: mysql8 host_ip: 10.8.0.10 fields_under_root: true # 5. Redis日志 - type: log enabled: true paths: - /var/log/redis/redis.log tags: ["redis6"] fields: service: redis host_ip: 10.8.0.10 fields_under_root: true # 输出到远端ES服务端 output.elasticsearch: hosts: ["10.8.0.11:9200"] index: "erp-logs-%{+YYYY.MM.dd}" setup.kibana: host: "10.8.0.11:5601"5.2.3 启动 Filebeat 并验证采集
bash
# 校验配置文件 filebeat test config # 测试日志连通ES filebeat test output # 开机自启 systemctl enable --now filebeat # 实时查看采集日志 journalctl -u filebeat -f5.3 日志检索验收标准
- 访问
http://10.8.0.11:5601,创建索引模式erp-logs-* - 可按 service 字段过滤:
service:jsh-erp、service:nginx、service:mysql8 - 支持关键字全文检索(如搜索
error、Exception、502、login) - 实时刷新日志,可查看完整堆栈、接口请求、数据库报错信息
- 区分主机 IP,多节点扩展后可统一汇总检索
六、启停顺序与开机自启
6.1 启动顺序(正序)
bash
# 1.数据库 systemctl start mysqld # 2.缓存 systemctl start redis # 3.ERP后端 systemctl start jsh-erp # 4.Nginx前端入口 systemctl start nginx # 5.日志采集 systemctl start filebeat # 日志服务端(10.8.0.11) systemctl start elasticsearch systemctl start kibana6.2 停止顺序(逆序)
bash
systemctl stop nginx systemctl stop jsh-erp systemctl stop redis systemctl stop mysqld systemctl stop filebeat # 日志服务端 systemctl stop kibana systemctl stop elasticsearch6.3 开机自启全部已配置
bash
systemctl list-unit-files | grep -E "mysqld|redis|jsh-erp|nginx|filebeat|elasticsearch|kibana"七、数据库定时备份脚本(附加运维规范)
bash
# 创建备份脚本 cat > /backup/mysql_backup.sh <<'EOF' #!/bin/bash DATE=$(date +%F) # 全量备份,保留7天 mysqldump -uroot -p123456 --single-transaction --routines --triggers jsh_erp | gzip > /backup/mysql/jsh_erp_${DATE}.sql.gz find /backup/mysql -name "*.sql.gz" -mtime +7 -delete EOF chmod +x /backup/mysql_backup.sh # 定时任务 每日凌晨2点 echo "0 2 * * * /backup/mysql_backup.sh" >> /var/spool/cron/root crontab -l # 恢复示例 # gunzip < /backup/mysql/jsh_erp_2026-08-15.sql.gz | mysql -uroot -p123456 jsh_erp八、常见故障排查清单
- 后端报
Public Key Retrieval is not allowed:application.yml 追加&allowPublicKeyRetrieval=true - 页面 502 Bad Gateway:检查 jsh-erp 服务是否启动、9999 端口监听、proxy_pass 路径完整
- 前端刷新 404:确认 erp.conf 存在
try_files $uri $uri/ /index.html; - Filebeat 无日志:检查文件路径权限、ES 地址连通性、防火墙 9200 端口放行
- Kibana 检索不到日志:核对 index 索引名称、Filebeat tags/fields 配置正确
- MySQL 连接失败:确认 root 密码 123456、数据库 jsh_erp 已创建、SQL 导入完成