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端口),避免到最后才发现问题,排查难度大。
相关推荐
深色風信子9 小时前
SpringBoot 集成 LangChain4j 本地调用 Ollama
java·spring boot·spring·ollama·langchain4j
HappyGame029 小时前
Linux网络编程(上)
linux·网络
Janspran10 小时前
监控系统3 - LVGL
linux
Nimsolax11 小时前
Linux网络Socket编程TCP
linux·网络·tcp/ip
心态特好15 小时前
详解redis,MySQL,mongodb以及各自使用场景
redis·mysql·mongodb
青草地溪水旁17 小时前
linux信号(14)——SIGALRM:从“手机闹钟”看SIGALRM:进程的非阻塞定时神器
linux·信号机制
不良人天码星17 小时前
redis-zset数据类型的常见指令(sorted set)
数据库·redis·缓存
心灵宝贝17 小时前
libopenssl-1_0_0-devel-1.0.2p RPM 包安装教程(openSUSE/SLES x86_64)
linux·服务器·数据库
BullSmall19 小时前
linux zgrep命令介绍
linux·运维