Skip to content

Nacos 排错

Nacos 排错要先把现象切开。"Nacos 出问题了"其实可能落到控制台打不开、节点不入集群、配置读不到、配置发布失败、服务实例掉线、客户端鉴权失败——六类问题的排查路径完全不同。

可以按"控制面"和"业务面"两个清单划分:控制面看控制台能不能登录、集群节点是不是 UP、数据库有没有写进配置;业务面看客户端能不能注册、能不能读到配置、能不能发现实例。

一、控制台打不开

Nacos 3.x 控制台地址是 http://192.168.10.11:8080/next/,先确认访问的不是 8848

bash
systemctl status nacos --no-pager
ss -lntp | egrep ':(8080|8848)\b'
journalctl -u nacos -n 100 --no-pager
现象方向
8080 根本不监听Nacos 没启动成功,或启动中途退出——看日志
8848 能通但提示去 8080访问了 API 端口,不是控制台
登录后空白前端资源加载失败、浏览器缓存、服务端响应异常
初始化密码页反复出现数据库没存上用户信息,MySQL 连接异常

二、启动失败

两个日志源都要看:Nacos 自己的 start.out / nacos.log,和 systemd 的 journalctl

bash
tail -n 200 /opt/nacos/logs/start.out
tail -n 200 /opt/nacos/logs/nacos.log
journalctl -u nacos -n 200 --no-pager
报错方向处理
Java 版本不符合安装 Java 17+,JAVA_HOME 在 systemd unit 里显式指定
MySQL 连接失败检查 db.url.0 的地址、端口、账号密码、3306 可达性
表不存在没有导入 Nacos 对应版本的 MySQL schema 脚本
鉴权配置缺失补齐 identity.key/valuetoken.secret.key
内存不足调低 CUSTOM_NACOS_MEMORY,确认机器剩余内存

Nacos 3.x 对鉴权配置的检查比旧版严格。只在文件末尾追加同名配置可能绕不过启动脚本的检查——脚本读到原始的默认空值直接报错。在原配置项位置填入有效值更可靠。

三、节点不入集群

集群管理页面只有本机节点时,三台机器的 cluster.conf 和通信端口要放在一起对比:

bash
# 每台都要确认
cat /opt/nacos/conf/cluster.conf

# 从一台测试到其他节点的端口连通性
nc -vz 192.168.10.12 8848
nc -vz 192.168.10.12 9848
nc -vz 192.168.10.12 9849
nc -vz 192.168.10.12 7848

常见原因:

现象方向
只看到本机cluster.conf 不一致或节点间端口不通
某台反复重启JVM 参数、MySQL 连接、配置解析错误
版本不一致软链接指向不同版本目录
节点 IP 显示异常多网卡环境下识别了错误的网卡地址

四、配置发布失败

发布失败时看控制台提示、Nacos 日志和 MySQL 三方面:

bash
# 先确认鉴权接口可用
curl -sS -X POST 'http://127.0.0.1:8848/nacos/v3/auth/user/login' \
  -d 'username=nacos&password=nacos'

# 确认 MySQL 配置表能读写
mysql -unacos -pNacos@123456 -h192.168.10.11 nacos_config \
  -e "select data_id, group_id, tenant_id from config_info limit 5;"
现象方向
403 / 鉴权失败Token 过期、账号密码错、鉴权参数三节点不一致
发布后列表没有namespace/group/dataId 三段的某一环和查询条件对不上
MySQL 报错schema 版本和 Nacos 版本不匹配、账号权限不足
内容保存成功但应用解析失败配置格式本身有问题(YAML 缩进、特殊字符)

配置发布后如果接口异常,历史版本能快速对比修改前后差异。

五、配置不生效——三步定位

先用 API 直接读配置,排除"Nacos 里就没有"的可能:

bash
curl -sS \
  'http://192.168.10.11:8848/nacos/v3/client/cs/config?dataId=ops-demo.yaml&groupName=DEFAULT_GROUP&namespaceId=&username=nacos&password=nacos'

然后从应用所在机器用同样的命令测。应用机器能不能访问 Nacos 比在 Nacos 本机测试更关键。

现象方向
API 读不到配置没发布,或 namespace/group/dataId 不一致
API 能读到,应用读不到应用连错了 Nacos 地址、namespace 配置不对、账号密码错
启动时能读到,运行中不变应用没开动态刷新或业务代码没监听配置变更
部分实例变了不同实例的启动参数或 Nacos 客户端配置不一致

六、服务注册不上

服务端用 API 快速验证注册能力是否正常:

bash
curl -sS -X POST 'http://127.0.0.1:8848/nacos/v3/client/ns/instance' \
  -d 'serviceName=ops-demo-service' \
  -d 'groupName=DEFAULT_GROUP' \
  -d 'ip=192.168.10.13' \
  -d 'port=18080' \
  -d 'username=nacos' \
  -d 'password=nacos'

手工注册正常而业务应用注册不上,说明问题在应用侧。

现象方向
服务名为空应用配置里没写服务名
注册到错误 namespace环境配置不一致
连接超时应用到 Nacos 的 8848/9848 不通
403账号密码错、Token 过期、权限不够
注册后马上消失临时实例心跳维持不了——网络、gRPC 连接、应用进程状态

七、实例掉线或不健康

临时实例掉线直接和心跳关联。可能原因:应用进程停了、JVM GC 长暂停导致心跳没发出去、网络抖动、Nacos gRPC 连接中断。

检查层次:

看什么
应用进程进程在不在、端口在不在监听
应用日志Nacos 心跳日志、重连日志、鉴权错误
网络应用到 Nacos 的 8848/9848 是否持续可达
控制台实例的健康状态、IP、端口、分组
Nacos 日志naming、remote、auth 相关模块的异常

如果只是某一批实例同时掉线,优先看它们是否在同一台宿主机、同一个网段、同一批发布版本。全部实例同时异常再考虑 Nacos 集群、数据库或入口负载均衡的问题。

八、鉴权异常

鉴权异常常见于升级、重启或改配置后。三节点的鉴权参数必须完全一致——identity.keyidentity.valuetoken.secret.key 任何一项不同,A 节点签发的 Token 到 B 节点可能校验失败。

验证登录链路:

bash
curl -sS -X POST 'http://127.0.0.1:8848/nacos/v3/auth/user/login' \
  -d 'username=nacos&password=nacos'

能返回 accessToken 说明登录链路通了。后续 API 仍然 403 时,确认请求是否带了 Token 以及接口路径是否为当前版本支持的路径(Nacos 3.x 的新 /v3 接口和旧 /v1 接口返回可能不一样)。

九、复盘记录

故障复盘保留:

信息说明
影响范围控制台不可用 / 配置发布失败 / 服务发现异常——各自影响范围不同
时间线开始时间、发现时间、恢复时间
版本和节点Nacos 版本、异常节点 IP、单节点还是全集群
配置变更最近改过的 application.properties、配置项、权限变更
现场证据控制台截图、日志片段、API 返回、端口检查结果
恢复动作回滚什么配置、重启哪些节点、修了哪个数据库连接、切了哪条网络规则