nginx+springboot+redis+mysql+elfk

文章目录

设备管理平台部署全流程:从环境搭建到ELK日志集成(附避坑指南)

最近刚完成一套设备管理平台的部署工作,用到了MySQL、Redis、Nginx、Java微服务和ELK日志体系,过程中踩了不少"雷"------比如文档里隐藏的IP限制、配置冗余、地址写错等问题。今天把完整流程和避坑要点整理出来,希望能帮到同样做运维或项目部署的朋友,少走弯路。

一、先搞懂环境规划:这些"红线"不能碰

部署前先明确节点分工,这是后续所有操作的基础。平台共涉及5个节点,每个节点的服务和核心限制如下:

节点名称 IP地址 运行服务 核心说明
mysql 172.16.0.100 mysql + filebeat IP不可修改,存业务数据
nginx 172.16.0.10 nginx + filebeat + kibana 前端访问入口+日志收集+可视化
java 172.16.0.11 openjdk + filebeat 微服务运行节点
redis 172.16.0.12 redis IP不可修改,缓存服务
elk 172.16.0.13 ES + logstash 日志存储和处理(资源要求高)

【必看避坑点】

  1. IP限制:MySQL(172.16.0.100)和Redis(172.16.0.12)的IP绝对不能改!微服务和前端配置里硬编码了这两个地址,改了会直接连接失败。
  2. 防火墙关闭 :所有节点必须关闭防火墙和SELinux,命令参考 systemctl stop firewalld && systemctl disable firewalld,否则服务间通信会被拦截。
  3. 资源配置:所有节点最低1核2G,但ELK节点(ES+Logstash)建议给2核4G以上------ES对内存敏感,内存不够会频繁崩溃。
  4. Kibana位置:文档把Kibana装在Nginx节点,而非ELK节点,是因为ES+Logstash已占较多资源,避免单节点压力过大。

二、核心服务部署:一步一验证,避免返工

2.1 MySQL部署:从安装到数据导入(重点是密码和日志)

MySQL是业务核心,需确保数据能正常导入、密码符合微服务要求。

  1. 安装MySQL服务:MySQL编译安装

  2. 修改初始密码(先改强密码,再改微服务用的弱密码):

    bash 复制代码
    # 微服务用的密码(123456,微服务配置里写死了这个密码)
    CREATE USER 'root'@'%' IDENTIFIED BY '123456';
    GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
    FLUSH PRIVILEGES;
  3. 配置日志和密码策略,编辑 /etc/my.cnf,新增以下内容(开启慢查询日志):

    ini 复制代码
    #[mysqld]下面添加
    log_error = /var/log/mysql/mysql_error.log  # 错误日志路径
    slow_query_log = ON           # 开启慢查询日志
    slow_query_log_file = /var/log/mysql/mysql_slow.log  # 慢查询日志路径
    long_query_time = 2           # 2秒以上算慢查询
    log_queries_not_using_indexes = ON  # 记录未用索引的查询
    ==================================================================================
    log_error = /usr/local/mysql/mysql_error.log  
    slow_query_log = ON         
    slow_query_log_file =/usr/local/mysql/mysql_slow.log  
    long_query_time = 2          
    log_queries_not_using_indexes = ON
    
    # 重启生效
    systemctl restart mysqld
  4. 导入业务SQL并验证

    bash 复制代码
    # 导入SQL(确保yl_app.sql在/opt目录)
    mysql -uroot -p123 < /opt/yl_app.sql
    # 验证:登录后查看表是否存在
    mysql -uroot -p123 -e "use yl_app; show tables;"

正常会显示23张表(如mv_devices、sys_user、tbl_device_info等),说明MySQL部署成功。

2.2 Redis部署:关键是允许远程访问

Redis用于微服务缓存,默认只允许本地访问,需修改配置开启远程连接。

步骤1:上传并安装
bash 复制代码
# 上传redis-5.0.7.tar.gz到/opt,解压
tar zxvf redis-5.0.7.tar.gz -C /opt/
cd /opt/redis-5.0.7/
# 编译安装(需先装gcc:yum install -y gcc)
make && make PREFIX=/usr/local/redis install
# 执行脚本配置服务(一路回车,最后手动改可执行路径)
cd /opt/redis-5.0.7/utils
./install_server.sh
# 提示"Enter the redis-server executable path"时,输入:/usr/local/redis/bin/redis-server
# 创建符号链接,方便调用
ln -s /usr/local/redis/bin/* /usr/local/bin/
步骤2:修改配置(允许远程访问)

编辑 /etc/redis/6379.conf(Redis默认配置文件):

ini 复制代码
# 第70行:绑定所有地址(默认只绑127.0.0.1)
bind 0.0.0.0
# 第89行:关闭保护模式(否则远程无法连接)
protected-mode no

/etc/init.d/redis_6379 restart
netstat -antp|grep redis

2.3 Java节点:启动微服务(注意内存配置)

Java节点运行后端微服务Jar包,需先装JDK,再配置启动参数。
注意:必须先启动MySQL和redis,否则会报错

步骤1:安装JDK
bash 复制代码
# 用yum装openjdk(版本1.8以上即可)
yum install -y java-1.8.0-openjdk
# 验证:java -version 显示1.8.x即正常
步骤2:启动微服务
  1. yl_application-1.0-SNAPSHOT.jar 传到Java节点的 /opt 目录;

  2. 用nohup后台启动(设置内存:初始512M,最大2G):

    bash 复制代码
    nohup java -Xms512m -Xmx2g -jar yl_application-1.0-SNAPSHOT.jar &
    java -jar yl_application-1.0-SNAPSHOT.jar    #便捷测试,执行情况输出到终端。
  3. 查看日志,确认启动成功:

    bash 复制代码
    # 日志在/opt/logs目录,文件名如yulin-2025-09-30.0.log
    tail -f /opt/logs/yulin-2025-09-30.0.log

    看到"Started Application in XX seconds"说明微服务启动成功。

2.4 Nginx部署:前端访问+反向代理(避坑重点)

Nginx负责转发前端请求到Java微服务,还需要部署前端静态文件。

步骤1:安装依赖和Nginx
bash 复制代码
# 装编译依赖
yum install -y gcc gcc-c++ make pcre pcre-devel zlib zlib-devel openssl openssl-devel unzip
# 创建nginx用户(无登录权限)
useradd -M -s /sbin/nologin nginx
# 上传nginx-1.20.2.tar.gz到/opt,解压编译
cd /opt
tar zxvf nginx-1.20.2.tar.gz -C /opt/
cd nginx-1.20.2/
# 配置编译参数(指定安装路径、用户、启用SSL和状态模块)
./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module \
--with-http_ssl_module
# 编译安装
make && make install
# 创建符号链接,方便调用
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
步骤2:配置Nginx系统服务

创建 /lib/systemd/system/nginx.service 文件,方便用systemctl管理:

ini 复制代码
[Unit]
Description=nginx
After=network.target

[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target

设置权限并启动:

bash 复制代码
chmod 754 /lib/systemd/system/nginx.service
systemctl daemon-reload
systemctl start nginx.service
systemctl enable nginx.service  # 开机自启
步骤3:部署前端文件

把前端压缩包 dist.zip 传到Nginx节点的 /opt,解压到Nginx的html目录:

bash 复制代码
unzip /opt/dist.zip -d /usr/local/nginx/html
步骤4:修改Nginx配置(反向代理到微服务)

先备份原配置,再修改:

bash 复制代码
cp /usr/local/nginx/conf/nginx.conf /usr/local/nginx/conf/nginx.conf.bak
vim /usr/local/nginx/conf/nginx.conf

找到 server 块,替换为以下内容(重点是 /ylApp 路径转发):

ini 复制代码
server {
    listen 80;
    server_name 172.16.0.10;  # Nginx节点IP
    charset utf-8;
    index index.html index.htm;
    root /usr/local/nginx/html/dist;  # 前端文件路径

    # 反向代理到Java微服务(微服务端口8090)
    location /ylApp {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_set_header X-NginX-Proxy true;
        proxy_pass http://172.16.0.11:8090;  # Java节点IP+微服务端口(填写自己的微服务也就是jar包地址)
        proxy_redirect off;
    }

    # 错误页面
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        root html;
    }
}
步骤5:测试访问

重启Nginx:systemctl restart nginx,然后用浏览器访问 http://172.16.0.10,能看到登录页(默认账号可能是admin,密码123456,具体看业务配置),说明Nginx部署成功。

三、ELK日志体系:从收集到可视化(最复杂但最有用)

ELK负责收集MySQL、Nginx、Java的日志,方便问题排查。体系分工:

  • Filebeat:在各节点收集日志(MySQL、Nginx、Java节点);
  • Logstash:在ELK节点处理日志(过滤、格式化);
  • ES:存储日志数据;
  • Kibana:可视化查看日志。

3.1 先明确ELK相关规划

3.1.1 节点服务分工
节点名称 IP地址 日志相关服务
elk 172.16.0.13 ES(存储)+ Logstash(处理)
mysql 172.16.0.100 Filebeat(收集MySQL日志)
nginx 172.16.0.10 Filebeat(收集Nginx日志)+ Kibana(可视化)
java 172.16.0.11 Filebeat(收集Java日志)
3.1.2 Filebeat端口规划(避免冲突)
节点名称 Filebeat输出端口 对应Logstash输入端口
mysql 6000 6000
nginx 6001 6001
java 6002 6002

3.2 ELK节点(172.16.0.13):部署ES和Logstash

3.2.1 安装ES(Elasticsearch)
  1. 装JDK(ES依赖Java):yum install -y java-1.8.0-openjdk

  2. 上传 elasticsearch-6.6.1.rpm/opt,安装:

    bash 复制代码
    cd /opt
    rpm -ivh elasticsearch-6.6.1.rpm
  3. 修改ES配置(/etc/elasticsearch/elasticsearch.yml):

    yaml 复制代码
    # 23行:节点名
    node.name: node1
    # 33行:数据存储路径(需手动创建)
    path.data: /data/elk_data
    # 37行:日志路径
    path.logs: /var/log/elasticsearch
    # 43行:不锁定内存(避免内存不足报错)
    bootstrap.memory_lock: false
    # 55行:监听所有地址(允许远程访问)
    network.host: 0.0.0.0
    # 59行:ES端口(默认9200)
    http.port: 9200
  4. 创建数据目录并授权:

    bash 复制代码
    mkdir -p /data/elk_data
    chown elasticsearch:elasticsearch /data/elk_data/
  5. 启动ES并验证:

    bash 复制代码
    systemctl enable elasticsearch.service
    systemctl start elasticsearch.service
    # ES启动较慢,等30秒后验证:
    curl http://172.16.0.13:9200

看到包含"name: node1"和"version"的JSON输出,说明ES启动成功。一般初次启动需要等待一段时间。

3.2.2 安装Logstash
  1. 上传 logstash-6.6.1.rpm/opt,安装:

    bash 复制代码
    cd /opt
    rpm -ivh logstash-6.6.1.rpm
    systemctl enable logstash.service
    systemctl start logstash.service
    # 创建符号链接
    ln -s /usr/share/logstash/bin/logstash /usr/local/bin/
  2. 测试Logstash是否正常:

    bash 复制代码
    logstash -e 'input { stdin{} } output { stdout{} }'

    输入 www.baidu.com,能看到包含"message: www.baidu.com"的日志输出,说明Logstash正常。

3.3 Nginx节点部署Kibana

Kibana是ES的可视化工具,装在Nginx节点(172.16.0.10)。

  1. 上传 kibana-6.6.1-x86_64.rpm/opt,安装:

    bash 复制代码
    cd /opt
    rpm -ivh kibana-6.6.1-x86_64.rpm
  2. 修改Kibana配置(/etc/kibana/kibana.yml):

    yaml 复制代码
    # 2行:Kibana端口(默认5601)
    server.port: 5601
    # 7行:监听所有地址
    server.host: "0.0.0.0"
    # 28行:连接ES的地址
    elasticsearch.hosts: ["http://172.16.0.13:9200"]
    # 37行:ES中的Kibana索引
    kibana.index: ".kibana"
  3. 启动Kibana并验证:

    bash 复制代码
    systemctl enable kibana.service
    systemctl start kibana.service

    浏览器访问 http://172.16.0.10:5601,能看到Kibana首页,说明部署成功。

3.4 各节点配置Filebeat(收集日志)

Filebeat的作用是"抓日志",每个节点的配置逻辑类似:指定日志路径→添加字段标识→输出到Logstash。

以MySQL节点(172.16.0.100)为例:

  1. 安装Filebeat:

    bash 复制代码
    # 上传filebeat-6.6.1-x86_64.rpm到/opt
    cd /opt
    rpm -ivh filebeat-6.6.1-x86_64.rpm
  2. 修改Filebeat配置(/etc/filebeat/filebeat.yml):

    yaml 复制代码
    # 1. 配置日志输入(收集MySQL的错误日志和慢查询日志)
    filebeat.inputs:
    - type: log
      enabled: true
      paths:
        - /usr/local/mysql/mysql_error.log  # MySQL错误日志路径
      fields:
        service_name: mysql_error_log    # 字段标识(用于ES索引名)
        log_type: mysql_error
      fields_under_root: true  # 字段置顶,方便Logstash处理
    - type: log
      enabled: true
      paths:
        - /usr/local/mysql/mysql_slow.log  # MySQL慢查询日志路径
      fields:
        service_name: mysql_slow_log
        log_type: mysql_slow
      fields_under_root: true
    
    # 2. 注释掉Elasticsearch输出(不用直接连ES,走Logstash)
    # ------------------------------Elasticsearch output------------------------------
    # output.elasticsearch:
    #   hosts: ["localhost:9200"]
    
    # 3. 配置Logstash输出(指向ELK节点的6000端口)
    #------------------------------Logstash output------------------------------
    output.logstash:
      hosts: ["172.16.0.13:6000"]  # ELK节点IP+MySQL对应的端口
  3. 启动Filebeat并验证:

    bash 复制代码
    # 前台启动(测试用,确认无报错)
    filebeat -e -c /etc/filebeat/filebeat.yml
    # 无报错后,后台启动:nohup filebeat -e -c /etc/filebeat/filebeat.yml &(可选)
    systemctl restart filebeat

Nginx节点和Java节点的Filebeat配置类似:

  • Nginx节点 :收集 /usr/local/nginx/logs/access.logerror.log,fields标识为 nginx_access_log/nginx_error_log,输出到ELK节点的6001端口;
bash 复制代码
filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /usr/local/nginx/logs/access.log
  fields:
    service_name: nginx_access_log    # 字段标识(用于ES索引名)
    log_type: nginx_access
  fields_under_root: true  # 字段置顶,方便Logstash处理
- type: log
  enabled: true
  paths:
    - /usr/local/nginx/logs/error.log
  fields:
    service_name: nginx_error_log
    log_type: nginx_error
  fields_under_root: true

# 3. 配置Logstash输出(指向ELK节点的6000端口)
#------------------------------Logstash output------------------------------
output.logstash:
  hosts: ["172.16.0.13:6001"]  # ELK节点IP+nginx对应的端口
  • Java节点 :收集 /opt/logs/yulin-*.log(微服务日志),fields标识为 yulin_log,输出到ELK节点的6002端口。
bash 复制代码
filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /opt/logs/yulin-*.log     
  fields:
    service_name: yulin_log    # 字段标识(用于ES索引名)
    log_type: yulin
  fields_under_root: true

# 3. 配置Logstash输出(指向ELK节点的6000端口)
#------------------------------Logstash output------------------------------
output.logstash:
  hosts: ["172.16.0.13:6002"]  # ELK节点IP+微服务对应的端口

3.5 Logstash配置(处理日志并输出到ES)

在ELK节点(172.16.0.13),为每个Filebeat创建对应的Logstash配置文件,实现"端口监听→日志处理→输出到ES"。

以MySQL日志为例(创建mysql_log.conf):

  1. 创建配置文件:

    bash 复制代码
    cd /etc/logstash/conf.d
    vim mysql_log.conf
    vim nginx_log.conf
    vim java_log.conf
  2. 写入以下内容:

    ruby 复制代码
    # 输入:监听6000端口(对应MySQL的Filebeat)
    input {
      beats {
        port => "6000"
      }
    }
    
    # 输出:到ES,索引名包含服务名和日期(如mysql_error_log-2025.09.30)
    output {
      elasticsearch {
        hosts => ["http://172.16.0.13:9200"]  # ES节点地址
        index => "%{service_name}-%{+YYYY.MM.dd}"  # 索引名(用Filebeat的service_name字段)
      }
    }

同理,创建Nginx和Java的Logstash配置:

  • vim nginx_log.conf:监听6001端口,索引名 %{service_name}-%{+YYYY.MM.dd}
bash 复制代码
# 输入:监听6000端口(对应nginx的Filebeat)
input {
  beats {
    port => "6001"
  }
}

# 输出:到ES。
output {
  elasticsearch {
    hosts => ["http://172.16.0.13:9200"]  # ES节点地址
    index => "%{service_name}-%{+YYYY.MM.dd}"  # 索引名(用Filebeat的service_name字段)
  }
}
  • vim java_log.conf:监听6002端口,索引名 %{service_name}-%{+YYYY.MM.dd}
bash 复制代码
# 输入:监听6000端口(对应微服务的Filebeat)
input {
  beats {
    port => "6002"
  }
}

# 输出:到ES。
output {
  elasticsearch {
    hosts => ["http://172.16.0.13:9200"]  # ES节点地址
    index => "%{service_name}-%{+YYYY.MM.dd}"  # 索引名(用Filebeat的service_name字段)
  }
}

配置Logstash多管道(管理多个配置文件)

编辑 vim /etc/logstash/pipelines.yml,添加多管道配置(替换默认内容):

yaml 复制代码
- pipeline.id: mysql_log
  path.config: "/etc/logstash/conf.d/mysql_log.conf"
- pipeline.id: nginx_log
  path.config: "/etc/logstash/conf.d/nginx_log.conf"
- pipeline.id: java_log
  path.config: "/etc/logstash/conf.d/java_log.conf"

先启动所有服务器的filebeat和elasticsearch ,再启动Logstash:systemctl restart logstash.service

3.6 验证日志收集

  1. 在各节点添加测试日志:(可选)

    bash 复制代码
    # MySQL节点:添加测试日志到错误日志
    echo "=== MySQL Test Log $(date) ===" >> /var/log/mysql/mysql_error.log
    # Nginx节点:添加测试日志到访问日志
    echo "=== Nginx Test Log $(date) ===" >> /usr/local/nginx/logs/access.log
    # Java节点:添加测试日志到微服务日志
    echo "=== Java Test Log $(date) ===" >> /opt/logs/yulin-2025-09-30.0.log
  2. 到Kibana查看:

    • 访问 http://172.16.0.10:5601,进入「Index Management」;
    • 能看到 mysql_error_log-2025.09.30nginx_access_log-2025.09.30yulin_log-2025.09.30 等索引,说明日志收集成功。

四、常见问题排查:3个实用技巧

部署中遇到问题,别慌,用以下方法快速定位:

4.1 验证Filebeat是否能连Logstash

bash 复制代码
# 在Filebeat节点执行(测试输出连接)
filebeat test output -c /etc/filebeat/filebeat.yml

看到"talk to server... OK"说明连接正常,否则检查Logstash端口是否开放、IP是否写错。

4.2 校验Logstash配置语法

bash 复制代码
# 在ELK节点执行(检查配置文件语法)
logstash -t -f /etc/logstash/conf.d/mysql_log.conf

输出"Config Validation Result: OK"说明语法正确,否则根据报错修改(比如括号不匹配、字段写错)。

4.3 查看Logstash管道日志

多管道配置后,日志会包含管道ID,方便定位:

bash 复制代码
# 查看MySQL管道的日志
grep "\[mysql_log\]" /var/log/logstash/logstash-plain.log
# 查看Nginx管道的日志
grep "\[nginx_log\]" /var/log/logstash/logstash-plain.log

五、部署总结

这套设备管理平台的部署核心是"按节点分工,按步骤验证",重点记住3点:

  1. IP和端口不能乱改:MySQL和Redis的IP、Filebeat与Logstash的端口对应,改了会断连;
  2. 配置必备份:修改MySQL、Nginx、ELK的配置前,先备份原文件,方便回滚;
  3. 每步必验证:安装完一个服务就验证(比如MySQL导入SQL后看表、ES访问9200端口),避免到最后才发现问题,排查难度大。
相关推荐
二哈喇子!5 小时前
SpringBoot项目右上角选择ProjectNameApplication的配置
java·spring boot
二哈喇子!5 小时前
基于Spring Boot框架的车库停车管理系统的设计与实现
java·spring boot·后端·计算机毕业设计
二哈喇子!5 小时前
基于SpringBoot框架的水之森海底世界游玩系统
spring boot·旅游
二哈喇子!5 小时前
Java框架精品项目【用于个人学习】
java·spring boot·学习
二哈喇子!6 小时前
基于SpringBoot框架的网上购书系统的设计与实现
java·大数据·spring boot
chinesegf6 小时前
ubuntu中虚拟环境的简单创建和管理
linux·运维·ubuntu
曾经的三心草6 小时前
redis-2-数据结构内部编码-单线程-String命令
数据结构·数据库·redis
java_logo6 小时前
2025 年 11 月最新 Docker 镜像源加速列表与使用指南
linux·运维·docker·容器·运维开发·kylin
二哈喇子!7 小时前
基于JavaSE的淘宝卖鞋后端管理系统的设计与实现
java·spring boot·spring
Coder_Boy_7 小时前
基于SpringAI的在线考试系统-智能考试系统-学习分析模块
java·开发语言·数据库·spring boot·ddd·tdd