Appearance
Nacos 部署
部署 Nacos 不只是把压缩包解压然后启动——它涉及 Java 运行环境、集群文件、MySQL 数据库、systemd 托管、鉴权配置,以及 Nacos 3.x 控制台端口和 API 端口分离造成的新入口差异。
一、部署拓扑
实验环境使用三台机器组成 Nacos 集群:
| 主机 | 角色 | 说明 |
|---|---|---|
192.168.10.11 | Nacos 节点 + MySQL | 控制台入口也放这里 |
192.168.10.12 | Nacos 节点 | 纯 Nacos,连接同一 MySQL |
192.168.10.13 | Nacos 节点 | 纯 Nacos,连接同一 MySQL |
实验里 MySQL 放在同一台机器上是为了节省机器。生产环境中 MySQL 需要独立高可用——Nacos 服务层三节点正常但数据库单点故障,配置发布、历史版本、用户权限这些操作全会受影响。
二、端口——Nacos 3.x 的关键变化
Nacos 3.2.1 用到的端口:
| 端口 | 用途 | 谁需要访问 |
|---|---|---|
8080 | 新版控制台 | 运维人员浏览器 |
8848 | HTTP API,客户端注册和配置读写 | 业务应用、集群文件里的地址 |
9848 | 客户端 gRPC 通信 | 业务应用 |
9849 | 服务端 gRPC 通信 | Nacos 节点之间 |
7848 | 集群一致性(Raft)通信 | Nacos 节点之间 |
3306 | MySQL | 所有 Nacos 节点 |
Nacos 2.x 的旧资料通常直接访问 8848/nacos 登录控制台。Nacos 3.x 把控制台改到了 8080/next/,8848 更偏服务端 API。访问 8848 会看到提示说控制台在 8080。
防火墙只放 8080 的话控制台能打开,但业务应用连不上 8848 和 9848——注册和配置读取都会失败。
三、安装 Java 17
Nacos 3.x 要求 Java 17+。Rocky Linux 9:
bash
dnf install -y java-17-openjdk java-17-openjdk-devel
java -version # 确认输出里有 17如果机器上有多个 Java 版本,用 JAVA_HOME 环境变量在 systemd unit 里显式指定,避免启动脚本拿到旧版本。
四、准备 MySQL
sql
CREATE DATABASE nacos_config DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'nacos'@'%' IDENTIFIED BY 'Nacos@123456';
GRANT ALL PRIVILEGES ON nacos_config.* TO 'nacos'@'%';
FLUSH PRIVILEGES;然后导入 Nacos 安装包自带的 MySQL schema 脚本。导入后确认核心表存在:
sql
USE nacos_config;
SHOW TABLES; -- config_info、his_config_info、users 等配置内容存在 config_info 表,历史版本存在 his_config_info 表,用户和权限也在数据库里。集群模式下 MySQL 不是可选组件——三台 Nacos 共享同一 MySQL,看到的才是同一套配置和权限。
五、解压和目录规划
三台机器保持一致的目录结构:
bash
mkdir -p /opt
tar xf nacos-server-3.2.1.tar.gz -C /opt
ln -sfn /opt/nacos-3.2.1 /opt/nacos # 软链接便于后续升级切换关键目录:
| 路径 | 用途 |
|---|---|
/opt/nacos/bin | 启停脚本 |
/opt/nacos/conf | 配置文件、cluster.conf |
/opt/nacos/logs | 运行日志 |
/opt/nacos/data | 本地数据目录 |
用软链接指向实际版本目录的好处:升级时解压新版本到 /opt/nacos-3.x.x,切换软链接指向新目录,保留旧版本备用。排错时 readlink -f /opt/nacos 一眼就能确定当前运行的是哪个版本。
六、集群文件 cluster.conf
conf/cluster.conf 写三台的 8848 API 端口地址:
text
192.168.10.11:8848
192.168.10.12:8848
192.168.10.13:8848三台机器的文件内容必须完全一致。这里写的是 8848(服务端 API 端口),不是控制台的 8080。如果某台没写进 cluster.conf,它可能自己启动但不加入集群——控制台集群管理页面看不到它,但服务端进程在跑。
七、连接 MySQL 和鉴权配置
conf/application.properties:
properties
spring.sql.init.platform=mysql
db.num=1
db.url.0=jdbc:mysql://192.168.10.11:3306/nacos_config?characterEncoding=utf8&connectTimeout=10000&socketTimeout=30000&autoReconnect=true&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
db.user.0=nacos
db.password.0=Nacos@123456鉴权相关必须配置,三台保持完全一致:
properties
nacos.core.auth.enabled=true
nacos.core.auth.server.identity.key=nacos-lab
nacos.core.auth.server.identity.value=nacos-lab-2026
nacos.core.auth.plugin.nacos.token.secret.key=TmFjb3NMYWJUb2tlblNlY3JldEtleTIwMjZGb3JOb3Rlcw==token.secret.key 需要足够长度的 Base64 字符串,三台不一致会导致 A 节点签发的 token 在 B 节点校验失败。用 sed 修改 JDBC URL 时,URL 里的 & 可能被当作 sed 替换串里的特殊字符,配置行被截断——复杂 URL 手工确认或用完整配置模板覆盖比 sed 替换更可靠。
Nacos 3.x 启动脚本对鉴权配置项的检查比旧版更严。只在文件末尾追加同名配置项可能绕不过启动脚本的检查——脚本读取到原始的默认空值就直接报错。在原配置项所在位置填入有效值更稳妥。
八、systemd 管理
ini
[Unit]
Description=Nacos Server
After=network-online.target
Wants=network-online.target
[Service]
Type=forking
User=root
Group=root
WorkingDirectory=/opt/nacos
Environment="JAVA_HOME=/usr/lib/jvm/java-17-openjdk"
Environment="CUSTOM_NACOS_MEMORY=-Xms512m -Xmx768m -Xmn256m"
ExecStart=/opt/nacos/bin/startup.sh
ExecStop=/opt/nacos/bin/shutdown.sh
Restart=on-failure
RestartSec=10
[Install]
WantedBy=multi-user.targetCUSTOM_NACOS_MEMORY 控制 JVM 堆内存,测试机内存不大时适当调低。默认 JVM 参数偏大,4G 机器上还要给 OS、MySQL 和其他服务留空间。
bash
systemctl daemon-reload
systemctl enable --now nacos
systemctl status nacos --no-pager九、初始化密码和登录
首次访问控制台 http://192.168.10.11:8080/next/ 时,会要求初始化管理员 nacos 的密码。设置后数据写入 MySQL——后续登录不再弹出初始化页面。如果初始化页面反复出现,说明数据库里没存上用户信息,通常是 MySQL 连接异常。
实验环境管理员账号:
text
用户名: nacos
密码: nacos真实环境弱密码和默认账号要尽早更换,并配合合适的 ACL 和网络隔离。
十、部署验证
端口检查:
bash
ss -lntp | egrep ':(8080|8848|9848|9849|7848)\b'鉴权接口验证:
bash
curl -sS -X POST 'http://127.0.0.1:8848/nacos/v3/auth/user/login' \
-d 'username=nacos&password=nacos'返回 accessToken 说明登录鉴权链路通了——MySQL、Nacos 服务端、鉴权模块都正常工作。
集群节点状态:控制台集群管理页面三台节点都是 UP,节点元数据里版本一致。本机端口监听正常只说明进程起来了;节点之间端口互通、cluster.conf 一致、MySQL 连接正常,才算集群部署完成。
部署验证不是"控制台能打开就行"——控制台正常代表管理入口可用,业务侧还要后续验证配置发布、配置读取、服务注册和服务发现。