ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

JSH-ERP 传统部署 + Nginx 反向代理 + 统一日志收集完整实施文档

JSH-ERP 传统部署 + Nginx 反向代理 + 统一日志收集完整实施文档

一、项目说明与考核标准

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 unzip

2.2 统一时区(Asia / 上海)

bash

timedatectl set-timezone Asia/Shanghai timedatectl

2.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-all

2.4 关闭 SELinux(实验环境)

bash

setenforce 0 sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config getenforce

2.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 make
3.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/redis

3.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.conf
3.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 6379

3.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/profile
3.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.xml

3.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.yml
3.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.jar
3.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.html

3.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.com

3.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 -v

4.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.html

4.3 ERP 系统验收测试

浏览器访问http://10.8.0.10

  1. 登录页面正常加载
  2. 超管账号:admin / 123456;租户账号:jsh / 123456
  3. 采购 / 销售 / 库存菜单正常打开,新增业务数据可保存入库
  4. 深层路由刷新无 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 kibana
5.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:9200
5.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:5601

5.2 采集端 Filebeat 部署(10.8.0.10 执行)

5.2.1 安装 Filebeat

bash

yum install -y filebeat
5.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 -f

5.3 日志检索验收标准

  1. 访问http://10.8.0.11:5601,创建索引模式erp-logs-*
  2. 可按 service 字段过滤:service:jsh-erpservice:nginxservice:mysql8
  3. 支持关键字全文检索(如搜索errorException502login
  4. 实时刷新日志,可查看完整堆栈、接口请求、数据库报错信息
  5. 区分主机 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 kibana

6.2 停止顺序(逆序)

bash

systemctl stop nginx systemctl stop jsh-erp systemctl stop redis systemctl stop mysqld systemctl stop filebeat # 日志服务端 systemctl stop kibana systemctl stop elasticsearch

6.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

八、常见故障排查清单

  1. 后端报Public Key Retrieval is not allowed:application.yml 追加&allowPublicKeyRetrieval=true
  2. 页面 502 Bad Gateway:检查 jsh-erp 服务是否启动、9999 端口监听、proxy_pass 路径完整
  3. 前端刷新 404:确认 erp.conf 存在try_files $uri $uri/ /index.html;
  4. Filebeat 无日志:检查文件路径权限、ES 地址连通性、防火墙 9200 端口放行
  5. Kibana 检索不到日志:核对 index 索引名称、Filebeat tags/fields 配置正确
  6. MySQL 连接失败:确认 root 密码 123456、数据库 jsh_erp 已创建、SQL 导入完成
返回列表