文章目录
- 设备管理平台部署全流程:从环境搭建到ELK日志集成(附避坑指南)
-
- 一、先搞懂环境规划:这些"红线"不能碰
- 二、核心服务部署:一步一验证,避免返工
-
- [2.1 MySQL部署:从安装到数据导入(重点是密码和日志)](#2.1 MySQL部署:从安装到数据导入(重点是密码和日志))
- [2.2 Redis部署:关键是允许远程访问](#2.2 Redis部署:关键是允许远程访问)
- [2.3 Java节点:启动微服务(注意内存配置)](#2.3 Java节点:启动微服务(注意内存配置))
- [2.4 Nginx部署:前端访问+反向代理(避坑重点)](#2.4 Nginx部署:前端访问+反向代理(避坑重点))
- 三、ELK日志体系:从收集到可视化(最复杂但最有用)
-
- [3.1 先明确ELK相关规划](#3.1 先明确ELK相关规划)
-
- [3.1.1 节点服务分工](#3.1.1 节点服务分工)
- [3.1.2 Filebeat端口规划(避免冲突)](#3.1.2 Filebeat端口规划(避免冲突))
- [3.2 ELK节点(172.16.0.13):部署ES和Logstash](#3.2 ELK节点(172.16.0.13):部署ES和Logstash)
-
- [3.2.1 安装ES(Elasticsearch)](#3.2.1 安装ES(Elasticsearch))
- [3.2.2 安装Logstash](#3.2.2 安装Logstash)
- [3.3 Nginx节点部署Kibana](#3.3 Nginx节点部署Kibana)
- [3.4 各节点配置Filebeat(收集日志)](#3.4 各节点配置Filebeat(收集日志))
- [3.5 Logstash配置(处理日志并输出到ES)](#3.5 Logstash配置(处理日志并输出到ES))
- [3.6 验证日志收集](#3.6 验证日志收集)
- 四、常见问题排查:3个实用技巧
-
- [4.1 验证Filebeat是否能连Logstash](#4.1 验证Filebeat是否能连Logstash)
- [4.2 校验Logstash配置语法](#4.2 校验Logstash配置语法)
- [4.3 查看Logstash管道日志](#4.3 查看Logstash管道日志)
- 五、部署总结
设备管理平台部署全流程:从环境搭建到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 | 日志存储和处理(资源要求高) |
【必看避坑点】
- IP限制:MySQL(172.16.0.100)和Redis(172.16.0.12)的IP绝对不能改!微服务和前端配置里硬编码了这两个地址,改了会直接连接失败。
- 防火墙关闭 :所有节点必须关闭防火墙和SELinux,命令参考
systemctl stop firewalld && systemctl disable firewalld
,否则服务间通信会被拦截。 - 资源配置:所有节点最低1核2G,但ELK节点(ES+Logstash)建议给2核4G以上------ES对内存敏感,内存不够会频繁崩溃。
- Kibana位置:文档把Kibana装在Nginx节点,而非ELK节点,是因为ES+Logstash已占较多资源,避免单节点压力过大。
二、核心服务部署:一步一验证,避免返工
2.1 MySQL部署:从安装到数据导入(重点是密码和日志)
MySQL是业务核心,需确保数据能正常导入、密码符合微服务要求。
-
安装MySQL服务:MySQL编译安装
-
修改初始密码(先改强密码,再改微服务用的弱密码):
bash# 微服务用的密码(123456,微服务配置里写死了这个密码) CREATE USER 'root'@'%' IDENTIFIED BY '123456'; GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION; FLUSH PRIVILEGES;
-
配置日志和密码策略,编辑
/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
-
导入业务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:启动微服务
-
把
yl_application-1.0-SNAPSHOT.jar
传到Java节点的/opt
目录; -
用nohup后台启动(设置内存:初始512M,最大2G):
bashnohup java -Xms512m -Xmx2g -jar yl_application-1.0-SNAPSHOT.jar & java -jar yl_application-1.0-SNAPSHOT.jar #便捷测试,执行情况输出到终端。
-
查看日志,确认启动成功:
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)
-
装JDK(ES依赖Java):
yum install -y java-1.8.0-openjdk
; -
上传
elasticsearch-6.6.1.rpm
到/opt
,安装:bashcd /opt rpm -ivh elasticsearch-6.6.1.rpm
-
修改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
-
创建数据目录并授权:
bashmkdir -p /data/elk_data chown elasticsearch:elasticsearch /data/elk_data/
-
启动ES并验证:
bashsystemctl 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
-
上传
logstash-6.6.1.rpm
到/opt
,安装:bashcd /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/
-
测试Logstash是否正常:
bashlogstash -e 'input { stdin{} } output { stdout{} }'
输入
www.baidu.com
,能看到包含"message: www.baidu.com"的日志输出,说明Logstash正常。
3.3 Nginx节点部署Kibana
Kibana是ES的可视化工具,装在Nginx节点(172.16.0.10)。
-
上传
kibana-6.6.1-x86_64.rpm
到/opt
,安装:bashcd /opt rpm -ivh kibana-6.6.1-x86_64.rpm
-
修改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"
-
启动Kibana并验证:
bashsystemctl enable kibana.service systemctl start kibana.service
浏览器访问
http://172.16.0.10:5601
,能看到Kibana首页,说明部署成功。
3.4 各节点配置Filebeat(收集日志)
Filebeat的作用是"抓日志",每个节点的配置逻辑类似:指定日志路径→添加字段标识→输出到Logstash。
以MySQL节点(172.16.0.100)为例:
-
安装Filebeat:
bash# 上传filebeat-6.6.1-x86_64.rpm到/opt cd /opt rpm -ivh filebeat-6.6.1-x86_64.rpm
-
修改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对应的端口
-
启动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.log
和error.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):
-
创建配置文件:
bashcd /etc/logstash/conf.d vim mysql_log.conf vim nginx_log.conf vim java_log.conf
-
写入以下内容:
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 验证日志收集
-
在各节点添加测试日志:(可选)
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
-
到Kibana查看:
- 访问
http://172.16.0.10:5601
,进入「Index Management」; - 能看到
mysql_error_log-2025.09.30
、nginx_access_log-2025.09.30
、yulin_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点:
- IP和端口不能乱改:MySQL和Redis的IP、Filebeat与Logstash的端口对应,改了会断连;
- 配置必备份:修改MySQL、Nginx、ELK的配置前,先备份原文件,方便回滚;
- 每步必验证:安装完一个服务就验证(比如MySQL导入SQL后看表、ES访问9200端口),避免到最后才发现问题,排查难度大。